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

SSH-туннель в контейнер Docker

Цель: подключиться локально к удаленному ответу (например, через lein repl :connect).

Локально это просто:

  1. Запустить сервер (запускает встроенный сервер nrepl на порт 8081)
  2. Бегать lein repl :connect 8081 и вуаля! ответ подключен

Я также сделал это, чтобы подключиться к репу на удаленном сервере, когда репл работал на закрытом порту, с помощью туннеля SSH:

  1. На some.host запустите сервер (он запускает встроенный сервер nrepl на порт 8081)
  2. SSH туннель ssh -N -T -L 8081:localhost:8081 me@some.host
  3. Локально, lein repl :connect 8081 и вуаля! ответ подключен

Однако моя текущая настройка такова, что «сервер» запускается в контейнере Docker, который отображает порт 8081. Итак, чтобы подключиться к серверу nrepl, он должен быть локальным -> some.host -> docker-container -> nrepl .

Я вижу, что моему контейнеру докеров сопоставлен порт 8081:

$ sudo docker port container-id 8081
0.0.0.0:8081

И на сервере, на котором размещен контейнер докеров, я вижу, что порт 8081 прослушивает:

$ netstat -anl | sed -n '2p;/8081/p'
Proto    Recv-Q    Send-Q    Local Address   Foreign Address     State  
tcp      0         0         :::8081         :::*                LISTEN

И это кажется как я могу открыть туннель SSH для порта 8081; например нет ошибок / предупреждений при запуске:

ssh -N -T -L *:8081:localhost:8081 me@some.host

Это заставляет меня думать, что у меня правильный туннель SSH, за исключением того, что всякий раз, когда я пытаюсь подключиться к работающему серверу repl, он немедленно терпит неудачу, например:

$ lein repl :connect 8081
Connecting to nREPL at 127.0.0.1:8081
SocketException The transport's socket appears to have lost its connection to the nREPL server

Примечательно, что ошибка в том, что соединение потеряно, потому что run без туннель SSH открыт, та же команда не работает с Connection refused. Это заставляет меня думать, что туннель SSH в порядке, и что проблема заключается в перенаправлении сервера в контейнер докеров, поэтому заголовок этого является общим вопросом об открытии туннеля из client -> server -> docker container.

Я подумал, что это может быть связано с SSH GatewayPorts, поэтому я попытался включить GatewayPorts, но это ничего не изменило.

Вопросы:

  1. Есть ли что-то явно неправильное в подходе к туннелю SSH, описанному выше?
  2. Как я могу определить где соединение разрывается?
  3. Есть другие предложения?

Спасибо!

И ... оказывается, с туннелем все было в порядке.

Проблема заключалась в том, что для запуска встроенного сервера nrepl внутри контейнера докеров требуется явная привязка к «0.0.0.0». Без этого сервер nrepl по умолчанию привязывается к «localhost», что делает его недоступным извне контейнера докеров, несмотря на сопоставление портов, поскольку сопоставление портов докеров использует 0.0.0.0 :. После того, как сервер nrepl был правильно привязан, все остальное позаботилось о сопоставлении портов.

Просто как полезная ссылка, на которую можно взглянуть - Докер SSH. Очень упрощенный способ управления SSH для Docker.