Ordnen Sie Port 80 8080 zu, behalten Sie jedoch den expliziten 8080-Zugriff bei

Ich habe die Anweisungen in dieser Antwort befolgt , um Port 8080 auf meinem Mac auf 80 abzubilden. Das funktioniert wunderbar, abgesehen von der Tatsache, dass ich nicht mehr http://localhost:8080explizit über Chrome darauf zugreifen kann (es reagiert nie).

Anders ausgedrückt, ich kann einen HTTP-Server auf meinem Computer starten, der auf Port 8080 lauscht, was nach der Neuzuordnung meiner Ports funktioniert, wenn ich localhostin meinem Browser zu navigiere, aber nicht funktioniert, wenn ich zu navigiere localhost:8080.

Dies verursacht Probleme mit bestimmtem Bibliothekscode, der den Serverport explizit in seine HTTP-Anforderungen einbezieht.

Wie konfiguriere ich die Portweiterleitung so, dass sowohl localhost:8080 als auch localhostAnfragen an meinen lokalen Server senden?

Wenn Sie die Portweiterleitung deaktivieren, funktioniert die Verbindung localhost:8080wieder?
@nohillside gibt es einen Befehl, um die Portweiterleitung schnell zu deaktivieren, ohne SIP usw. auszuschalten?
/private/etc/pf.anchors/org.user.forwardingkann bei aktiviertem SIP bearbeitet werden
@nohillside - danke - ich habe die Regeln deaktiviert und localhost:8080funktioniert wieder (offensichtlich localhostnicht).
Hmm, ok, interessant :-) Ich hatte eigentlich nicht damit gerechnet pf, mich so zu verhalten.

Antworten (1)

Bevor ich Ihre Frage beantworte, lassen Sie mich einige Hintergrundinformationen für diejenigen geben, die mit der Portweiterleitung unter macOS nicht vertraut sind : Bei der Portweiterleitung werden Zieladressen und Ports eingehender Pakete ersetzt, um Verbindungen zu anderen Hosts und/oder Ports umzuleiten. macOS erreicht die Portweiterleitung durch Anwenden von rdr(Umleitungs-)Regeln auf das Paketfiltergerät /dev/pf. Zum Beispiel diese Regel:

rdr pass inet proto tcp from any to 213.32.64.5 port 80 -> 10.4.1.2 port 8080

leitet eingehende IPv4-Pakete weiter, die an gesendet werden 213.32.64.5:80( 10.4.1.2:8080das passSchlüsselwort verhindert, dass umgeleitete Pakete von Filterregeln blockiert werden, siehe hier für weitere Informationen). Um die Regel anzuwenden, können Sie, wie hierpfctl erklärt, entweder verwenden oder ändern . Weitere Informationen zu Regeln finden Sie unter ./etc/pf.confrdrman pf.conf

Nun zu deiner Frage:

Wie konfiguriere ich die Portweiterleitung so, dass sowohl localhost:8080 als auch localhost Anfragen an meinen lokalen Server senden?

Um sowohl den ursprünglichen als auch den umgeleiteten Port zuverlässig erreichen zu können , müssen Sie die Zieladresse und den Port (127.0.0.1:8080) von der Umleitung ausschließen:

echo 'no rdr inet proto tcp from 127.0.0.1 port 8080
rdr inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
' | sudo pfctl -ef -

(Getestet bei einer sauberen Installation von macOS High Sierra 10.13.6.)

Der obige Befehl überschreibt alle vorhandenen Regeln, daher würde ich ihn nur zum Testen empfehlen. Sie können dann die Standard-Paketfilterregeln Ihres Macs mit neu laden sudo pfctl -F all -ef /etc/pf.confund die Regeln hinzufügen:

no rdr inet proto tcp from 127.0.0.1 port 8080
rdr inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080

wie hierpf.conf erklärt .

Ich habe die Anweisungen in dieser Antwort befolgt , um Port 8080 auf meinem Mac auf 80 abzubilden. Dies funktioniert wunderbar, abgesehen von der Tatsache, dass ich nicht mehr explizit über Chrome auf http://localhost:8080 zugreifen kann (es antwortet nie).

Dieser Kommentar im Blog von Sal Ferrarello beschreibt ein ähnliches Verhalten. Ich konnte es reproduzieren, aber in meinen Tests funktionierte die Verbindung zu Port 8080 zeitweise, oder genauer gesagt: Ich konnte http://127.0.0.1:8080 laden , aber nach dieser ersten Verbindung kam es beim Klicken auf einen beliebigen Link auf der Website zu einer Zeitüberschreitung . Einige Zeit später konnte ich mich jedoch erneut verbinden, nur um bei allen nachfolgenden Verbindungen die gleichen Auszeiten wie zuvor zu erleben.

Ich musste einiges an Packet Sniffing machen, ich würde gerne die Befehle teilen, die ich verwendet habe, um Pakete zu protokollieren, die der rdrRegel entsprechen (dafür ist der logParameter unten da), indem ich das Pseudo-Gerät "pflog0" verwende (siehe man pflogund man pf.conffür Details ):

echo 'no rdr log inet proto tcp from 127.0.0.1 port 8080
rdr inet log proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
' | sudo pfctl -ef -
sudo ifconfig pflog0 create
sudo tcpdump -X -n -e -i pflog0
Tolle Antwort und eine funktionierende Lösung! Danke für die zusätzlichen Details - wirklich nützlich.
@EdHinchliffe Ich bin froh, dass Sie meine Antwort nützlich fanden!