Недавно мне тоже пришлось сделать нечто подобное, и при поиске натолкнулся на этот ответ. К сожалению, ответ Nafe использует, ipfw
который в настоящее время устарел и недоступен в OSX; и ответ Кевина Лири действительно немного хакерский. Поэтому я должен был сделать что-то лучше (чище) и решил поделиться этим здесь для потомков. Этот ответ в значительной степени основан на подходе, упомянутом в этой сущности .
Как упоминается в OP, указание браузера на 192.168.99.100 должно получить ответ от сервера по адресу localhost: 8000. Добавление псевдонима в ifconfig
действительности не является необходимым, pfctl
одного достаточно: для достижения этого необходимо изменить pf.conf
файл /etc/pf.conf
.
Сначала мы создаем (с Судо) новый файл якорный (назовем его redirection
) по адресу: /etc/pf.anchors/redirection
. В основном это обычный текстовый файл и содержит следующую строку (так же , как в ответ Кевин Лири): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000
. Как только новый файл привязки был создан, на него нужно ссылаться в pf.conf
файле. Откройте pf.conf
файл с помощью sudo и добавьте rdr-anchor "redirection"
после последней строки rdr-anchor (которая есть rdr-anchor "com.apple/*"
) и добавьте load anchor "redirection" from "/etc/pf.anchors/redirection"
в конце.
В конечном итоге, так должен выглядеть файл 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
И это почти все. Просто перезапустите pfctl
, sudo pfctl -d
выполнив сначала команду, чтобы отключить ее, а затем sudo pfctl -fe /etc/pf.conf
снова запустить.
Теперь, если вам нужно, чтобы это происходило автоматически после каждого перезапуска, нужно выполнить еще одну крошечную часть работы: pfctl
необходимо обновить демон запуска для (ссылка на gist указывает на то, что pf включается автоматически при загрузке, однако это не похоже на случай с просмотром кода). Откройте (с помощью sudo) System/Library/LaunchDaemons/com.apple.pfctl.plist
и посмотрите на это:
<array>
<string>pfctl</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
и добавьте строку, <string>-e</string>
чтобы в конечном итоге сделать это так:
<array>
<string>pfctl</string>
<string>-e</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
Это должно сделать это.
Предостережение : Apple больше не позволяет изменять файлы запуска демона просто так (не с помощью sudo, ни chmod, ни чего-либо еще). Только путь повозиться с системой защиты от целостности настроек: загрузиться в режиме восстановления и запуска терминала. Проверьте состояние SIP с помощью csrutil status
, как правило, он должен быть включен. Отключите его csrutil disable
и перезагрузите в обычном режиме, а затем внесите изменения в файл plist, как описано выше. После этого вернитесь в режим восстановления и снова включите защиту (она установлена по уважительной причине), выдав команду csrutil enable
.
Объяснение: Можно проверить, введя ifconfig
команду, которая 127.0.0.1
уже является псевдонимом (по умолчанию) для localhost lo0 - этот факт используется, чтобы избежать необходимости добавлять дополнительный псевдоним для localhost и просто использовать адрес по умолчанию в pf.conf
файле.
ОБНОВЛЕНИЕ: К сожалению, кажется, что загрузка файла при запуске не работает. Я все еще пытаюсь получить помощь, чтобы разобраться. До тех пор, бег sudo pfctl -f /etc/pf.conf
после запуска делает свое дело.