O que você está procurando é chamado de túnel reverso. ssh
fornece isso por meio da opção -R
:
-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 corro 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 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.
-
faça o login em
remotey
[user@lappy ~]$ ssh remotey
-
teste a porta do túnel reverso
[user@remotey ~]$ ssh -p 12345 localhost
-
agora deve estar de volta em 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 não parece funcionar, ou sempre se liga a uma porta na interface localhost ( lo
).
Por exemplo:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
NOTA: Este comando diz para abrir a porta 12345 @ remotey e encapsular quaisquer conexões para a porta 22 @ lappy.
Em seguida, na remota:
remotey$ netstat -an|grep 12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
O que está acontecendo é que as configurações de sshd
não permitem que você faça isso. Na verdade, sem esse recurso habilitado ( GatewayPorts
), você não poderá vincular nenhuma ssh
portas de túnel a nada, exceto a localhost.
Ativando o GatewayPorts
remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no
Para ativá-lo, edite este arquivo /etc/ssh/sshd_config
:
GatewayPorts clientspecified
E reinicie o sshd
:
remotey$ sudo service sshd restart
Agora tente novamente e devemos ver o efeito que estamos buscando:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
E verifique novamente desta vez em remotey:
remotey$ netstat -anp | grep 12345
tcp 0 0 192.168.1.3:12345 0.0.0.0:* LISTEN 9333/sshd
NOTA: Acima podemos ver que o processo sshd
agora está escutando na interface que tem o endereço IP 192.168.1.3, para conexões na porta 12345.
Testando a conexão (part deux)
Agora com a nossa configuração alterada quando testamos desta vez. A principal diferença é que não precisamos mais nos conectar ao host local!
-
faça o login em
remotey
[user@lappy ~]$ ssh remotey
-
teste a conexão reversa
[user@remotey ~]$ ssh -p 12345 remotey
-
agora deve estar de volta em lappy
root@remotey's password: Last login: Wed Aug 21 01:49:10 2013 from remotey [user@lappy ~]$
Referências
- Como fazer um túnel SSH reverso
- SSH / OpenSSH / PortForwarding
- túnel ssh por meio de vários saltos
- Como o trabalho de tunelamento SSH reverso funciona?
- ssh o tempo todo
- Invertendo uma conexão ssh
- encadeamento de túneis ssh
- Crie um túnel SSH dentro de uma cadeia de exemplos de túneis SSH
- Ignorando o firewall corporativo com encaminhamento reverso de porta ssh
- Encapsulamento de porta reversa