Вопрос: iptables эквивалент для mac os x


Я хочу отправить запросы от 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)


53
2018-01-13 20:46


Источник


Мы говорим с OSX Client или сервером? - Scott Pack
Это снежный барс. - nafe
Есть ли причина, по которой вы не можете просто настроить свой веб-сервер для прослушивания 192.168.99.100:80? - Zoredache
@Zoredache. Прослушивание порта 80 требует sudo, и некоторые веб-серверы не снижают привилегии достаточно быстро, чтобы безопасно запускать их с помощью sudo. - Navin


Ответы:


Поэтому я узнал  способ сделать это. Я не уверен, что это предпочтительный способ, но он работает! В вашей любимой оболочке:

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

31
2018-01-24 00:34



ipfw не будет работать на Yosemite (MAC) и выглядит явно устаревшим - Vadorequest


Я смог получить эту работу, используя 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-адреса.


21
2018-03-06 17:24



Просто немного взломан, но выполняет свою работу. Хорошее шоу. - Joey Carson
Спасибо. Как бы вы отменили псевдоним и переадресацию? - Carlos Nuñez
Здравствуй sudo discoveryutil udnsflushcaches дает мне command not foundно он по-прежнему соответствует записи правильно. Но как я могу отобразить второй порт? Я попытался сделать шаги 1 + 2 с id: 10.0.0.2 и другой порт, но он всегда занимает только последнее соединение. Так что если я сделаю последнее 10.0.0.1 & port 3000 он форвард 3000, если я делаю последнее 10.0.0.2 и порт 4000 он форвард 4000, В моем /private/etc/hosts Я написал обе записи с идентификатором (согласно). - Andi Giga
Работает, но мне нужно это снова, когда я перезапускаю OSX .... Любая вещь, чтобы сохранить это навсегда? - Kasper


Это сработало для меня:


3
2017-08-05 17:50





В последнее время мне тоже пришлось сделать что-то похожее, и в поиске пришел этот ответ. К сожалению, ответ Nafe использует 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-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 файл. 

UPDATE: К сожалению, похоже, что загрузка файла при запуске не работает. Я все еще пытаюсь получить помощь, чтобы отсортировать ее. До тех пор, бег sudo pfctl -f /etc/pf.conf после запуска делает трюк. 


3
2017-07-02 17:03



Спасибо за это, это сработало для меня в OS X Sierra. Очень важно, однако, что файл перенаправления заканчивается новой строкой. - kadrian


Начиная с 10.5, OS X поставляется с новым брандмауэром, ориентированным на приложения, вместо ipfw, Но ipfw все еще установлен. Если у вас возникли проблемы с его синтаксисом, проверьте графические интерфейсы, например WaterRoof или Flying Buttress,

НТН, Пера


1
2018-01-13 21:10





порядок правил важен, убедитесь, что перед вашими правилами разрешено «отрицать все» или что-то в этом роде.


1
2018-01-13 22:06



Спасибо за совет, но я не думаю, что у меня есть эта конкретная проблема (список ipfw показывает только мое правило и 65535 allow ip from any to any). - nafe


Кажется, что в вашей команде отсутствует номер правила; пытаться:

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

... и затем организуйте его для повторного подключения, когда компьютер перезагрузится. «Правильный» способ сделать это, вероятно, создать Запуск продукта (Lingon делает это довольно легко). Или просто используйте один из упомянутых инструментов GUI GUI, и пусть он позаботится о деталях.


1
2018-01-14 07:45