ssh para ip privado

18

Eu tenho um computador com CentOS (computador A) configurado como IP 10.150.5.141 (com firewall restrito), posso acessar a Internet e meu ArchLinux VPS (computador B) com ip real wxyz

Como criar outro PC (computador C) que pode acessar o computador B para conectar-se ao computador A, mas o computador C não pode conectar-se diretamente ao computador A (porque está na rede privada de A)?

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

Desejo acessar o computador A usando o sshcomputador 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 ao roteador)

Eu quero algo como isto:

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

de modo que quando eu ssh w.x.y.z:vvvdo computador C ele será encaminhado para a rede privada 10.150.5.141:22.

Kokizzu
fonte

Respostas:

14

O que você está procurando é chamado de túnel reverso. sshfornece-o através do -Rinterruptor:

-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 lappye 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 sshseparadamente para o sistema remoto remoteye 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. logar 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 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 sshdas 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 sshdprocesso 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!

  1. logar em remotey

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

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

slm
fonte
existe uma maneira de fazer um túnel de 0.0.0.0:12346 para 127.0.0.1:12345 na mesma máquina?
Kokizzu
11
@Kokizzu - Eu tentei configurar isso e estou me envolvendo com o que você está pedindo. Encontrei isso que soa como o que você deseja, anattatechnologies.com/q/2012/08/chaining-ssh-tunnels . Vou tentar resolver isso mais tarde esta noite, fique à vontade para brincar com ele e me avise se você progredir.
slm
não é isso que eu quis dizer, eu quero que se ligam a wxyz: vvv2 em vez de 127.0.0.1 (no computador B), para que outras pessoas podem usá-lo também ..
Kokizzu
11
@Kokizzu - veja as atualizações.
slm
2

Como o computador B não pode acessar o computador A, será necessário abrir um túnel remoto do computador A primeiro.

ssh user@computerB -R vvv:localhost:22
Ignacio Vazquez-Abrams
fonte
obrigado, mas existe uma maneira de abrir uma porta no IP da eth0 que foi encaminhada para um serviço que ouviu localhost?
Kokizzu
1

deixa pra lá, encontrei 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
Kokizzu
fonte