Recientemente me encontré con un problema para crear un servidor web en casa usando un ordenador antiguo, así que decidí escribir sobre Carrier Grid NAT (CGNAT), que es lo que hace imposible enrutar puertos y acceso externo a servidores domésticos / servicios web. Afortunadamente hay una manera de evitar esta situación usando el protocolo SSH para enrutar los puertos a un servidor con acceso web externo, lo llamamos el túnel SSH.
Requisitos previos
- Abra SSH instalado en su equipo local
- Servidor web con acceso externo a Internet y servidor SSH instalado
Comenzando…
Tienes un servidor web en tu ordenador y te gustaría poder acceder a él fuera de tu red local, para ello necesitarás tener alguna máquina que tenga acceso externo, por ejemplo, una gota básica en digitalocia (5 doletas mensuales) que ya viene con SSH instalado y habilitado de forma predeterminada, también puedes consultar amazon y google cloud services , ofrecen algunos límites gratuitos e incluso un crédito inicial para usar.
No causar confusión, en este tutorial cada vez que me refiero al servidor, estoy hablando de la máquina que tiene una IP con acceso externo, es decir, la máquina creada en algún proveedor de nube como mencionamos anteriormente.
Configuración del servidor SSH
Suponiendo que está utilizando un servidor linux, Ubuntu por ejemplo, tendremos que editar algunos ajustes en el archivo /etc/ssh/sshd_config, busque la línea que contiene las propiedades AllowTcpForwarding y GatewayPorts para yes. Y luego tendrá que reiniciar el servidor SSH:
systemctl sshd
sudo servicio reiniciar sshd
Reenvío de puertos remotos
Imagine que tiene un servidor en su hogar y necesita acceder a él externamente, fuera de su red local. Para ello vamos a utilizar la funcionalidad de "Reenvío remoto de puertos", básicamente vamos a crear un túnel, una conexión al ordenador que queremos tener acceso externo en el servidor que tiene acceso externo, este servidor actuará con lo que llamamos proxy, sólo recibirá y enrutará a través de este túnel las solicitudes. Para ello utilizaremos el siguiente comando:
$ssh -R porta_remota:endereco_local:porta_local usuario@servidorexterno.com
Así que suponiendo que tenemos nuestro servidor web ejecutándose en el puerto 6060 y dejamos ese servidor accesible a través del puerto 8080 del servidor externo, usaríamos el siguiente comando:
$ssh -R 8080:localhost:6060 henrique@marquesfernandes.com
Si todo va bien, ahora cuando accedemos al servidor a través de la URL marquesfernandes.com:8080 (podría ser una IP también), la solicitud se enrutará al puerto 6060 de la máquina local y la respuesta devuelta al usuario.
Reenvío de puertos locales
Imagine que tiene una base de datos MySQL en su red de oficina que solo permite conexiones locales, y desea acceder a ese banco a través de un puerto local en su computadora. Usamos el siguiente comando:
ssh -L 4000:127.0.0.1:3306 user@example.com
Esto hará una conexión al puerto 4000
en su computadora. Cualquier solicitud que llegue a este puerto se reenviará al puerto 3306 desd
e el servidor externo, ahora puede conectar su cliente MySQL localmente en el puerto 4000.
SSH automático
Si desea mantener su túnel SSH siempre activo reiniciando en caso de desconexión, utilice el programa Auto SSH. Le permite monitorear túneles SSH y se encarga de todo el trabajo de reinicio en caso de caída, incluso puede dejarlo funcionando como un servicio de su máquina para la máxima persistencia.