Я потрапив у дуже конкретну ситуацію, і хоча є інші способи зробити це, я якось одержимий цим і хотів би знайти спосіб зробити це саме так:
Фон
Скажімо, у мене є сервер, на якому працює кілька сервісів, зібраних у ізольованих докерних контейнерах. Оскільки більшість цих служб є 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.comhost.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; тож був би конфлікт. Я не знаю, я насправді цього не пробував. Чи варто спробувати?