Обратный туннель SSH в контейнер Docker

Мне нужно 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 ответа

Решение

Я столкнулся с той же проблемой, за исключением того, что у меня было два контейнера, соединенных вместе с --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 затем связывается с обычным интерфейсом и доступен из контейнера докера. (и от любого другого хоста в этом отношении).

Комментарий @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.

Другие вопросы по тегам