¿Cómo configurar el túnel ssh para reenviar ssh?

13

Tengo una computadora con Ubuntu detrás del enrutador que no puedo configurar. Sin embargo, quiero tener acceso ssh a esa computadora. Creo que es posible con el túnel ssh, pero no sé cómo hacerlo. Tengo otro servidor en el que me gustaría configurar la tunelización. ¿Cómo hacerlo? ¿O tal vez tienes alguna otra idea de cómo resolver este problema?

Lo intenté:

ssh -N user@my_server -L 22/localhost/8090

pero dice:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 22
Could not request local forwarding.
klew
fuente

Respuestas:

18

Le está pidiendo que escuche en su puerto local 22 y reenvíe las conexiones al puerto 8090 de un sistema remoto. No puede hacer eso, porque su puerto local 22 ya está ocupado por su servidor SSH local.

Creo que lo que estás buscando es el reenvío remoto. Reemplazar -L 22:localhost:8090con -R 8090:localhost:22le indicará al host remoto que escuche en el puerto 8090 y reenvíe las solicitudes a su servidor SSH.

Si deja la conexión en funcionamiento para poder ingresar más tarde desde un sitio remoto, entonces querrá asegurarse de que la conexión no se agote debido a la inactividad agregando las opciones relevantes ( -o TCPKeepAlive=yeso -o ServerAliveInterval=30)

Entonces terminarás con algo como:

ssh -N user@my_server -R 8090:localhost:22 -o ServerAliveInterval=30

Además, si uno de los saltos de red entre usted y el servidor está inactivo en algún momento, la conexión se cortará a pesar de las opciones de KeepAlive que especifique, por lo que es posible que desee agregar este comando a inittab, o buscar en el paquete daemontools o en su distribución equivalente, para que siempre se inicie en el arranque y se reinicie cuando salga por alguna razón que no sea el apagado del sistema (o podría ejecutarlo desde un script de shell que se repite infinitamente, pero init o daemontools son soluciones más limpias).

David Spillett
fuente
Casi funciona Puedo conectarme a mi computadora, pero solo puedo hacerlo cuando estoy conectado al servidor. Me gustaría conectarme a través de ese puerto desde cualquier lugar.
klew
3
Si agrega la dirección pública del servidor o un comodín a la definición de reenvío de puerto (-R 111.222.333.444:8090:localhost:22 o -R *: 8090: localhost: 22), eso puede funcionar, aunque ese tipo de cosas se puede deshabilitar en el servidor. Si el servidor es uno que usted controla, asegúrese de que la opción GatewayPorts esté habilitada en sshd_config.
David Spillett
Escribí un script que me ayuda a hacer túneles ssh, puedes consultarlo en: github.com/gdbtek/ssh-tunneling
Nam Nguyen
Agregar GatewayPorts Yesa mi sshd_config me ayudó a abrir el puerto al público.
Adam F
8

La razón por la que no puede hacer esto es porque está intentando reenviar el puerto 22 en la computadora local al puerto 8090 en el servidor remoto y algo ya se está ejecutando en el puerto 22 en el servidor local. Lo más probable es que tenga un servidor SSH en ejecución. Puede solucionar esto cambiando el 22 a un valor diferente. Puede verificar si un puerto está libre ejecutando:

# netstat -lep --tcp

Esto enumera todos los enchufes de escucha, por lo que si el puerto no está en la lista, entonces es gratis.

David Pashley
fuente
3

Estoy usando el comando lsof -i: PortNumber para verificar si el puerto está libre:

# lsof -i :2272

Si el puerto está libre, no verá nada en la salida.

Taras
fuente