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

Я пытаюсь настроить контейнер docker, который я использую для обхода брандмауэров / NAT, чтобы разрешить доступ по SSH к компьютерам за этими барьерами маршрутизации. По сути, у меня есть служба SSH, прослушивающая внутри контейнера docker, к которому подключаются другие мои компьютеры, открывая переадресацию портов с обратным SSH, а затем, если я хочу подключиться к компьютеру за брандмауэром, я вместо этого подключаюсь к своему докеризованному прокси-серверу на обратном порту. Пример:

Защищенный брандмауэром компьютер "Bob" подключается к прокси-серверу:

ssh -R 2024:localhost:22 -N remote.server

Далее я подключаюсь к удаленному серверу по порту 2024 чтобы следовать по туннелю обратно вниз и подключиться к localhost:22 на Бобе:

ssh -p 2024 remote.server

Все это отлично работает, когда оно не привязано к dockerized, однако, когда я попытался перенести это в dockerized service, я обнаружил, что мой sshd сервер в контейнере docker упорно отказывается открывать удаленный порт для пересылки. Соединение с ssh -vvv на первом шаге выше дается:

...debug1: Entering interactive session.debug1: pledge: networkdebug3: receive packet: type 4debug1: Remote: Server has disabled port forwarding.debug3: receive packet: type 82debug1: remote forward failure for: listen 2024, connect localhost:22Warning: remote port forwarding failed for listen port 2024debug1: All remote forwarding requests processed

Что очень похоже на мой sshd не настроен на разрешение удаленной переадресации портов. Однако мой sshd_config кажется, он думает, что это так:

# tail /etc/ssh/sshd_config -n 5GatewayPorts yesAllowTcpForwarding yesAllowStreamLocalForwarding yesPermitTunnel yesUsePrivilegeSeparation no

Действительно, бег с ssh -ddd внутри контейнера docker, затем сначала соединяясь со строкой, показанной выше:

debug3: /etc/ssh/sshd_config:91 setting GatewayPorts yesdebug3: /etc/ssh/sshd_config:92 setting AllowTcpForwarding yesdebug3: /etc/ssh/sshd_config:93 setting AllowStreamLocalForwarding yesdebug3: /etc/ssh/sshd_config:94 setting PermitTunnel yesdebug3: /etc/ssh/sshd_config:95 setting UsePrivilegeSeparation no

С последующим:

debug1: server_input_global_request: rtype tcpip-forward want_reply 1debug1: server_input_global_request: tcpip-forward listen localhost port 2024debug1: 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, версия docker - это 17.09.1-ce на Amazon Linux 2017.09.

Спасибо!

Ага! Я все понял. Это было потому, что docker создавал ipv6 внутренней сети для моих контейнеров, и у моего ядра не было ipv6 переадресация включена. Поэтому при запуске sshd вне контейнера он будет работать над ipv4, но при запуске sshd внутри контейнера в сети docker bridge он будет прослушивать ipv6 и не сможет открыть порт для переадресации.

Как только я включил ipv6 пересылка, (добавление net.ipv6.conf.all.forwarding = 1 в /etc/sysctl.conf и перезагрузка) все начинает работать просто отлично.

Вы также можете попробовать заставить sshd использовать ipv4. В вашем примере добавьте переключатель "-4" следующим образом:

ssh -4 -R 2024:localhost:22 -N remote.server

выполнение этих шагов помогло мне

  • устанавливать ssh на контейнере
  • включите службу с помощью /etc/init.d/ssh start
  • бежать echo 'root:a-strong-password' | chpasswd чтобы установить пароль для root
  • редактировать /etc/ssh/sshd_config и установить PermitRootLogin yes
  • затем /etc/init.d/ssh restart
  • затем ssh -fNTCR localhost:<YOUR-PORT>:localhost:22 remote-host это переходит в фоновый режим, и вы можете увидеть это через ps aux | grep ssh
  • затем в удаленный хост мы можем войти в него ssh -p <YOUR-PORT> localhost
  • который запрашивает пароль и вы уже создали

скринхост

enter image description here


Дополнительная информация

  1. как-войти-по-ssh-в-контейнер-docker-удаленно-как-root-или-некорневой-пользователь