O que você está procurando é chamado de túnel reverso. ssh
fornece-o através do -R
interruptor:
-R [bind_address:]port:host:hostport
Specifies that the given port on the remote (server) host is to
be forwarded to the given host and port on the local side. This
works by allocating a socket to listen to port on the remote side,
and whenever a connection is made to this port, the connection is
forwarded over the secure channel, and a connection is made to host
port hostport from the local machine.
Como o OP descobriu com a resposta, a sintaxe é a seguinte:
$ ssh -f -N -R vvv:localhost:22 w.x.y.z
Exemplo
Eu tenho 2 computadores na rede lappy
e remotey
. Então, eu executo o seguinte comando em lappy
:
$ ssh -f -N -R 12345:localhost:22 remotey
Posso confirmar que está funcionando:
$ ps -eaf|grep "[l]ocalhost:22"
saml 27685 1 0 11:10 ? 00:00:00 ssh -f -N -R 12345:localhost:22 remotey
Agora, se eu for ssh
separadamente para o sistema remoto remotey
e executar este comando, posso ver que agora ele está aceitando conexões na porta 12345 na interface local do sistema remoto:
$ netstat -an|grep :12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
tcp 0 0 ::1:12345 :::* LISTEN
Testando a conexão
Você pode ver que o túnel ssh reverso está funcionando da seguinte maneira.
logar em remotey
[user@lappy ~]$ ssh remotey
teste a porta do túnel reverso
[user@remotey ~]$ ssh -p 12345 localhost
agora deve estar de volta na lappy
user@localhost's password:
Last login: Thu Aug 1 17:53:54 2013
/usr/bin/xauth: creating new authority file /home/user/.Xauthority
[user@lappy ~]$
Portas em interfaces diferentes de localhost (lo
)?
Você pode ficar coçando a cabeça se tentar um comando como este e ele parece não funcionar, ou sempre se liga a uma porta no host local (lo
interface ).
Por exemplo:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
NOTA: Este comando diz para abrir a porta 12345 @ remotey e encapsular todas as conexões na porta 22 @ lappy.
Em seguida, no remotey:
remotey$ netstat -an|grep 12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
O que está acontecendo é que sshd
as configurações não estão permitindo que você faça isso. De fato, sem esse recurso ativado ( GatewayPorts
), você não poderá vincular nenhumssh
porta de túnel a nada, exceto localhost.
Ativando GatewayPorts
remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no
Para habilitá-lo, edite este arquivo /etc/ssh/sshd_config
:
GatewayPorts clientspecified
E reinicie sshd
:
remotey$ sudo service sshd restart
Agora tente novamente e veremos o efeito que estamos buscando:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
E verifique novamente desta vez no remotey:
remotey$ netstat -anp | grep 12345
tcp 0 0 192.168.1.3:12345 0.0.0.0:* LISTEN 9333/sshd
NOTA: No exemplo acima, podemos ver que o sshd
processo agora está escutando na interface que possui o endereço IP 192.168.1.3, para conexões na porta 12345.
Testando a conexão (parte deux)
Agora, com nossa configuração alterada, quando a testarmos desta vez. A principal diferença é que não precisamos mais nos conectar ao localhost!
logar em remotey
[user@lappy ~]$ ssh remotey
testar conexão reversa
[user@remotey ~]$ ssh -p 12345 remotey
agora deve estar de volta na lappy
root@remotey's password:
Last login: Wed Aug 21 01:49:10 2013 from remotey
[user@lappy ~]$
Referências