Я попал в очень специфическую ситуацию, и хотя есть и другие способы сделать это, я вроде как стал одержим этим и хотел бы найти способ сделать это именно так:
Задний план
Скажем, у меня есть сервер, на котором запущено несколько сервисов в изолированных док-контейнерах. Поскольку большинство из этих сервисов являются http, я использую прокси nginx для предоставления определенных поддоменов каждому сервису. Например, сервер узла работает в док-контейнере, порт которого 80
привязан к 127.0.0.1:8000
хосту. Я создам vhost в nginx, который проксирует все запросы myapp.mydomain.com
к http://127.0.0.1:8000
. Таким образом, к док-контейнеру нельзя получить доступ снаружи, кроме как через myapp.mydomain.com
.
Теперь я хочу запустить контейнер докера 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
был проксирован так же, как я использую 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
; так что будет конфликт. Я не знаю, я на самом деле не пробовал это. Должен ли я попробовать это?