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