Обратный туннель 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.