2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

¿Cómo hacer que el túnel ssh esté abierto al público?

Bueno, volviendo a la pregunta de este , estoy ejecutando el comando

ssh -R 8080:localhost:80 -N root@example.com

en un Mac. Sin embargo, el puerto que se está tunelizando no funciona públicamente. Estoy ejecutando dicho comando para que se pueda abrir el puerto local en el ordenador remoto. Y funciona al abrir el puerto en localhost en el ordenador remoto, pero cuando intento acceder a la dirección IP pública del ordenador remoto desde mi ordenador local el puerto no parece estar abierto. ¿Cómo puedo hacer que el túnel sea público en la IP para que cualquiera pueda acceder?

EDIT: Parece que la parte remota se vincula sólo en localhost en lugar de a todas las interfaces.

EDIT 2: El cliente es Mac OS X 10.6 y el servidor es Linux Mint, pero ambos son OpenSSH.

Respuestas (7)

368
368
368
2013-05-06 06:11:42 +0000

Si revisas la página man de ssh, encontrarás que la sintaxis para -R se lee:

-R [_bind\_address_:]_port_:_host_:_hostport_

Cuando se omite `bindaddress`_ (como en tu ejemplo), el puerto se vincula sólo a la interfaz de bucle invertido. Para que se vincule a todas las interfaces, utilice

ssh -R \*:8080:localhost:80 -N root@example.com

o

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

La primera versión se vincula a todas las interfaces individualmente. La segunda versión crea un enlace general sólo para IPv4, lo que significa que el puerto es accesible en todas las interfaces a través de IPv4. La tercera versión es probablemente equivalente a la primera, pero de nuevo crea un único bind a ::, lo que significa que el puerto es accesible a través de IPv6 de forma nativa y a través de IPv4 a través de direcciones IPv4-mapped IPv6 (no funciona en Windows, OpenBSD).   (Necesita las comillas porque de otra manera [::] podría ser interpretado como un glob.)

Tenga en cuenta que si utiliza el servidor OpenSSH sshd, la opción GatewayPorts del servidor debe estar habilitada (establecida en yes o clientspecified) para que esto funcione (compruebe el archivo /etc/ssh/sshd_config en el servidor). De lo contrario (el valor por defecto de esta opción es no), el servidor siempre forzará que el puerto esté vinculado únicamente a la interfaz de bucle invertido.

40
40
40
2013-04-28 03:34:48 +0000

Editar:

-g funciona para puertos reenviados locales, pero lo que quieres es un puerto reenviado inverso/remoto, que es diferente.

Lo que quieres es esto .

Esencialmente, en example.com, ponga GatewayPorts=clientspecified en /etc/ssh/sshd_config.

— respuesta anterior (incorrecta) —

Utilice la opción -g. De la página man de ssh:

-g Allows remote hosts to connect to local forwarded ports.
15
15
15
2013-10-29 12:09:40 +0000

Aquí está mi respuesta para completar:

Terminé usando ssh -R ... para el túnel, y usando socat encima para redirigir el tráfico de red a 127.0.0.1:

túnel enlazado a 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Otra opción es hacer un túnel sólo local encima, pero encuentro esto mucho más lento

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost

10
10
10
2016-08-01 22:37:07 +0000

También puede usar un doble forward si no quiere o puede cambiar /etc/ssh/sshd_config.

Primero reenviar al puerto temporal (por ejemplo 10080) en el dispositivo loopback en la máquina remota, luego usar el reenvío local allí para redirigir el puerto 10080 a 80 en todas las interfaces:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"
8
8
8
2013-04-28 13:58:50 +0000

Utiliza la opción de “puertos de entrada”.

ssh -g -R REMOTE_PORT:HOST:PORT ...

Para poder utilizarlo, probablemente tenga que añadir “GatewayPorts yes” al /etc/ssh/sshd_config de su servidor.

2
2
2
2019-06-03 20:09:02 +0000

Los hosts de salto ](https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_–_Passing_Through_a_Gateway_or_Two) son una adición bastante reciente a OpenSSH. Esto requiere acceso SSH al intermediario, pero debería funcionar sin configuración adicional.

ssh -J root@example.com remoteuser@localhost -p 8080

Este comando instruye a SSH para que primero se conecte a root@example.com, y luego, desde esa máquina, inicie una conexión al puerto 8080 en localhost (es decir, el puerto que se tuneliza desde el host de salto al host remoto) bajo el nombre de usuario remoteuser.

0
0
0
2018-08-26 15:50:49 +0000

Si quieres poner la configuración en tu ~/.ssh/config en lugar de usar parámetros de línea de comandos, puedes probar algo como

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Recuerda que el firewall de tu host remoto debe permitir las conexiones al 8080 y asegúrate de que la opción GatewayPorts de tu /etc/ssh/sshd config no está establecida en no