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:8080
explizit ü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 localhost
in 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 localhost
Anfragen an meinen lokalen Server senden?
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:8080
das pass
Schlü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.conf
rdr
man 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.conf
und 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 rdr
Regel entsprechen (dafür ist der log
Parameter unten da), indem ich das Pseudo-Gerät "pflog0" verwende (siehe man pflog
und man pf.conf
fü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
kein Hang
localhost:8080
wieder?Ed_
kein Hang
/private/etc/pf.anchors/org.user.forwarding
kann bei aktiviertem SIP bearbeitet werdenEd_
localhost:8080
funktioniert wieder (offensichtlichlocalhost
nicht).kein Hang
pf
, mich so zu verhalten.