
Eu tenho um servidor remoto atrás de dois gateways, conforme mostrado na figura. gw1
está aberto ao mundo exterior, enquanto gw2
só é acessível a partir de gw1
. Server
só é acessível gw2
e pode ser um entre vários servidores possíveis. Quero configurar o encaminhamento de porta ssh
de forma que 443
da minha máquina cliente seja encaminhado automaticamente para 2000
on gw1
. Este não é o problema. Eu tenho:
HostName gw1
User user
ForwardAgent yes
LocalForward 443 localhost:2000
E isso funciona perfeitamente. Agora quero 2000
que from gw1
seja encaminhado para 443
quando eu for . Eu posso fazer:Server
gw2
ssh
gw2
HostName gw2
LocalForward 2000 Server:443
Existe alguma maneira de passar o IP do servidor como parâmetro, já que pode ser diferente a cada vez?
Responder1
Suponha que você não se importe com a porta 2000. Seu objetivo é apenas encaminhar a porta 443 do cliente para o servidor. E suponha que você tenha hosts server1, server2, server3, ... na função de servidor. Se você adicionar isso ao seu .ssh/config:
Match host server*
ProxyCommand ssh gw1 nc gw2 22
LocalForward 443 %h:443
Então, por exemplo, ssh server1
conectar-se-á através de gw1 a gw2 e encaminhará 443 de lá para server1.
O que isso faz: ProxyCommand
diz ao ssh para conectar-se primeiro ao gw1 e canalizar a saída padrão para nc gw2 22
, que encaminha esse fluxo para gw2 na porta 22. Isso cria um túnel para entrada padrão no cliente através de gw1 para gw2:22. ssh então abre uma segunda sessão ssh através desse túnel para gw2. Uma vez estabelecido, LocalForward
encaminha a porta 443 para server1 ( %h
sendo o nome do host que você forneceu na linha de comando).
Consulte man ssh_config para ler sobre Match e ProxyCommand.
Observe que, embora o comando seja ssh server1
, ele realmente conecta o ssh até gw2 e encaminha a porta 443 a partir daí. Um shell seria aberto no gw2, não no server1. Portanto, você pode querer executar ssh -N server1
, para evitar a abertura do shell, já que o objetivo é apenas encaminhar a porta. Infelizmente não há equivalente a -N em .ssh/config, mas você pode adicionar algo como LocalCommand wait
para conseguir a mesma coisa - o shell apenas esperaria até ser interrompido e não haveria nenhum prompt do shell.