
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 -R
opción significa que desea que el lado remoto se vincule solo a la interfaz de bucle invertido. Desde la ssh
pá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:hostport
se unirá solo al loopback-R :port:host:hostport
se unirá a todas las interfaces- como voluntad
-R *:port:host:hostport
y-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_address
en 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:hostport
y se aplica el comportamiento predeterminado, es decirTCP 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_address
puede tomar varios valores, uno de los valores posibles es efectivamente uncuerda vacía! Entonces, agregar dos puntos a la opción significa que especificamos unbind_address
esta vez, aunque esté vacío (lo que, según la descripción, significathe remote socket should listen to all interfaces
.
Espero que esto te quede un poco más claro, básicamente ¡ not specifying a bind_address
y specifying an empty string as bind_address
son dos cosas diferentes! La "cadena vacía" bind_address se considera una dirección de enlace y se refiere al uso de :PORT:IP:PORT
sintaxis 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 5555
hace 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 comp
o0.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.