Я пытаюсь настроить контейнер докеров, который использую для обхода брандмауэров / NAT, чтобы разрешить SSH-доступ к компьютерам за этими барьерами маршрутизации. По сути, у меня есть служба SSH, которая прослушивает внутри контейнера докеров, к которому подключаются другие мои компьютеры, открывая обратную переадресацию портов SSH, а затем, если я хочу подключиться к компьютеру за брандмауэром, я вместо этого подключаюсь к своему докеризованному прокси-сервер на обратном порту. Пример:
Компьютер «Боб» с брандмауэром подключается к прокси-серверу:
ssh -R 2024:localhost:22 -N remote.server
Затем я подключаюсь к удаленному серверу через порт 2024
чтобы вернуться по туннелю и подключиться к localhost:22
на бобе:
ssh -p 2024 remote.server
Все это отлично работает, когда оно не докеризовано, однако, когда я попытался переместить это в докеризированный сервис, я обнаружил, что мой sshd
сервер внутри контейнера Docker упорно отказывается открывать удаленные вперед порт. Связь с ssh -vvv
в первом шаге выше дает:
...
debug1: Entering interactive session.
debug1: pledge: network
debug3: receive packet: type 4
debug1: Remote: Server has disabled port forwarding.
debug3: receive packet: type 82
debug1: remote forward failure for: listen 2024, connect localhost:22
Warning: remote port forwarding failed for listen port 2024
debug1: All remote forwarding requests processed
Что очень похоже на мою sshd
не настроен для разрешения переадресации удаленного порта. Однако мой sshd_config
кажется, что это так:
# tail /etc/ssh/sshd_config -n 5
GatewayPorts yes
AllowTcpForwarding yes
AllowStreamLocalForwarding yes
PermitTunnel yes
UsePrivilegeSeparation no
Действительно, бегая с ssh -ddd
внутри контейнера докеров, затем сначала будет показано соединение с приведенной выше строкой:
debug3: /etc/ssh/sshd_config:91 setting GatewayPorts yes
debug3: /etc/ssh/sshd_config:92 setting AllowTcpForwarding yes
debug3: /etc/ssh/sshd_config:93 setting AllowStreamLocalForwarding yes
debug3: /etc/ssh/sshd_config:94 setting PermitTunnel yes
debug3: /etc/ssh/sshd_config:95 setting UsePrivilegeSeparation no
С последующим:
debug1: server_input_global_request: rtype tcpip-forward want_reply 1
debug1: server_input_global_request: tcpip-forward listen localhost port 2024
debug1: server_input_global_request: rtype no-more-sessions@openssh.com want_reply 0
Итак, ясно, что моя конфигурация настроена правильно, но кажется, что клиент все еще думает, что сервер не может выполнять переадресацию портов. Как я могу убедить сервер openssh выполнить удаленную пересылку? Что могло вызвать этот сбой?
Клиент работает OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
, сервер работает OpenSSH_6.7p1 Debian-5+deb8u4
, версия докера 17.09.1-ce
на Amazon Linux 2017.09
.
Спасибо!
Ага! Я понял. Это было потому, что docker
создавал ipv6
внутренняя сеть для моих контейнеров, и в моем ядре не было ipv6
пересылка включена. Так что при беге sshd
вне контейнера, это будет работать ipv4
, но при беге sshd
внутри контейнера в сети докер-моста, он будет слушать ipv6
и не может открыть порт вперед.
Как только я включил ipv6
пересылка, (добавление net.ipv6.conf.all.forwarding = 1
в /etc/sysctl.conf
и перезагрузка) все начинает работать нормально.
Вы также можете попробовать заставить sshd использовать ipv4. В вашем примере добавляем переключатель «-4» следующим образом:
ssh -4 -R 2024:localhost:22 -N remote.server