Estoy intentando sortear la NAT de nivel de operador de mi ISP y aún poder acceder a mi servidor Plex desde el exterior.
Encontré dos guías:
http://www.donaldsimpson.co.uk/2016/10/24/tunneling-out-of-carrier-grade-nat-cgnat-with-ssh-and-aws/
https://amoss.me/2017/05/port-forwarding-behind-a-carrier-grade-nat/
Para implementar tengo una VM ubuntu 16.04 alojada en digitalocean, que tiene una IP pública. Puedo hacer ssh desde mi servidor plex (también ubuntu 16.04) al servidor remoto de digital ocean.
En mi servidor Plex ejecuto el siguiente comando:
ssh -nNTv -R 32400:localhost:32400 root@<public IP of remote host>
Y déjalo ejecutándose en una pantalla.
El túnel es un éxito. Desde el host remoto aquí está netstat y nc -v a la interfaz loopback:
root@Ubuntu1604:~/.ssh# nc -v 127.0.0.1 32400
Connection to 127.0.0.1 32400 port [tcp/*] succeeded!
root@Ubuntu1604:~/.ssh# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:32400 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 ::1:32400 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
root@Ubuntu1604:~/.ssh#
Pero como puede ver, no está escuchando en su IP pública. La única otra interfaz activa además del loopback es eth0, a la que se le asigna la dirección IP pública. Entonces, si intento acceder a remote server public IP
:32400, no obtengo nada.
¿Cómo consigo que mi servidor remoto escuche en 32400 eth0 y al mismo tiempo lo reenvíe a mi servidor local: 32400?
Respuesta1
Ya tenía una dirección de enlace vacía, el problema era que necesitaba especificar el enlace a todas las direcciones, así:
ssh -nNTv -R 0.0.0.0:32400:localhost:32400 root@<public IP of remote host>
Respuesta2
Deman 1 ssh
:
-R [bind_address:]port:host:hostport
[…]
De forma predeterminada, el socket de escucha en el servidor estará vinculado únicamente a la interfaz de bucle invertido. Esto se puede anular especificando un archivo
bind_address
. Un vacíobind_address
, o la dirección*
, indica que el socket remoto debe escuchar en todas las interfaces. La especificación de una dirección de enlace remota solo será exitosa si laGatewayPorts
opción del servidor está habilitada (versshd_config(5)
).
Entonces, lo más fácil de intentar primero es especificar un vacío bind_address
:
-R :32400:localhost:32400
Tenga en cuenta la inicial :
, hace la diferencia.