Estoy haciendo un túnel inverso SSH y no puedo conectarme al túnel.

Estoy haciendo un túnel inverso SSH y no puedo conectarme al túnel.

Tengo una caja de Windows 11 que ejecuta IIS en 127.0.0.1 en el puerto 80, que está conectado a Internet a través de un CGNAT. También tengo un VPS de Linode (un proveedor de VPS). La dirección IP del VPS es 139.162.19.185. Quiero conectarme a servidores/puertos en mi equipo Windows 11 desde cualquier otro lugar de Internet, a través de mi VPS.

Ejecuté el siguiente comando usando el símbolo del sistema de Windows 11 en modo Administrador:

ssh -R 80:localhost:80 [email protected]

Cuando intento acceder al túnel SSH en mi VPS usandohttp://139.162.19.185:80, Me rechazan la conexión, pero cuando intento acceder a mi host local usandohttp://127.0.0.1, Veo la página de inicio de IIS Start.

Revisé el archivo /etc/ssh/sshd_config y GatewayPorts y AllowTcpForwarding están habilitados.

ACTUALIZAR:

Estos son los resultados de netstat -tlnp

root@localhost:~# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      35027/sshd: root@pt
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      434/sshd: /usr/sbin
tcp6       0      0 ::1:80                  :::*                    LISTEN      35027/sshd: root@pt
tcp6       0      0 :::22                   :::*                    LISTEN      434/sshd: /usr/sbin
root@localhost:~#

Los resultados del curl son los siguientes:

root@localhost:~# curl http://127.0.0.1:80
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>
root@localhost:~#

¿Hay algún archivo de configuración que deba editar? Intenté depurar un poco para ver si hay firewalls en Linode. Instalé Apache2 y funciona bien en el puerto 80, por lo que el puerto 80 no está bloqueado.

Respuesta1

La forma en que está utilizando la -Ropción significa que desea que el lado remoto se vincule solo a la interfaz de bucle invertido. Desde la sshpágina del manual:

     -R [bind_address:]port:host:hostport

     ...

             By default, TCP listening sockets on the server will be bound to the loopback interface only.  This may be overridden by
             specifying a bind_address.  An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on
             all interfaces.  Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see
             sshd_config(5)).

Simplificado esto significa:

  • -R port:host:hostportse unirá solo al loopback
  • -R :port:host:hostportse unirá a todas las interfaces
  • como voluntad -R *:port:host:hostporty-R 0.0.0.0:port:host:hostport

Entonces, en su situación, cualquiera de estos debería funcionar:

ssh -R :80:localhost:80 [email protected]
ssh -R *:80:localhost:80 [email protected]
ssh -R 0.0.0.0:80:localhost:80 [email protected]

*A continuación mi intento original de explicar este comportamiento basado en el texto de la documentación, con algunas aclaraciones.

Utilizó la sintaxis PORT:IP:PORT, que no especificaba una dirección de enlace.

El texto specifying a bind_addressen la descripción anterior se refiere a que hay un :puerto antes del puerto remoto (el primer puerto en PUERTO:IP:PUERTO). Tal como lo tiene en su ejemplo, no hay :, lo que significa que no especificó un bind_address y, de acuerdo con la página de manual, el lado remoto se vinculará solo a la interfaz loopback (predeterminada). Para vincularse a todas las interfaces, debe especificar una dirección de enlace (es decir, agregar una :antes del puerto remoto), incluso si la dirección de enlace real es una "cadena vacía". *En este caso, funcionaría una "cadena vacía" o una , pero tenga en cuenta que :es obligatorio que no se limite a vincularse únicamente a la dirección de bucle invertido.

Actualizar

Después de los comentarios de @barlop, parece que mi explicación no quedó muy clara, así que intento aclarar las cosas aquí paso a paso:

  • La opción se define como -R [bind_address:]port:host:hostport.
  • Toda la [bind_address:]parte es opcional. Si no está presente, entonces la opción tiene el formato -R port:host:hostporty se aplica el comportamiento predeterminado, es decir TCP listening sockets on the server will be bound to the loopback interface only.
  • Si la [bind_address:]parte está presente, significa que tenemos el formato -R bind_address:port:host:hostport, observe que ahora el primero :ya no es opcional. A partir de este momento, bind_addresspuede tomar varios valores, uno de los valores posibles es efectivamente uncuerda vacía! Entonces, agregar dos puntos a la opción significa que especificamos un bind_addressesta vez, aunque esté vacío (lo que, según la descripción, significa the remote socket should listen to all interfaces.

Espero que esto te quede un poco más claro, básicamente ¡ not specifying a bind_addressy specifying an empty string as bind_addressson dos cosas diferentes! La "cadena vacía" bind_address se considera una dirección de enlace y se refiere al uso de :PORT:IP:PORTsintaxis sin escribir nada allí para la dirección, antes de los dos puntos del extremo izquierdo.

Aquí está el resultado de mi prueba (en un puerto diferente, pero con el mismo efecto):

Vea cómo se realiza SSH y se ejecuta netstat -an en la máquina remota.

gepa@localhost:~$ ssh -R :5555:localhost:5555 cloud1 netstat -an | grep :5555
tcp        0      0 0.0.0.0:5555            0.0.0.0:*               LISTEN     
tcp6       0      0 :::5555                 :::*                    LISTEN     

gepa@localhost:~$ ssh -R 5555:localhost:5555 cloud1 netstat -an | grep :5555
tcp        0      0 127.0.0.1:5555          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:5555                :::*                    LISTEN     

Observe cómo agregar a :antes del primero 5555hace que el host remoto escuche todas las interfaces en comparación con omitir el :.

Por cierto, es mucho más claro no utilizar una cadena vacía bind_address y escribir $ ssh -R *:5555:localhost:5555 compo0.0.0.0:80:localhost:80

Además, la razón por la que la sintaxis PORT:IP:PORT se vincula a 127.0.0.1 es por razones de seguridad. Entonces, si desea que se vincule de manera no local, es mejor si lo deja muy claro, por ejemplo, con un comodín o especificando 0.0.0.0 o especificando una dirección LAN si solo se conecta desde su LAN.

información relacionada