Cómo acceder a un servidor Linux detrás de NAT a través del túnel inverso SSH
Configuración de un túnel inverso SSH en Linux
Veamos cómo configurar y utilizar un túnel inverso SSH. Supongamos que la configuración es la siguiente. Configuraremos un túnel inverso SSH desde el servidor doméstico (homeserver) al servidor de retransmisión (relayserver) para que podamos conectarnos al servidor doméstico a través de SSH desde otra computadora llamada computadora cliente a través del servidor de retransmisión. La dirección IP pública del servidor de retransmisión es 1.1.1.1.
En el servidor maestro, abra una conexión SSH al servidor de retransmisión como se muestra a continuación.
homeserver~$ ssh -fN -R 10022:localhost:22 Relayserver_user@1.1.1.1
El puerto 10022 aquí puede ser cualquier número de puerto elegido. Sólo asegúrese de que el puerto no esté siendo utilizado por otros programas en el servidor de retransmisión.
La opción "-R 10022:localhost:22 " define un túnel inverso.
Al usar la opción "-fN", SSH pasará directamente a segundo plano una vez que se haya autenticado e iniciado sesión exitosamente en el servidor SSH. Esta opción es útil si no desea ejecutar ningún comando en el servidor SSH remoto, sino que solo desea reenviar el puerto, como en el ejemplo de este artículo.
Después de ejecutar el comando anterior, regresará directamente al símbolo del sistema en el servidor principal.
Inicie sesión en el servidor de retransmisión y verifique que 127.0.0.1:10022 esté vinculado a sshd.
relayserver~$ sudo netstat -nap | grep 10022
tcp 0 0 127.0.0.1:10022 0.0.0.0:* ESCUCHA 8493/sshd
Ahora funciona Establezca un túnel inverso desde cualquier otra computadora (como una computadora cliente), inicie sesión y acceda al servidor de retransmisión. Luego acceda al servidor principal como se muestra en la siguiente figura.
relayserver~$ ssh -p 10022 homeserver_user@localhost
Una cosa a tener en cuenta es que la información de inicio de sesión SSH/contraseña que ingreses para localhost debe ser para el servidor principal, no para el relé. servidor, ya que está iniciando sesión en su punto final local a través de un túnel hacia el servidor principal. Por lo tanto, no ingrese la información de inicio de sesión/contraseña del servidor de retransmisión. Después de iniciar sesión correctamente, podrá acceder al servidor principal.
Conéctese directamente a un servidor detrás de una NAT a través de un túnel inverso SSH
Si bien el método anterior le permite conectarse al servidor principal detrás de una NAT, deberá iniciar sesión dos veces. , primero al servidor de retransmisión y luego inicie sesión en el servidor principal. Esto se debe a que el punto final del túnel SSH en el servidor de retransmisión está vinculado a la dirección de retorno (127.0.0.1).
Pero en realidad, sólo necesita iniciar sesión en el servidor de retransmisión una vez para conectarse directamente al servidor principal detrás de NAT.
Para hacer esto, debe habilitar sshd en el servidor de retransmisión para reenviar puertos no solo desde la dirección de retorno, sino también desde el host externo. Esto se logra especificando la opción GatewayPorts en sshd que se ejecuta en el servidor de retransmisión.
Abra /etc/ssh/sshd_conf en el servidor de retransmisión y agregue la siguiente línea.
servidor de retransmisión~$ vi /etc/ssh/sshd_conf
Cliente GatewayPorts especificado
Reiniciar sshd.
Sistema Debian:
relayserver~$ sudo /etc/init.d/ssh restart
Sistemas basados en Red Hat:
relayserver~$ sudo systemctl restart sshd
Ahora bien, podría ser una buena idea configurar un túnel inverso SSH comenzando desde el servidor principal, como se muestra a continuación.
homeserver~$ ssh -fN -R 1.1.1.1:10022:localhost:22 Relayserver_user@1.1.1.1
Inicie sesión en el servidor de retransmisión y utilice el comando netstat para verificar si El túnel inverso SSH se configuró correctamente.
servidor de retransmisión~$ sudo netstat -nap | grep 10022
tcp 0 0 1.1.1.1:10022 0.0.0.0:* ESCUCHE 1538/sshd: dev
A diferencia de la situación anterior, el punto final del túnel ahora es 1.1.1.1.10022 (la dirección IP pública del servidor de retransmisión) en lugar de 127.0.0.1:10022. Esto significa que es posible conectarse al punto final del túnel desde un host externo.
Ahora se puede acceder al servidor maestro detrás de NAT desde cualquier otra computadora, como la computadora cliente, ingresando el siguiente comando.
clientcomputer~$ ssh -p 10022 homeserver_user@1.1.1.1
En el comando anterior, aunque 1.1.1.1 es la dirección IP pública del servidor de retransmisión, homeserver_user debe ser el usuario cuenta asociada con el servidor maestro. Esto se debe a que el host en el que realmente inició sesión es el servidor principal, no el servidor de retransmisión. Este último simplemente reenvía su tráfico SSH al servidor principal.
Configurar un túnel inverso SSH persistente en Linux
Por supuesto, ya sabes cómo configurar un túnel inverso SSH, pero ahora es el momento de hacer que el túnel sea "persistente". que esté listo para ejecutarse (sin importar la situación que encuentre: congestión temporal de la red, tiempos de espera de SSH, reinicios del host de retransmisión, etc.). Después de todo, no puedes conectarte de manera confiable a tu servidor doméstico si el túnel no siempre funciona.
Para establecer un túnel persistente, usaré una herramienta llamada autossh. Como sugiere el nombre, este programa le permite reiniciar automáticamente su sesión SSH si se desconecta por algún motivo. Por lo tanto, es útil mantener un túnel inverso SSH para mantener una conexión persistente.
Como primer paso, vale la pena configurar un mecanismo de inicio de sesión SSH sin contraseña desde el servidor principal al servidor de retransmisión. De esta manera, autossh puede reiniciar un túnel inverso SSH roto sin intervención del usuario.
A continuación, instale autossh en el servidor maestro donde se iniciará el túnel.
Ejecute autossh en el servidor maestro con las siguientes variables para crear un canal SSH persistente al servidor de retransmisión.
servidor doméstico~$ autossh -M 10900 -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" - R 1.1.1.1:10022:localhost:22 reléserver_user@1.1.1.1
La opción "-M 10900 " especifica el puerto de monitoreo en el servidor de retransmisión para intercambiar datos de prueba para monitorear sesiones SSH. Este puerto no debe ser utilizado por ningún programa en el servidor de retransmisión.
La opción "-fN " pasada al comando ssh permite que el canal SSH se ejecute en segundo plano.
La opción "-o XXXX " indica a ssh que haga lo siguiente: Usar autenticación de clave en lugar de autenticación de contraseña. Acepte automáticamente claves de host SSH (desconocidas). Los mensajes de mantenimiento se intercambian cada 60 segundos. Envíe un máximo de 3 mensajes de mantenimiento y no acepte respuestas.
Las opciones restantes relacionadas con el túnel inverso SSH son las mismas que antes.
Si desea que el túnel SSH se establezca automáticamente inmediatamente después del inicio, puede agregar el comando autossh anterior en /etc/rc.local.