macOS-Paketfilter (Portweiterleitung)

Ich versuche, den ausgehenden Datenverkehr zum Zielport 80 erfolglos zum lokalen Proxy-Port 127.0.0.1:8080 umzuleiten

/etc/pf.anchors/com.forwarding

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

/etc/pf.conf

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "myproxy"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "myproxy" from "/etc/pf.anchors/com.forwarding"

Dann:

sudo sysctl net.inet.ip.forwarding=1
sudo pfctl -ef /etc/pf.conf

Der lokale Verkehr 127.0.0.1:80 wird auf 127.0.0.1:8080 umgeleitet, aber nicht der externe, der in Richtung Internet.

Für alle, die keinen Proxy von Grund auf handwerklich bauen müssen, um alle Teile zu beherrschen, gibt es dafür eine App: charlesproxy.com
Danke, aber mein Zweck ist nicht der Proxy selbst, sondern das Wichtigste ist, dass diese Regel funktioniert.
Ausgezeichnet - Ich wollte nur, dass Leute, die nach einem einfachen Proxy suchen, diese Option haben. Wissen ist mächtiges und tiefes Wissen, wenn diese Vernetzung bedeutet, dass Sie so viele andere Dinge tun können. Ich freue mich auf eine Antwort und vielleicht darauf, selbst etwas zu lernen

Antworten (1)

Sie können nur eingehenden Datenverkehr umleiten. Jeglicher ausgehender Datenverkehr zu Port 80 ist von Ihrer rdr-Regel nicht betroffen.

Um ausgehenden Datenverkehr an Port 80 umzuleiten, müssen Sie ihn zuerst an lo0 umleiten und dann an den Proxy-Port umleiten:

Die Reihenfolge in der Konfigurationsdatei ist zwangsläufig rdr eingehende Pakete , dann Pakete filtern (wie pass), aber chronologisch trifft zuerst die 2. Regel (auf en0), die dann die erste Regel (auf lo0) aktiviert.

# Step "2". redirect those same packets that were routed to lo0 below
rdr pass log on lo0 proto tcp from any to any port 80 -> 127.0.0.1 port 8080
# Step "1". Route new IPv4 TCP connections leaving en0 to lo0
pass out on en0 route-to lo0 proto tcp from en0 to any port 80 keep state

in pf.conf würde das so aussehen:

...
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr pass log on lo0 proto tcp from any to any port 80 -> 127.0.0.1 port 8080
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
pass out on en0 route-to lo0 proto tcp from en0 to any port 80 keep state

Im obigen Beispiel gehe ich davon aus, dass en0 Ihre einzige ausgehende en- Schnittstelle ist.

Entladen Sie Ihre aktuelle pf.conf und stoppen Sie pf: sudo pfctl -d. Fügen Sie dann die beiden zusätzlichen Zeilen oben hinzu. Überprüfen Sie nach dem Ändern von pf.conf die Syntax der Datei, mit sudo pfctl -vnf /etc/pf.confder die folgende Ausgabe resultieren sollte:

pfctl: Use of -f option, could result in flushing of rules
present in the main ruleset added by the system at startup.
See /etc/pf.conf for further details.

scrub-anchor "/*" all fragment reassemble
nat-anchor "/*" all
rdr-anchor "/*" all
rdr pass log on lo0 proto tcp from any to any port 80 -> 127.0.0.1 port 8080
anchor "/*" all
pass out on en0 route-to lo0 proto tcp from en0 to any port 80 flags S/SA keep state
dummynet-anchor "/*" all

und bei Erfolg mit laden sudo pfctl -e -f /etc/pf.conf.


Eine ordnungsgemäße System- und Proxykonfiguration (und gut funktionierende Apps) erfordern keine solchen PF-Regeln!

Ja! es funktioniert, vielen Dank für deine Erklärungen, es hilft mir sehr.