Переадресувати ssh-з'єднання до контейнера докера за іменем хоста


10

Я потрапив у дуже конкретну ситуацію, і хоча є інші способи зробити це, я якось одержимий цим і хотів би знайти спосіб зробити це саме так:

Фон

Скажімо, у мене є сервер, на якому працює кілька сервісів, зібраних у ізольованих докерних контейнерах. Оскільки більшість цих служб є http, я використовую проксі-сервер nginx для викриття конкретних субдоменів для кожної служби. Наприклад, сервер вузлів працює на докерному контейнері, його порт 80прив'язаний до 127.0.0.1:8000хоста. Я створю віртуальний хост в Nginx , що проксі все запити myapp.mydomain.comдо http://127.0.0.1:8000. Таким чином, до контейнера докера не можна отримати доступ ззовні, крім наскрізного myapp.mydomain.com.

Тепер я хочу запустити контейнер docker gogs таким чином, що gogs.mydomain.comвказує на контейнер gogs. Тому я запускаю цей контейнер gogs з портом, 8000прив’язаним до 127.0.0.1:8001хоста. І Nginx сайт проксінг запити gogs.mydomain.comдо http://127.0.0.1:8001і вона добре працює ...

Однак, що gogs є контейнером git, я також хотів би отримати доступ до репозицій, як через, git@gogs.mydomain.com:org/repoале це не працює з поточною установкою. Один із способів зробити цю роботу - прив’язати порт 22контейнера до порту 0.0.0.0:8022хоста, і тоді URL-адрес git ssh може бути чимось подібним git@gogs.mydomain.com:8022/repo.

(Це не схоже на роботу, коли я натискаю на походження з URI , як це, мерзотник вимагає пароль для користувача gitна gogs.mydomain.com- замість gogs.mydomain.com:8022- але це, ймовірно , що - то я роблю не так , і виходить за рамки цього питання, однак, Я також вдячний за будь-який діагноз для цього)

Проблема

Моє основне занепокоєння полягає в тому, що я хочу, щоб ssh-порт <gogs container>:22був проксі-сервером так само, як я переглядаю порти http за допомогою nginx; тобто будь-які ssh-з'єднання для gogs.mydomain.comпередачі до порту контейнера 22. Тепер я не можу прив’язати порт ssh контейнера до порту ssh хосту, оскільки на хості вже працює sshd. Також це означатиме, що будь-які з'єднання для *.mydomain.comпередачі до sshd контейнера.


Я хочу, щоб будь-які ssh-з'єднання:

  • mydomain.com host.mydomain.com або IP-адресу mydomain, яку потрібно прийняти та переслати в sshd на хості
  • gogs.mydomain.comабо git.mydomain.comбути прийнятим передачею до sshd на контейнері gogs
  • *.mydomain.com(де *є щось, окрім наведених вище можливостей), яке слід відхилити

Якби це був http, я легко міг би зробити цю роботу через nginx. Чи є спосіб зробити це для ssh?


(Також хочеться вийти на кінцівку і запитати: чи є спосіб досягти цього за допомогою будь-якої послуги tcp взагалі?)

Будь-яке розуміння того, як я намагаюся це зробити тут, також вітається. Я не проти, щоб мені сказали, коли те, що я намагаюся зробити, є абсолютно дурним.


Що я вже мав на увазі:

Можливо, я міг би поділитися сокетом sshd на хості з контейнером як roоб'єм? Це означає, що sshd всередині контейнера може підібрати всі з'єднання до *.mydomain.com. Чи може бути спосіб змусити sshd всередині контейнера відхилити всі з'єднання, крім gogs.mydomain.comабо git.mydomain.com? Однак sshd на хості все *.mydomain.comодно підбере всі з'єднання, включаючи gogs.mydomain.com; тож був би конфлікт. Я не знаю, я насправді цього не пробував. Чи варто спробувати?

Відповіді:


2

Зробити це "ім'ям хоста" просто не входить до сфери дії ssh. Сам протокол ssh не підтримує віртуальний хостинг на основі імен (адже HTTP є винятком із правила тут).

SSHd на стороні прийому ніколи не може знати, до якого імені хоста ви попросили свого клієнта підключитися, оскільки ця інформація не передається всередині протоколу.

Якщо вам потрібно лише кілька клієнтів для роботи з цим, ви можете налаштувати кожного клієнта для підключення до вашого сервера, а потім перейти до контейнера докера таким чином:

Host yourcontainer
        Hostname internal.ip.of.your.container
        ProxyCommand ssh your.docker.host nc %h %p

Таким чином ssh буде викликати команду proxy, яка відкриє сеанс ssh для вашого хоста та зателефонує, netcatщоб встановити з'єднання з вашим контейнером. Таким чином, вам насправді не потрібно виставляти контейнери ssh-порт для зовнішнього світу.


0

Останні версії OpenSSH мають директиву ProxyJump та прапор -J:

ssh -J proxyuser@jumphost user@target
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.