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

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

На местном уровне это легко:

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

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

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

Тем не менее, моя текущая настройка заключается в том, что "сервер" запускается в контейнере 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

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

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

Вопросы:

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

Спасибо!

2 ответа

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

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

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

Другие вопросы по тегам