4

Мне нужно xdebug что-то, что не на сервере в контейнере Docker, и с моего ноутбука я запустил ssh -R 9000:localhost:9000 server и проверил туннель с помощью telnet localhost 9000 . Пока все хорошо, у меня есть связь.

Теперь на сервере я сделал

iptables -t nat -I PREROUTING -p tcp -d 172.17.42.1 --dport 9000 -j DNAT --to 127.0.0.1:9000 

Наконец я зафиксировал проблемный экземпляр докера и запустил

docker run  --net=host -t  -i snapshot /bin/bash

Внутри контейнера telnet 172.17.42.1 9000 отказывается от соединения.

2 ответа2

4

Я столкнулся с этой же проблемой, за исключением того, что у меня было два контейнера, соединенных вместе с --link, поэтому --net = host не будет работать для этой ситуации.

При выполнении перенаправления порта ssh на удаленный хост с использованием ssh -R 9000:localhost:9000 server lsof -P -i -n может показать, что порт связан с устройством обратной связи серверов, которое выглядит следующим образом:

sshd 39172 ubuntu 9u IPv4 2941407 0t0 TCP ::1:9000 (LISTEN)

Этот петлевой интерфейс недоступен для сети внутри контейнера Docker. Я исправил это, добавив GatewayPorts yes в файл sshd_config на сервере и перезапустив sshd.

Затем перенаправленный порт 9000 привязывается к обычному интерфейсу и доступен из контейнера докера. (и от любого другого хоста в этом отношении).

0

Комментарий @barlop оказался очень полезным. Я удалил правило iptables, затем попытался запустить nc -l -p 1234 а затем nc -l 127.0.0.1 -p 1234 а затем в контейнере попытался запустить telnet localhost 1234 и это сработало. Так что я попробовал telnet localhost 9000 и это также сработало! Я думаю, что не раньше, но, кажется, сейчас. Итак: нет необходимости в каких-либо правилах iptables, он просто работает с --net=host . Тем не менее, lsof -i: 9000 по-прежнему ничего не отображает, и, возможно, раньше я проверял только это.

Редактировать: netstat -anl |grep :9000 в контейнере показывает открытый порт как LISTEN. Это не так. Weird.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .