![OS X — переадресация внешнего порта на локальный адрес обратной связи](https://rvso.com/image/1263763/OS%20X%20%E2%80%94%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B5%D0%B3%D0%BE%20%D0%BF%D0%BE%D1%80%D1%82%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%B4%D1%80%D0%B5%D1%81%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9%20%D1%81%D0%B2%D1%8F%D0%B7%D0%B8.png)
У меня есть HTTP-сервис, привязанный к порту 8000, к которому я хочу получить доступ с другого компьютера в сети, но я не могу подключиться, используя внешний IP-адрес машины (например, 192.168.0.105). Я проверил, что брандмауэр OS X не запущен, поэтому я предполагаю, что проблема в том, что сервис привязан только к IP-адресу 127.0.0.1, а не к внешнему IP-адресу.
Какой самый простой способ временно перенаправить внешние соединения на порт 8000 на 127.0.0.1:8000?
решение1
Самый простой и быстрый способ сделать локально привязанные порты доступными для публичного интерфейса без перенастройки базовой службы — создать переадресацию портов SSH и сделать ее доступной глобально (по умолчанию она прослушивает только локально)
Поскольку это одна и та же машина, вам придется использовать разные порты. На Mac, где запущена служба, запустите
ssh -v -g -L 8001:localhost:8000 localhost
-v
для подробного, чтобы вы могли видеть входящие соединения
-g
сделать его доступным в публичном интерфейсе
-L port:targethost:targetport
ну, вы это уже знаете :-)
Если на вашем компьютере имеется более одного активного интерфейса, расширьте оператор, -L
включив в него адрес, к которому вы хотите его привязать.
решение2
Используйте ipfw, он похож на iptables в Linux.
Полагаю, вы используете переадресацию порта SSH на локальную машину.
ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.0.105 dst-port 8000
Другая машина в сети может получить доступ к сервису через 192.168.0.105:8000.
решение3
Если я правильно понимаю,Кальмарможет сработать. Также попробуйте имя компьютера вместо IP или какую-нибудь другую службу (ping, VNC, FTP и т. д.)
решение4
Во-первых, убедитесь, что вы ищете правильную проблему. Вы можете проверить, какие IP-адреса прослушивает веб-сервер, с помощью команды netstat
:
$ netstat -an | grep LISTEN
tcp46 0 0 *.8000 *.* LISTEN
tcp4 0 0 *.88 *.* LISTEN
tcp6 0 0 *.88 *.* LISTEN
tcp4 0 0 127.0.0.1.631 *.* LISTEN
tcp6 0 0 ::1.631 *.* LISTEN
В первой строке этого примера "*.8000" означает, что что-то (предположительно веб-сервер) прослушивает порт 8000 на всех привязанных IP-адресах. С другой стороны, последние две строки означают, что что-то прослушивает порт 631 на петлях IPv4 и IPv6 (127.0.0.1 и ::). Если вы видите "127.0.0.1:8000" при запуске команды, это означает, что вы на правильном пути в своей диагностике.
Если проблема в этом, то, вероятно, лучше всего решить ее, привязав веб-сервер ко всем IP-адресам, а не пытаться обойти ее с помощью пересылки. Проверьте файл(ы) конфигурации Apache (по умолчанию в OS X это /etc/apache2/httpd.conf, плюс все, что "Include" из него) на наличие директив "Listen". Если вы видите
Listen 127.0.0.1:8000
изменить это на
Listen 8000