iptables odpowiada Mac OS X


55

Chcę przekazywać żądania od 192.168.99.100:80do 127.0.0.1:8000. Oto jak bym to zrobił w systemie Linux iptables:

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

Jak mogę zrobić to samo w MacOS X? Wypróbowałem kombinację ipfwpoleceń bez większego powodzenia:

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

(Dla mnie sukcesem jest wskazanie przeglądarki http://192.168.99.100i uzyskanie odpowiedzi z serwera programistycznego, na którym działam localhost:8000)


Czy mówimy o kliencie lub serwerze OSX?
Scott Pack

1
Lampart śnieżny.
nafe

Czy jest jakiś powód, dla którego nie można tak skonfigurować serwera WWW, aby nasłuchiwał także 192.168.99.100:80?
Zoredache,

1
@Zoredache Słuchanie na porcie 80 wymaga sudo, a niektóre serwery WWW nie tracą uprawnień wystarczająco szybko, aby bezpiecznie uruchomić je z sudo.
Navin,

Odpowiedzi:


33

Więc ja dowiedziałem się sposób to zrobić. Nie jestem pewien, czy to preferowany sposób, ale działa! W swojej ulubionej muszli:

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

(Alias lo0wydaje się być brakującą częścią)

Jeśli chcesz, aby (fałszywa) domena wskazywała ten nowy alias, upewnij się, że plik / etc / hosts zawiera wiersz:

10.0.0.1 www.your-domain.com

4
ipfw nie działa na Yosemite (MAC) i wydaje się trochę przestarzałe
Vadorequest,

25

Udało mi się to uruchomić za pomocą poleceń ifconfigi pfctlna komputerze Mac 10.10.2. Z następującym podejściem mam powodzeniem mapowanie 127.0.0.1:3000do mydomain.comlokalnie na moim komputerze.

W wierszu poleceń wprowadź następujące dwa polecenia, aby przekierować połączenia 127.0.0.1:3000do 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 -

Następnie edytuj plik /etc/hostslub /private/etc/hostsplik i dodaj następujący wiersz, aby zmapować domenę 10.0.0.1.

10.0.0.1 mydomain.com

Po zapisaniu pliku hosts opróżnij lokalny DNS:

sudo discoveryutil udnsflushcaches

Teraz otwórz mydomain.comw przeglądarce, a zobaczysz serwer hostowany na porcie localhost (tj 127.0.0.1:3000.). Zasadniczo ten proces mapuje <ip>:<port>nowy na nowy, <ip>dzięki czemu można następnie mapować hosta na ten adres IP.


1
Po prostu odrobinę hacky, ale wykonuje pracę. Dobry występ.
Joey Carson

6
Dziękuję Ci. Jak cofnąłbyś alias i przekazywanie?
Carlos Nuñez,

1
Cześć sudo discoveryutil udnsflushcachesdaje mi, command not foundale nadal pasuje do wpisu poprawnie. Ale jak mogę zmapować drugi port? Próbowałem wykonać kroki 1 + 2 z identyfikatorem: 10.0.0.2i innym portem, ale zawsze wymaga tylko ostatniego połączenia. Więc jeśli zrobię ostatni 10.0.0.1i port 3000przekażę dalej 3000, jeśli zrobię ostatni 10.0.0.2i przeniosę 4000go do przodu 4000. W moim /private/etc/hostsnapisałem oba wpisy z (według) innym identyfikatorem.
Andi Giga

Działa, ale muszę to zrobić ponownie po ponownym uruchomieniu OSX… Czy jest coś, co można zapisać na stałe?
Kasper

1
Zaktualizuj za pomocąsudo dscacheutil -flushcache
northtree

5

Ja też ostatnio musiałem zrobić coś podobnego i przy poszukiwaniu tej odpowiedzi doszedłem. Niestety, odpowiedź na temat zastosowań Nafe, ipfwktóra jest obecnie nieaktualna i niedostępna w OSX; a odpowiedź Kevina Leary'ego jest rzeczywiście nieco zuchwała. Musiałem więc zrobić coś lepszego (czystszego) i postanowiłem udostępnić to tutaj dla potomności. Ta odpowiedź w dużej mierze opiera się na podejściu wymienionym w tym punkcie .

Jak wspomina OP, wskazanie przeglądarki 192.168.99.100 powinno uzyskać odpowiedź z serwera na localhost: 8000. Dodanie aliasu do ifconfigtak naprawdę nie jest konieczne, pfctlsam jest wystarczający: aby to osiągnąć, pf.confplik w /etc/pf.confwymaga modyfikacji.

Najpierw tworzymy (z sudo) nowy plik kotwicy (nazwijmy go redirection) pod adresem: /etc/pf.anchors/redirection. Jest to po prostu zwykły plik tekstowy i zawiera następujące linie (tak jak w odpowiedzi Kevin Leary) rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000. Po utworzeniu nowego pliku kotwicy należy do niego odwołać się w pf.confpliku. Otwórz pf.confplik za pomocą sudo i dodaj rdr-anchor "redirection"po ostatniej linii kotwiczenia rdr (która jest rdr-anchor "com.apple/*") i dodaj load anchor "redirection" from "/etc/pf.anchors/redirection"na końcu.

Ostatecznie tak powinien wyglądać plik pf.conf:

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

I to już wszystko. Po prostu uruchom ponownie pfctl, wydając polecenie, sudo pfctl -daby go najpierw wyłączyć, a następnie sudo pfctl -fe /etc/pf.confuruchomić ponownie.

Teraz, jeśli potrzebujesz, aby stało się to automatycznie po każdym ponownym uruchomieniu, musisz wykonać jeszcze trochę pracy: demon uruchamiający dla pfctlmusi zostać zaktualizowany (wspomniana lista wspomina, że ​​pf jest włączany automatycznie przy starcie, jednak nie wydaje się sprawa z patrzenia na kod). Otwórz (za pomocą sudo) System/Library/LaunchDaemons/com.apple.pfctl.plisti poszukaj tego:

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

i dodaj linię, <string>-e</string>aby ostatecznie zrobić to tak:

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

Że należy to zrobić.

Uwaga : Apple nie pozwala już na zmianę plików demona uruchamiania w ten sposób (nie w przypadku sudo, chmod ani niczego innego). Tylko sposobem jest majstrować z System Integrity Protection ustawieniami: rozruch w trybie awaryjnym i terminalu uruchomić. Sprawdź status SIP za pomocą csrutil status, powinien być ogólnie włączony. Wyłącz go za pomocą csrutil disablei uruchom ponownie w trybie normalnym, a następnie wprowadź zmiany w pliku plist, jak opisano powyżej. Po zakończeniu wróć do trybu odzyskiwania i ponownie włącz ochronę (z uzasadnionego powodu), wydając csrutil enable.

Objaśnienie: Można to sprawdzić, wydając ifconfigpolecenie, które 127.0.0.1jest już (domyślnym) aliasem dla localhost lo0 - ten fakt jest używany, aby uniknąć konieczności dodawania dodatkowego aliasu dla localhost i po prostu użyć domyślnego adresu w pf.confpliku.

AKTUALIZACJA: Niestety wydaje się, że ładowanie pliku przy uruchomieniu nie działa. Wciąż próbuję uzyskać pomoc w uporządkowaniu tego. Do tego czasu działa sudo pfctl -f /etc/pf.confpo uruchomieniu.


Dzięki za to, działało to dla mnie w OS X Sierra. Jest jednak bardzo ważne, aby plik przekierowania kończył się nową linią.
kadrian

Zastępowanie plików systemowych takich jak System/Library/LaunchDaemons/com.apple.pfctl.plist; to prawdopodobnie nie przetrwałoby aktualizacji systemu operacyjnego?
Tom


1

Począwszy od 10.5, OS X jest wyposażony w nową zaporę zorientowaną na aplikację zamiast ipfw. Ale ipfw jest nadal zainstalowany. Jeśli masz problemy ze składnią, sprawdź nakładki graficzne, takie jak WaterRooflub Flying Buttress.

HTH, PEra


1

kolejność reguł jest ważna, upewnij się, że nie ma opcji „odmawiaj wszystkim” przed regułami zezwalania lub coś w tym rodzaju.


Dziękuję za radę, ale nie sądzę, że mam ten konkretny problem (lista ipfw pokazuje tylko moją regułę i 65535 allow ip from any to any).
nafe

1

Wydaje się, że w poleceniu brakuje numeru reguły; próbować:

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

(jeśli nie działasz jako root, musisz poprzedzić go sudo). Kolejną rzeczą do sprawdzenia jest to, że zapora jest włączona:

sysctl net.inet.ip.fw.enable

Jeśli wróci z wartością 0 (wyłączone), włącz ją za pomocą:

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

... a następnie zadbaj o to, aby ponownie się włączał po ponownym uruchomieniu komputera. „Właściwym” sposobem na to jest prawdopodobnie stworzenie wystrzelonego przedmiotu ( Lingon sprawia, że ​​jest to dość łatwe). Lub po prostu użyj jednego z narzędzi GUI wspomnianych przez PEra i pozwól mu zadbać o szczegóły.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.