it-swarm.com.de

iptables-Äquivalent für Mac OS X.

Ich möchte Anfragen von 192.168.99.100:80 An 127.0.0.1:8000 Weiterleiten. So würde ich es unter Linux mit iptables machen:

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 ipfw Befehlen 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 auf http://192.168.99.100 Zu richten und eine Antwort von einem Entwicklungsserver zu erhalten, den ich auf localhost:8000 Ausgeführt habe.)

60
nafe

Also fand ich heraus a Weg, dies zu tun. Ich bin mir nicht sicher, ob es der bevorzugte Weg ist, aber es funktioniert! Bei Ihrer Lieblings-Shell:

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 lo0 scheint 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
35
nafe

Ich konnte dies mit den Befehlen ifconfig und pfctl unter Mac 10.10.2 zum Laufen bringen. Mit dem folgenden Ansatz ordne ich 127.0.0.1:3000 Erfolgreich mydomain.com Lokal auf meinem Computer zu.

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

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 Datei /etc/hosts Oder /private/etc/hosts Und fügen Sie die folgende Zeile hinzu, um Ihre Domain 10.0.0.1 Zuordnen zu können.

10.0.0.1 mydomain.com

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

Sudo discoveryutil udnsflushcaches

Öffnen Sie nun mydomain.com In einem Browser und Sie sehen den Server, der auf Ihrem Localhost-Port gehostet wird (d. H. 127.0.0.1:3000). Grundsätzlich ordnet dieser Prozess einen <ip>:<port> Einem neuen <ip> Zu, sodass Sie dann einem Host diese IP zuordnen können.

28
Kevin Leary

Auch ich musste in letzter Zeit etwas Ähnliches tun, und bei der Suche kam ich auf diese Antwort. Leider verwendet die Antwort von Nafe ipfw, das jetzt veraltet und in OSX nicht verfügbar ist. und die Antwort von Kevin Leary ist in der Tat ein bisschen hackisch. Also musste ich etwas besser machen (sauberer) und beschloss, es hier für die Nachwelt zu teilen. Diese Antwort basiert größtenteils auf dem unter this Gist erwähnten Ansatz.

Wie OP erwähnt, sollte das Zeigen eines Browsers auf 192.168.99.100 eine Antwort von einem Server auf localhost erhalten: 8000. Das Hinzufügen eines Alias ​​zu ifconfig ist nicht unbedingt erforderlich, pfctl allein reicht aus: Um dies zu erreichen, muss die Datei pf.conf Unter /etc/pf.conf Geändert werden.

Zuerst erstellen wir (mit Sudo) eine neue Ankerdatei (nennen wir sie redirection) unter: /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 in der Datei pf.conf Auf sie verwiesen werden. Öffnen Sie die Datei pf.conf Mit Sudo und fügen Sie rdr-anchor "redirection" Nach der letzten rdr-Ankerzeile (rdr-anchor "com.Apple/*") Hinzu und fügen Sie am Ende load anchor "redirection" from "/etc/pf.anchors/redirection" 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 pfctl neu, indem Sie Sudo pfctl -d Ausgeben, um es zuerst zu deaktivieren, und dann Sudo pfctl -fe /etc/pf.conf, Um es erneut zu starten.

Wenn dies nach jedem Neustart automatisch geschehen soll, muss noch ein kleines Stück Arbeit erledigt werden: Der Startdämon für pfctl muss aktualisiert werden (in der angegebenen Liste wird jedoch erwähnt, dass pf beim Booten automatisch aktiviert wird Dies scheint beim Betrachten des Codes nicht der Fall zu sein. Öffnen Sie (mit Sudo) System/Library/LaunchDaemons/com.Apple.pfctl.plist Und suchen Sie danach:

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

und füge die Zeile <string>-e</string> hinzu, 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 es nicht mehr, die Startdämonendateien einfach so zu ändern (weder mit Sudo noch mit chmod,) noch irgendetwas anderes). Die einzige Möglichkeit besteht darin, an den Einstellungen System Integrity Protection zu basteln: Booten Sie in den Wiederherstellungsmodus und starten Sie das Terminal Überprüfen Sie den Status SIP mit csrutil status, Er sollte generell aktiviert sein. Deaktivieren Sie ihn mit csrutil disable Und starten Sie ihn im normalen Modus neu und nehmen Sie dann die Änderungen an der Liste vor Datei wie oben beschrieben. Wenn Sie fertig sind, kehren Sie in den Wiederherstellungsmodus zurück und aktivieren Sie den Schutz erneut (er ist aus gutem Grund vorhanden), indem Sie csrutil enable ausgeben.

Erläuterung: Sie können überprüfen, indem Sie den Befehl ifconfig eingeben, dass 127.0.0.1 Bereits der (Standard-) Alias ​​für localhost lo0 ist. Diese Tatsache wird verwendet, um zu vermeiden, dass ein zusätzlicher Alias ​​hinzugefügt werden muss für localhost und einfach die Standardadresse in der Datei pf.conf verwenden.

UPDATE: Leider scheint das Laden der Datei beim Start nicht zu funktionieren. Ich versuche immer noch, Hilfe zu bekommen, damit es sortiert wird. Bis dahin reicht es aus, Sudo pfctl -f /etc/pf.conf Nach dem Start auszuführen.

6
Yogesch

Das hat bei mir gut funktioniert:

4
Colin Sullivan

Ab 10.5 verfügt OS X über eine neue, anwendungsorientierte Firewall anstelle von ipfw. Aber ipfw ist noch installiert. Wenn Sie Probleme mit der Syntax haben, lesen Sie grafische Frontends wie WaterRoof oder Flying Buttress.

HTH, PEra

1
PEra

die Reihenfolge der Regeln ist wichtig. Stellen Sie sicher, dass vor dem Zulassen von Regeln kein "Alles verweigern" oder ähnliches vorhanden ist.

1
monomyth

In 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 andere 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, besteht wahrscheinlich darin, ein launchd item ( Lingon zu erstellen, das dies ziemlich einfach macht. Oder verwenden Sie einfach eines der genannten GUI-Tools von PEra und lassen Sie es sich um die Details kümmern.

1
Gordon Davisson