ssh para private-ip

15

Eu tenho um computador com CentOS (computador A) que configurado como tem um ip privado 10.150.5.141 (com firewall restrito), pode acessar internet e meu ArchLinux VPS (computador B) com ip real w.x.y.z

Como posso fazer outro pc (computador C) que poderia acessar o computador B para se conectar ao computador A, mas o computador C não pode se conectar ao computador A diretamente (porque está na própria rede privada da A)?

Eu sei que um túnel pode abrir portas locais para outro computador: porta, mas como fazer o contrário?

Desejo acessar o computador A usando ssh pelo computador B, mas o computador B não pode acessar o computador A, porque a rede no computador A é restritiva (pode sair, mas não pode entrar, porque não tenho acesso a seu roteador)

Eu quero algo assim:

ssh -connect-to w.x.y.z:22 -open-port vvv -forward-to 10.150.5.141 -port 22

para que, quando eu ssh w.x.y.z:vvv do computador C, ele seja encaminhado para a rede privada 10.150.5.141:22 .

    
por Kokizzu 20.08.2013 / 13:21

3 respostas

11

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.

  1. faça o login em remotey

    [user@lappy ~]$ ssh remotey
    
  2. teste a porta do túnel reverso

    [user@remotey ~]$ ssh -p 12345 localhost
    
  3. 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!

  1. faça o login em remotey

    [user@lappy ~]$ ssh remotey
    
  2. teste a conexão reversa

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. 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

por 20.08.2013 / 17:34
2

Como o computador B não pode acessar o computador A, você precisará abrir um túnel remoto do computador A primeiro.

ssh user@computerB -R vvv:localhost:22
    
por 20.08.2013 / 13:35
1

deixa pra lá, achei a resposta:

ssh -f -N -R vvv:localhost:22 w.x.y.z

do computador A

EDIT: TL; DR, solução correta:

ssh -f -N -R w.x.y.z:vvv:localhost:22 w.x.y.z
    
por 20.08.2013 / 13:36