Iptables-Äquivalent für Mac OS X.


55

Ich möchte Anfragen von 192.168.99.100:80an weiterleiten 127.0.0.1:8000. So mache ich es unter Linux mit iptables:

iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.168.99.100 -j DNAT --to-destination 127.0.0.1:8000

Wie mache ich dasselbe in MacOS X? Ich habe eine Kombination von ipfwBefehlen ohne großen Erfolg ausprobiert :

ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(Erfolg für mich ist, einen Browser zu zeigen http://192.168.99.100und eine Antwort von einem Entwicklungsserver zu erhalten, auf dem ich ausgeführt werde. localhost:8000)


Sprechen wir über OSX Client oder Server?
Scott Pack

1
Es ist Schneeleopard.
Nafe

Gibt es einen Grund, warum Sie Ihren Webserver nicht so konfigurieren können, dass er auch 192.168.99.100:80 abhört?
Zoredache

1
@Zoredache Für das Abhören von Port 80 ist sudo erforderlich, und einige Webserver löschen Berechtigungen nicht schnell genug, um sie mit sudo sicher auszuführen.
Navin

Antworten:


33

Also fand ich einen Weg, dies zu tun. Ich bin mir nicht sicher, ob es der bevorzugte Weg ist, aber es funktioniert! Bei deiner Lieblingsschale:

sudo ifconfig lo0 10.0.0.1 alias
sudo ipfw add fwd 127.0.0.1,9090 tcp from me to 10.0.0.1 dst-port 80

(Der Alias ​​zu lo0scheint der fehlende Teil zu sein)

Wenn Sie möchten, dass eine (gefälschte) Domain auf diesen neuen Alias ​​verweist, stellen Sie sicher, dass / etc / hosts die folgende Zeile enthält:

10.0.0.1 www.your-domain.com

4
ipfw funktioniert nicht auf Yosemite (MAC) und scheint irgendwie veraltet zu sein
Vadorequest

25

Ich konnte dies mit den Befehlen ifconfigund pfctlunter Mac 10.10.2 zum Laufen bringen. Mit dem folgenden Ansatz kann ich erfolgreich eine Zuordnung 127.0.0.1:3000zu mydomain.comlokal auf meinem Computer vornehmen.

Geben Sie in Ihrer Befehlszeile die folgenden zwei Befehle ein, um Verbindungen weiterzuleiten 127.0.0.1:3000an 10.0.0.1:

sudo ifconfig lo0 10.0.0.1 alias
echo "rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port 80 -> 127.0.0.1 port 3000" | sudo pfctl -ef -

Bearbeiten Sie dann Ihre /etc/hostsoder /private/etc/hosts-Datei und fügen Sie die folgende Zeile hinzu, um Ihre Domain zuzuordnen 10.0.0.1.

10.0.0.1 mydomain.com

Nachdem Sie Ihre Hosts-Datei gespeichert haben, leeren Sie Ihr lokales DNS:

sudo discoveryutil udnsflushcaches

Öffnen mydomain.comSie jetzt in einem Browser und Sie sehen den Server, der auf Ihrem lokalen Host-Port (dh 127.0.0.1:3000) gehostet wird . Grundsätzlich ordnet dieser Prozess <ip>:<port>eine neue zu, <ip>so dass Sie dann einem Host diese IP zuordnen können.


1
Nur ein bisschen hacky, aber erledigt den Job. Gute Show.
Joey Carson

6
Danke. Wie würden Sie den Alias ​​und die Weiterleitung rückgängig machen?
Carlos Nuñez

1
Hallo sudo discoveryutil udnsflushcachesgibts mir command not foundaber es passt trotzdem zum eintrag richtig. Aber wie kann ich einen zweiten Port zuordnen? Ich habe versucht, die Schritte 1 + 2 mit id: 10.0.0.2und einem anderen Port auszuführen, aber es wird immer nur die letzte Verbindung verwendet. Wenn ich also last 10.0.0.1& port 3000it forwards 3000mache, wenn ich last 10.0.0.2und portiere 4000es forwards 4000. In meinem habe /private/etc/hostsich beide Einträge mit der (entsprechend) unterschiedlichen ID geschrieben.
Andi Giga

Funktioniert, aber ich muss es erneut tun, wenn ich OSX neu starte.
Kasper

1
Bitte aktualisieren Sie mitsudo dscacheutil -flushcache
Northtree

5

In letzter Zeit musste auch ich etwas Ähnliches tun, und bei der Suche kam ich auf diese Antwort. Leider wird die Antwort von Nafe verwendet, ipfwdie in OSX mittlerweile veraltet und nicht mehr verfügbar ist. und die Antwort von Kevin Leary ist in der Tat ein bisschen hackisch. Also musste ich etwas besseres (saubereres) machen und entschied mich, es hier für die Nachwelt zu teilen. Diese Antwort basiert größtenteils auf dem Ansatz, der an dieser Stelle erwähnt wurde .

Wie OP erwähnt, sollte ein Browser, der auf 192.168.99.100 zeigt, eine Antwort von einem Server bei localhost erhalten: 8000. Das Hinzufügen eines Alias ​​zu ifconfigist nicht wirklich erforderlich, pfctles reicht aus, um dies zu erreichen. Dazu muss die pf.confDatei /etc/pf.confunter geändert werden.

Zuerst erstellen wir (mit sudo) einen neuen Anker - Datei (nennen wir es redirection) an: /etc/pf.anchors/redirection. Dies ist im Grunde eine normale Textdatei und enthält die folgende Zeile (genau wie in der Antwort von Kevin Leary): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000. Nachdem die neue Ankerdatei erstellt wurde, muss sie in der pf.confDatei referenziert werden. Öffne die pf.confDatei mit sudo und füge sie rdr-anchor "redirection"nach der letzten rdr-anchor-Zeile rdr-anchor "com.apple/*"hinzu und füge sie load anchor "redirection" from "/etc/pf.anchors/redirection"am Ende hinzu.

Letztendlich sollte die pf.conf-Datei so aussehen:

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "redirection"  #added for redirection/port forwarding
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "pow" from "/etc/pf.anchors/redirection"  #added for redirection/port forwarding

Und das war's auch schon. Starten Sie einfach neu, pfctlindem Sie ausgeben sudo pfctl -d, um es zuerst zu deaktivieren, und es dann erneut sudo pfctl -fe /etc/pf.confzu starten.

Wenn dies nach jedem Neustart automatisch geschehen soll, muss noch ein winziger Arbeitsschritt erledigt werden: Der pfctlStartdämon für muss aktualisiert werden (in der Referenz wird erwähnt, dass pf beim Start automatisch aktiviert wird, dies scheint jedoch nicht der Fall zu sein der Fall vom Betrachten des Codes). Öffne (mit sudo) System/Library/LaunchDaemons/com.apple.pfctl.plistund suche danach:

<array>
          <string>pfctl</string>
          <string>-f</string>
          <string>/etc/pf.conf</string>
</array>

und füge die Zeile hinzu <string>-e</string>, um es letztendlich so zu machen:

<array>
         <string>pfctl</string>
         <string>-e</string>
         <string>-f</string>
         <string>/etc/pf.conf</string>
</array>

Das sollte es tun.

Vorsichtsmaßnahme : Apple erlaubt nicht mehr, die Start-Dämon-Dateien einfach so zu ändern (weder mit sudo, noch mit chmod, noch mit irgendetwas anderem). Die einzige Möglichkeit besteht darin, die Einstellungen für den Systemintegritätsschutz zu ändern : Starten Sie den Wiederherstellungsmodus und starten Sie das Terminal. Überprüfen Sie den SIP-Status mit csrutil status, er sollte generell aktiviert sein. Deaktivieren Sie es mit csrutil disableund starten Sie es im normalen Modus neu. Nehmen Sie dann die oben beschriebenen Änderungen an der plist-Datei vor. Wenn Sie fertig sind, kehren Sie in den Wiederherstellungsmodus zurück und aktivieren Sie den Schutz (der aus gutem Grund vorhanden ist) erneut, indem Sie ihn ausstellen csrutil enable.

Erläuterung: Sie können dies überprüfen, indem Sie den ifconfigBefehl 127.0.0.1absetzen , der bereits der (Standard-) Alias ​​für localhost lo0 ist. Diese Tatsache wird verwendet, um das Hinzufügen eines zusätzlichen Alias ​​für localhost zu vermeiden und einfach die Standardadresse in der pf.confDatei zu verwenden.

UPDATE: Leider scheint das Laden der Datei beim Start nicht zu funktionieren. Ich versuche immer noch, Hilfe zu bekommen, um es zu sortieren. Bis dahin sudo pfctl -f /etc/pf.confmacht das Laufen nach dem Start den Trick.


Vielen Dank, das hat bei mir in OS X Sierra funktioniert. Es ist jedoch sehr wichtig, dass die Umleitungsdatei mit einem Zeilenumbruch endet.
Kadrian

Es scheint nicht sicher zu sein, Systemdateien wie System/Library/LaunchDaemons/com.apple.pfctl.plist; Dies würde wahrscheinlich ein Betriebssystem-Update nicht überleben?
Tom


1

Ab 10.5 wird OS X mit einer neuen, anwendungsorientierten Firewall ausgeliefert ipfw. Ipfw ist aber noch installiert. Wenn Sie Probleme mit der Syntax haben, sehen Sie sich die grafischen Frontends wie WaterRoofoder an Flying Buttress.

HTH, PEra


1

Die Reihenfolge der Regeln ist wichtig. Vergewissern Sie sich, dass vor Ihren Zulassungsregeln oder Ähnlichem kein "Alle verweigern" vorhanden ist.


Vielen Dank für den Rat, aber ich glaube nicht, dass ich dieses spezielle Problem habe (ipfw liste zeigt nur meine Regel und 65535 allow ip from any to any).
Nafe

1

Ihrem Befehl scheint eine Regelnummer zu fehlen. Versuchen:

ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(Wenn Sie nicht als root ausgeführt werden, müssen Sie sudo voranstellen). Eine weitere zu überprüfende Sache ist, dass die Firewall aktiviert ist:

sysctl net.inet.ip.fw.enable

Wenn es mit dem Wert 0 (aus) zurückkommt, schalten Sie es ein mit:

sysctl -w sysctl net.inet.ip.fw.enable=1

... und sorgen Sie dann dafür, dass es beim Neustart des Computers wieder aktiviert wird. Der "richtige" Weg, dies zu tun, ist wahrscheinlich, ein Startelement zu erstellen ( Lingon macht dies ziemlich einfach). Oder verwenden Sie einfach eines der erwähnten GUI-Tools PEra und lassen Sie es sich um die Details kümmern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.