Назад | Перейти на главную страницу

Удаленное перенаправление портов внутри контейнеров Docker

Я пытаюсь настроить контейнер докеров, который использую для обхода брандмауэров / 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