Eu entrei em uma situação muito específica e, embora haja outras maneiras de fazer isso, fiquei meio obcecado com isso e gostaria de descobrir uma maneira de fazer exatamente assim:
fundo
Digamos que eu tenha um servidor executando vários serviços escondidos em contêineres isolados. Como a maioria desses serviços é http, estou usando um proxy nginx para expor subdomínios específicos a cada serviço. Por exemplo, um servidor de nó está sendo executado em um contêiner de docker com sua porta 80
vinculada ao 127.0.0.1:8000
host. Vou criar um vhost no nginx que proxies todos os pedidos myapp.mydomain.com
para http://127.0.0.1:8000
. Dessa forma, o contêiner do docker não pode ser acessado de fora, exceto através myapp.mydomain.com
.
Agora, quero iniciar um contêiner do gogs docker de forma que gogs.mydomain.com
aponte para o contêiner do gogs. Então, inicio esse contêiner gogs com a porta 8000
vinculada ao 127.0.0.1:8001
host. E um site nginx proxy solicita gogs.mydomain.com
para http://127.0.0.1:8001
e funciona bem ...
No entanto, gogs sendo um contêiner git, eu também gostaria de acessar os repositórios como através, git@gogs.mydomain.com:org/repo
mas isso não funciona com a configuração atual. Uma maneira de fazer esse trabalho seria vincular a porta 22
do contêiner à porta 0.0.0.0:8022
do host e, em seguida, o URL do git ssh pode ser algo como git@gogs.mydomain.com:8022/repo
.
(Isso não parece funcionar; quando eu for para uma origem com uri assim, o git exige a senha do usuário - git
em gogs.mydomain.com
vez de gogs.mydomain.com:8022
- mas isso é provavelmente algo que estou fazendo de errado e fora do escopo para essa pergunta, no entanto, Agradeço qualquer diagnóstico por isso também)
Problema
Minha principal preocupação é que eu quero que a porta ssh <gogs container>:22
seja submetida a proxy, da mesma forma que proxy as portas http usando o nginx; ou seja, qualquer conexão ssh a gogs.mydomain.com
ser passada para a porta do contêiner 22
. Agora não consigo vincular a porta ssh do contêiner à porta ssh do host, porque já existe um sshd em execução no host. Além disso, isso significaria que todas as conexões *.mydomain.com
passassem para o sshd do contêiner.
Quero conexões ssh para:
mydomain.com
host.mydomain.com
ou o endereço IP do meu domínio seja aceito e encaminhado para o sshd no hostgogs.mydomain.com
ougit.mydomain.com
para ser aceito e passado para o sshd no contêiner gogs*.mydomain.com
(onde*
existe algo diferente das possibilidades acima) a ser rejeitado
Se fosse http, eu poderia facilmente fazer isso funcionar através do nginx. Existe uma maneira de fazer isso pelo ssh?
(Também gostaria de sair em um membro e perguntar: existe uma maneira de fazer isso com qualquer serviço tcp em geral?)
Quaisquer insights sobre o modo como estou tentando fazer isso aqui também são bem-vindos. Não me importo de saber quando o que estou tentando fazer é totalmente estúpido.
O que eu já tenho em mente:
Talvez eu pudesse compartilhar o soquete sshd no host com o contêiner como um ro
volume? Isso significaria que o sshd dentro do contêiner poderia pegar todas as conexões *.mydomain.com
. Poderia haver uma maneira de fazer o sshd dentro do contêiner rejeitar todas as conexões que não sejam gogs.mydomain.com
ou git.mydomain.com
? No entanto, o sshd no host selecionará todas as conexões de *.mydomain.com
qualquer maneira, inclusive gogs.mydomain.com
; então haveria um conflito. Não sei, na verdade não tentei. Devo tentar?