Я хочу пересылать запросы от 192.168.99.100:80
к 127.0.0.1:8000
. Вот как я бы сделал это в 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
Как мне сделать то же самое в MacOS X? Я пробовал комбинацию ipfw
команды без особого успеха:
ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80
(Успех для меня - это направление браузера на http://192.168.99.100
и получить ответ от сервера разработки, на котором я работал localhost:8000
)
Так я узнал а способ сделать это. Я не уверен, что это предпочтительный способ, но он работает! В любимой оболочке:
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
(Псевдоним lo0
кажется недостающая часть)
Если вы хотите, чтобы (поддельный) домен указывал на этот новый псевдоним, убедитесь, что / etc / hosts содержит строку:
10.0.0.1 www.your-domain.com
Я смог заставить это работать, используя ifconfig
и pfctl
команды на Mac 10.10.2. При следующем подходе я успешно отображаю 127.0.0.1:3000
к mydomain.com
локально на моей машине.
В командной строке введите следующие две команды для перенаправления подключений к 127.0.0.1:3000
к 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 -
Затем отредактируйте свой /etc/hosts
или /private/etc/hosts
файл и добавьте следующую строку, чтобы сопоставить свой домен с 10.0.0.1
.
10.0.0.1 mydomain.com
После сохранения файла hosts очистите локальный DNS:
sudo discoveryutil udnsflushcaches
Теперь откройте mydomain.com
в браузере, и вы увидите сервер, размещенный на вашем порту localhost (т.е. 127.0.0.1:3000
). В основном этот процесс отображает <ip>:<port>
к новому <ip>
так что вы можете затем сопоставить хост с этим IP.
Мне тоже недавно приходилось проделывать подобное, и в поисках я нашел этот ответ. К сожалению, ответ Нафе использует ipfw
который теперь устарел и недоступен в OSX; и ответ Кевина Лири действительно немного хакерский. Поэтому мне пришлось сделать что-то лучше (чище), и я решил поделиться этим для потомков. Этот ответ во многом основан на подходе, упомянутом в это суть.
Как упоминает OP, указание браузера на 192.168.99.100 должно получить ответ от сервера по адресу localhost: 8000. Добавление псевдонима к ifconfig
на самом деле не нужно, pfctl
одного достаточно: для достижения этого pf.conf
файл в /etc/pf.conf
необходимо изменить.
Сначала мы создаем (с помощью sudo) новый файл привязки (назовем его 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 (которая 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
необходимо обновить (в упомянутой сущности упоминается, что 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
после запуска делает свое дело.
У меня это сработало:
Добавьте следующую строку в файл запуска, как описано здесь: http://xeiam.com/port-forwarding-80-to-8080-using-ipfw-on-mac-os-x/
add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in
Начиная с 10.5 OS X поставляется с новым, ориентированным на приложения межсетевым экраном вместо ipfw
. Но ipfw все еще установлен. Если у вас возникли проблемы с его синтаксисом, проверьте графические интерфейсы, например WaterRoof
или Flying Buttress
.
HTH, PEra
порядок правил важен, убедитесь, что перед разрешающими правилами нет «запретить все» или что-то в этом роде.
Кажется, в вашей команде отсутствует номер правила; пытаться:
ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80
(если вы не работаете с правами root, вам нужно будет добавить к нему префикс sudo). Еще нужно проверить, включен ли брандмауэр:
sysctl net.inet.ip.fw.enable
Если он возвращается со значением 0 (выключено), включите его с помощью:
sysctl -w sysctl net.inet.ip.fw.enable=1
... а затем включите его снова при перезагрузке компьютера. "Правильный" способ сделать это, вероятно, - создать элемент запуска (Лингон делает это довольно просто). Или просто используйте один из инструментов GUI, упомянутых PEra, и позвольте ему позаботиться о деталях.