Ja też ostatnio musiałem zrobić coś podobnego i przy poszukiwaniu tej odpowiedzi doszedłem. Niestety, odpowiedź na temat zastosowań Nafe, ipfw
któ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 ifconfig
tak naprawdę nie jest konieczne, pfctl
sam jest wystarczający: aby to osiągnąć, pf.conf
plik w /etc/pf.conf
wymaga 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.conf
pliku. Otwórz pf.conf
plik 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 -d
aby go najpierw wyłączyć, a następnie sudo pfctl -fe /etc/pf.conf
uruchomić 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 pfctl
musi 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.plist
i 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 disable
i 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 ifconfig
polecenie, które 127.0.0.1
jest 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.conf
pliku.
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.conf
po uruchomieniu.