Frage iptables entspricht Mac OS X


Ich möchte Anfragen weiterleiten 192.168.99.100:80 zu 127.0.0.1:8000. So würde ich es unter Linux mit machen 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 das gleiche in MacOS X? Ich habe eine Kombination aus ipfw Befehle ohne viel Erfolg:

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

(Erfolg für mich zeigt einen Browser an http://192.168.99.100 und eine Antwort von einem Entwicklungsserver erhalten, auf dem ich ausgeführt habe localhost:8000)


53
2018-01-13 20:46


Ursprung


Sprechen wir OSX Client oder Server? - Scott Pack
Es ist Schneeleopard. - nafe
Gibt es einen Grund, warum Sie Ihren Webserver nicht so konfigurieren können, dass er auch auf 192.168.99.100:80 hört? - Zoredache
@Zoredache Das Abhören von Port 80 erfordert sudo und einige Webserver lassen die Privilegien nicht schnell genug fallen, um sie mit sudo sicher auszuführen. - Navin


Antworten:


Also habe ich es herausgefunden ein Weg, dies zu tun. Ich bin mir nicht sicher, ob es der bevorzugte Weg ist, aber es funktioniert! In 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 ​​für lo0 scheint der fehlende Teil zu sein)

Wenn Sie möchten, dass eine (falsche) Domain auf diesen neuen Alias ​​verweist, vergewissern Sie sich, dass / etc / hosts folgende Zeile enthält:

10.0.0.1 www.your-domain.com

32
2018-01-24 00:34



ipfw funktioniert nicht auf Yosemite (MAC) und scheint irgendwie veraltet - Vadorequest


Ich konnte das mit dem ifconfig und pfctl Befehle auf Mac 10.10.2. Mit folgendem Ansatz kartiere ich erfolgreich 127.0.0.1:3000 zu mydomain.com lokal auf meiner Maschine.

Geben Sie in Ihrer Befehlszeile die folgenden zwei Befehle ein, um Verbindungen zu weiterzuleiten 127.0.0.1:3000 zu 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 -

Dann redigiere deine /etc/hosts oder /private/etc/hosts Datei und fügen Sie die folgende Zeile hinzu, um Ihre Domäne zuzuordnen 10.0.0.1.

10.0.0.1 mydomain.com

Nachdem Sie Ihre Hosts-Datei gespeichert haben, leeren Sie Ihren lokalen DNS:

sudo discoveryutil udnsflushcaches

Jetzt offen mydomain.com In einem Browser sehen Sie den Server, der auf Ihrem lokalen Host-Port gehostet 127.0.0.1:3000). Grundsätzlich bildet dieser Prozess ein <ip>:<port> zu einem neuen <ip> so dass Sie dann einen Host dieser IP zuordnen können.


22
2018-03-06 17:24



Nur ein bisschen hacky, aber macht den Job erledigt. Gute Show. - Joey Carson
Vielen Dank. Wie würden Sie den Alias ​​und die Weiterleitung rückgängig machen? - Carlos Nuñez
Hallo sudo discoveryutil udnsflushcaches gibt mir command not foundaber es stimmt immer noch korrekt mit dem Eintrag überein. Aber wie kann ich einen zweiten Port abbilden? Ich habe versucht, die Schritte 1 + 2 mit id zu machen: 10.0.0.2 und ein anderer Port, aber es dauert immer nur die letzte Verbindung. Also wenn ich zuletzt lebe 10.0.0.1 & port 3000 es leitet weiter 3000wenn ich zuletzt lebe 10.0.0.2 und Hafen 4000 es leitet weiter 4000. In meinem /private/etc/hosts Ich habe beide Einträge mit der (entsprechend) anderen ID geschrieben. - Andi Giga
Funktioniert, aber ich muss es nochmal bei OSX neu starten .... Irgendwas, um das dauerhaft zu speichern? - Kasper
Bitte aktualisiere mit sudo dscacheutil -flushcache - northtree


Das hat gut für mich funktioniert:


3
2017-08-05 17:50





Auch ich musste in letzter Zeit etwas Ähnliches tun, und bei der Suche stieß ich auf diese Antwort. Leider verwendet die Antwort von Nafe ipfw welches jetzt in OSX veraltet und 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 im Wesentlichen auf dem unter dieser Kernpunkt.

Wie OP erwähnt, sollte ein Browser auf 192.168.99.100 eine Antwort von einem Server auf localhost: 8000 erhalten. Hinzufügen eines Alias ​​zu ifconfig ist nicht wirklich notwendig, pfctl allein genügt: um dies zu erreichen pf.conf Datei bei /etc/pf.conf muss geändert werden.

Zuerst erstellen wir (mit sudo) eine neue Ankerdatei (nennen wir sie) redirection) beim: /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. Sobald die neue Ankerdatei erstellt wurde, muss sie innerhalb der Referenzdatei referenziert werden pf.conf Datei. Öffne das pf.conf Datei mit Sudo und hinzufügen rdr-anchor "redirection" nach der letzten rdr-Ankerlinie (was ist rdr-anchor "com.apple/*") und füge hinzu load anchor "redirection" from "/etc/pf.anchors/redirection" Am Ende.

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 ist es fast. Einfach neu starten pfctl durch Ausgabe sudo pfctl -d um es zuerst und dann zu deaktivieren sudo pfctl -fe /etc/pf.confum es wieder zu beginnen.

Nun, wenn Sie dies nach jedem Neustart automatisch benötigen, müssen Sie noch ein kleines bisschen Arbeit erledigen: den Launch Daemon für pfctl muss aktualisiert werden (die referenzierte gist erwähnt, dass pf automatisch beim Booten aktiviert wird, dies scheint jedoch beim Betrachten des Codes nicht der Fall zu sein). Öffnen (mit Sudo) System/Library/LaunchDaemons/com.apple.pfctl.plist und sieh 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.

Vorbehalt: Apple erlaubt es nicht mehr, die Launch-Dämon-Dateien einfach so zu ändern (nicht mit sudo, noch mit chmod oder irgendetwas anderem). Das nur Weg ist es, mit dem zu basteln Systemintegritätsschutz Einstellungen: Starten Sie den Wiederherstellungsmodus und starten Sie das Terminal. Überprüfen Sie den SIP-Status mit csrutil status, sollte es im Allgemeinen aktiviert werden. Deaktivieren Sie es mit csrutil disable und im normalen Modus neu starten und dann die Änderungen an der PLIST-Datei vornehmen, wie oben beschrieben. Wenn Sie fertig sind, gehen Sie zurück in den Wiederherstellungsmodus und aktivieren Sie den Schutz erneut (durch einen guten Grund), indem Sie ihn ausgeben csrutil enable.

Erläuterung: Man kann das überprüfen, indem man die ifconfig befehle das 127.0.0.1 ist bereits der (Standard) Alias ​​für localhost lo0 - diese Tatsache wird verwendet, um zu vermeiden, dass ein zusätzlicher Alias ​​für localhost hinzugefügt werden muss und einfach die Standardadresse in der pf.conf Datei. 

UPDATE: Leider scheint es, als ob das Laden der Datei beim Start nicht funktioniert. Ich versuche immer noch Hilfe zu bekommen, damit es sortiert wird. Bis dahin läuft sudo pfctl -f /etc/pf.conf Nach dem Start macht es den Trick. 


3
2017-07-02 17:03



Danke dafür, das funktionierte für mich in OS X Sierra. Es ist jedoch sehr wichtig, dass die Umleitungsdatei mit einem Zeilenumbruch endet. - kadrian


Ab 10.5 wird OS X mit einer neuen, anwendungsorientierten Firewall ausgeliefert ipfw. Aber ipfw ist immer noch installiert. Wenn Sie Probleme mit der Syntax haben, überprüfen Sie grafische Frontends wie WaterRoof oder Flying Buttress.

HTH, Péra


1
2018-01-13 21:10





Reihenfolge der Regeln ist wichtig, stellen Sie sicher, es gibt keine "alle verweigern" vor Ihren Regeln zu erlauben oder so etwas.


1
2018-01-13 22:06



Danke 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


Dein Befehl scheint eine Regelnummer zu verpassen. Versuchen:

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

(Wenn Sie nicht als root laufen, müssen Sie ihm sudo voranstellen). Eine andere Sache zu überprüfen 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 dafür, dass es beim Neustart des Computers erneut aktiviert wird. Der "richtige" Weg, dies zu tun, ist wahrscheinlich ein Produkt (Lingon macht das ziemlich einfach). Oder benutzen Sie einfach eines der erwähnten GUI-Tools, und lassen Sie es sich um die Details kümmern.


1
2018-01-14 07:45