Problema del túnel SSH inverso de Apple

2

He intentado configurar túneles SSH inversos desde fuera de mi red a mi casa, pero no he conseguido ningún lugar. Mi configuración es todo Apple: dos Mac detrás de un Airport Extreme, uno en x.x.x.20 escuchando en el puerto 22 y el otro en x.x.x.30 escuchando en 10,022. He configurado NAT en el AP para reenviar los puertos externos 22 a x.x.x.20 y 10,022 a x.x.x.30. Quiero que el túnel se ejecute a x.x.x.20: 10022.

He estado usando este comando desde un dispositivo Apple fuera de mi red doméstica: ssh -v -f -N -R 22:localhost:10022 [email protected] así como ssh -v -f -N -R 10022:localhost:22 [email protected] pero de cualquier manera, los registros en la máquina de escucha xxx20: 22 muestran que el tráfico va hacia allí y la máquina xxx30: 10022 no muestra ningún registro en el archivo secure.log. Incluso he intentado ssh -v -f -N -R 10022:localhost:10022 [email protected] y el tráfico todavía llega a la máquina de escucha x.x.x.20: 22.

Lo extraño es que cuando ejecuto ssh -p 10022 [email protected] se conecta a la máquina de escucha x.x.x.30: 10022 bien. También he revisado todas las reglas de NAT en el aeropuerto y solo hay una regla que cubre el puerto 10022, por lo que no es un problema de NAT en lo que respecta a la configuración del AP.

O estoy haciendo algo realmente mal, hay un error en la implementación de los túneles SSH inversos de Apple o que el Aeropuerto está haciendo algo raro con el tráfico. ¿Alguien más ha tenido este problema o ha encontrado una solución?

La guía que estoy ejecutando para hacer funcionar el túnel inverso es enlace

Gracias de antemano!

    
pregunta Scottmeup 17.02.2013 - 08:01

1 respuesta

2

Para evitar confusiones, llamaré :

  • x.x.x.20 - > local1
  • x.x.x.30 - > local2
  • Dispositivo Apple fuera de su red doméstica - > remote1

Usted dice:

  

He configurado NAT en el AP para reenviar los puertos externos 22 a x.x.x.20   y de 10022 a x.x.x.30.

que interpreto así:

                 ________                 +-----------------+         +-----------+
                /        \ -  port 22 ----|-----------------|------>  | local1:22 |                                  
+---------+    (          )               |                 |         +-----------+
| remote1 | -  ( Internet )               | Airport Express |                                     
+---------+    (          )               |                 |         +--------------+
                \________/ -  port 10022 -|-----------------|------>  | local2:10022 |  
                                          +-----------------+         +--------------+

Es decir, se puede acceder a local2 en [dirección IP pública de Airport Extreme]: 10022.

Sin embargo, los comandos ssh que ejecuta en su pregunta usan el puerto SSH predeterminado (es decir, 22 / tcp) y se conectan a local1: 22 (más exactamente: se conectan a [ Dirección IP pública de Airport Extreme]: 22, que reenvía la conexión a local1: 22).

Debe modificar el comando ssh que ejecuta en remote1 como este (observe la opción -p 10022 ):

remote1$ ssh -p 10022 -f -N -R 2222:localhost:22 [username at local2]@[public IP address of Airport Extreme]

-p 10022 le dice a ssh a qué puerto conectarse, mientras que 2222:localhost:10022 le dice a ssh que asigne un socket en local2 para escuchar el puerto 2222 y reenviar cualquier paquete enviado a ese puerto al puerto 22 en remoto1:

 +------------+                         +----------------------+
 |            |                         |                      |
 | remote1:xx | -- SSH (port 10022)-->  | local2:10022 (SSH)   |
 |            |                         |                      |
 | remote1:22 | <--- SSH tunnel ------  | local2:2222 (alloc'd |
 |            |                         |              by ssh) |
 +------------+                         +----------------------+

Ahora puede acceder a remote1 desde local2 de la siguiente manera:

 local2$ ssh -p 2222 remoteuser@localhost

(Usted usa -f en su comando que envía ssh al fondo. El proceso sshd que se enlaza al puerto 2222 y se ejecuta en local2 continuará ejecutándose incluso si detiene el inicio de sesión remoto en las Preferencias del sistema:

Para detenerlo, enumérelo:

local2$ lsof -i | grep 2222
local2$ sshd   855 jaume   14u  IPv6 0x4857f   0t0  TCP localhost:2222 (LISTEN)

y mátalo con kill <PID> :

local2$ kill 855

donde PID es el segundo valor en la línea de salida de lsof .)

    
respondido por el jaume 18.02.2013 - 23:47

Lea otras preguntas en las etiquetas