ssh a private-ip

18

Tengo una computadora con CentOS (computadora A) que tiene una IP privada 10.150.5.141 (con firewall restringido), puede acceder a Internet y mi ArchLinux VPS (computadora B) con ip real wxyz

¿Cómo puedo hacer que otra computadora (computadora C) pueda acceder a la computadora B para conectarse a la computadora A, pero la computadora C no puede conectarse a la computadora A directamente (porque está en la red privada de A)?

Sé que un túnel puede abrir puertos locales a otra computadora: puerto, pero ¿cómo hacer lo contrario?

Quiero acceder a la computadora A usando la sshcomputadora B pero la computadora B no puede acceder a la computadora A, porque la red en la computadora A es restrictiva (puede salir, pero no puede entrar, porque no tengo acceso a su enrutador)

Quiero algo como esto:

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

para que cuando yo ssh w.x.y.z:vvvdesde la computadora C se reenvíe a la red privada 10.150.5.141:22.

Kokizzu
fuente

Respuestas:

14

Lo que estás buscando se llama túnel inverso. sshlo proporciona a través del -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 el OP descubrió con su respuesta, la sintaxis es la siguiente:

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

Ejemplo

Tengo 2 computadoras en la red, lappyy remotey. Entonces ejecuto el siguiente comando en lappy:

$ ssh -f -N -R 12345:localhost:22 remotey

Puedo 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

Ahora, si me dirijo por sshseparado al sistema remoto remoteyy ejecuto este comando, puedo ver que ahora está aceptando conexiones en el puerto 12345 en la interfaz local del 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      

Probar la conexión

Puede ver que el túnel ssh inverso funciona de la siguiente manera.

  1. iniciar sesión en remotey

    [user@lappy ~]$ ssh remotey
    
  2. probar el puerto de túnel inverso

    [user@remotey ~]$ ssh -p 12345 localhost
    
  3. ahora debería estar de vuelta en 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 ~]$ 
    

¿Puertos en interfaces que no sean localhost ( lo)?

Es posible que se quede rascándose la cabeza si prueba un comando como este y no parece funcionar, o siempre se vincula a un puerto en la lointerfaz localhost ( ).

Por ejemplo:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

NOTA: Este comando dice abrir el puerto 12345 @ remotey y hacer un túnel de las conexiones al puerto 22 @ lappy.

Luego en remoto:

remotey$ netstat -an|grep 12345
tcp        0      0 127.0.0.1:12345              0.0.0.0:*                   LISTEN   

Lo que está sucediendo es que sshdlas configuraciones no le permiten hacer esto. De hecho, sin esta función habilitada ( GatewayPorts), no podrá vincular ningún sshpuerto de túnel a otra cosa que no sea localhost.

Habilitar GatewayPorts

remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no

Para habilitarlo, edite este archivo /etc/ssh/sshd_config:

GatewayPorts clientspecified

Y reiniciar sshd:

remotey$ sudo service sshd restart

Ahora inténtalo de nuevo y deberíamos ver el efecto que buscamos:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

Y vuelva a verificarlo esta vez en forma remota:

remotey$ netstat -anp | grep 12345
tcp        0      0 192.168.1.3:12345           0.0.0.0:*                   LISTEN      9333/sshd

NOTA: En lo anterior podemos ver que el sshdproceso ahora está escuchando en la interfaz que tiene la dirección IP 192.168.1.3, para conexiones en el puerto 12345.

Probar la conexión (parte deux)

Ahora con nuestra configuración alterada cuando la probamos esta vez. ¡La diferencia principal es que ya no tenemos que conectarnos a localhost!

  1. iniciar sesión en remotey

    [user@lappy ~]$ ssh remotey
    
  2. probar la conexión inversa

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. ahora debería estar de vuelta en lappy

    root@remotey's password: 
    Last login: Wed Aug 21 01:49:10 2013 from remotey
    [user@lappy ~]$ 
    

Referencias

slm
fuente
¿Hay alguna manera de hacer un túnel de 0.0.0.0:12346 a 127.0.0.1:12345 en la misma máquina?
Kokizzu
1
@Kokizzu - Intenté configurar esto y me estoy envolviendo alrededor del eje sobre lo que estás pidiendo. Encontré esto que suena como lo que quieres, anattatechnologies.com/q/2012/08/chaining-ssh-tunnels . Intentaré resolverlo más tarde esta noche, siéntete libre de jugar con él y avísame si progresas con él.
slm
eso no es lo que quise decir, quiero que se una a wxyz: vvv2 en lugar de 127.0.0.1 (en la computadora B), para que otras personas puedan usarlo también ...
Kokizzu
1
@Kokizzu - ver actualizaciones.
slm
2

Como la computadora B no puede acceder a la computadora A, primero deberá abrir un túnel remoto desde la computadora A.

ssh user@computerB -R vvv:localhost:22
Ignacio Vazquez-Abrams
fuente
gracias, pero ¿hay alguna manera de abrir un puerto en la IP de eth0 que reenvíe a un servicio que escuchó localhost?
Kokizzu
1

no importa, encontré la respuesta:

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

desde la computadora A

EDITAR: TL; DR, solución correcta:

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