El reenvío de puertos SSH permite la penetración en la intranet
"La distancia más lejana del mundo es cuando tú solicitas en la red externa y yo pruebo en la red interna".
El contenido de esta oración es particularmente fácil de entender para los desarrolladores. . En muchos casos, nuestros entornos de desarrollo y prueba se encuentran en la intranet de la empresa y solo pueden conectarse y operarse a través de máquinas ubicadas en la intranet. Las máquinas ubicadas en la red externa no pueden conectarse al entorno de la intranet. Por ejemplo, si trabajamos en casa los fines de semana y la máquina de casa no está en el entorno de intranet de la empresa, ¿cómo debemos conectarnos al entorno de intranet? ¿Es posible que todavía tengamos que ir a trabajar horas extras los fines de semana?
La respuesta es no. Esta es una necesidad común y urgente, llamada "penetración de intranet". Aquí utilizamos la tecnología de reenvío de puertos SSH para resolver este problema.
Supongamos que el host1 y el host2 están ubicados en la red interna, y el host3 está ubicado en la red externa. El host3 puede conectarse al host1 y al host2, pero el host1 no puede conectarse al host3 y. anfitrión2. Lo que tenemos que hacer es permitir que el host1 se conecte al host2 a través del host3 ubicado en la red externa.
Primero, realice las siguientes operaciones en el host1:
Entre ellas, el parámetro -L especifica "puerto de host local: host de destino: puerto de host de destino". Esto significa que el host1 sirve como servidor sshd, escucha su propio puerto 2222 y luego reenvía todos los datos al puerto 22 del host2 a través del host3.
En este caso, el host1 no puede conectarse al host3, pero debido a la configuración del host1, se establece un "túnel SSH" desde el host1 al host3.
Luego, realice las siguientes operaciones en host1:
Entre ellas, el parámetro -p especifica el puerto de la conexión ssh, el valor predeterminado es 22 y aquí se especifica el puerto 2222. . Esto significa que deje que el host1 sirva como cliente ssh y se conecte a su propio puerto 2222, lo que equivale a conectarse al puerto 22 del host2.
En circunstancias normales, host2 y host3 son un solo host. En otras palabras, siempre que nos conectemos al host3, conectarnos al host2 no es un problema.
En este momento, los comandos se convierten a:
En esencia, el reenvío de puerto local SSH implementa principalmente los dos aspectos siguientes:
Suponga que host1 y host2 están ubicados en la red interna y que host3 está ubicado en la red externa. Host1 puede conectarse a host3 y host2, pero host3 no puede conectarse a host1 y host2. Lo que tenemos que hacer es permitir que el host3 se conecte al host2 a través del host1 ubicado en la intranet, esto es para lograr la llamada "penetración de la intranet".
Primero, realice las siguientes operaciones en el host1:
Entre ellas, el parámetro -R especifica "puerto de host remoto: host de destino: puerto de host de destino". Esto significa que el host3 sirve como servidor sshd, escucha su propio puerto 2222 y luego reenvía todos los datos al puerto 22 del host2 a través del host1.
En este caso, el host3 no puede conectarse al host1, pero debido a la configuración del host1, se establece un "túnel inverso SSH" desde el host1 al host3.
Luego, realice las siguientes operaciones en host3:
Entre ellas, el parámetro -p especifica el puerto de la conexión ssh, el valor predeterminado es 22 y aquí se especifica el puerto 2222. . Esto significa que deje que host3 sirva como cliente ssh y se conecte a su propio puerto 2222, lo que equivale a conectarse al puerto 22 de host2.
En circunstancias normales, host2 y host1 son el mismo host. En otras palabras, siempre que nos conectemos al host1, conectarnos al host2 no es un problema.
En este momento, los comandos se convierten a:
En esencia, el reenvío de puerto remoto SSH logra principalmente los dos aspectos siguientes:
Penetración de intranet, Para poner simplemente, use el host ubicado en la red externa para conectarse al host ubicado en la red interna, lo cual es consistente con el reenvío de puerto remoto SSH. Sin embargo, en situaciones reales, las conexiones SSH a menudo se desconectan debido a problemas de un tipo u otro, por lo que tenemos que restablecer una conexión con el host de la red externa en el host de la red interna, es decir, mantener este "túnel inverso SSH". , autossh puede realizar la función de reconexión automática después de desconectar la conexión.
El uso de autossh es similar al de ssh. Simplemente reemplace el comando ssh con el comando autossh, como se muestra a continuación:
Entre ellos, el parámetro -M especifica el puerto. autossh escucha. Tenga en cuenta que esto es diferente de Los puertos reenviados deben distinguirse.
Además, -N significa prohibir la ejecución de comandos remotos y -T significa prohibir la asignación de pseudo terminales. La combinación de estos dos parámetros significa que la conexión SSH no permite a los usuarios interactuar. realiza operaciones remotas y solo se puede utilizar para transmitir datos, por lo que se garantiza la seguridad del host remoto.
Cada vez que restableces una conexión, autossh necesita confirmar tu identidad de inicio de sesión. Para garantizar la reconexión automática, el requisito previo es implementar el inicio de sesión automático.
Un enfoque común es utilizar el inicio de sesión con clave pública para iniciar sesión sin contraseña y transferir la clave pública del host1 al host3. De esta manera, cada vez que inicie sesión a través de SSH, host3 enviará una cadena aleatoria a host1. Host1 cifra los datos con su propia clave privada y luego los devuelve. Luego, host3 usa la clave pública previamente almacenada para descifrar los datos devueltos. Si tiene éxito, demuestra que la identidad del host1 es confiable y permite el inicio de sesión directo sin requerir una contraseña.
Otra forma es utilizar sshpass para transmitir la contraseña en texto claro a autossh, como se muestra a continuación:
Entre ellos, el parámetro -p especifica la contraseña de inicio de sesión. Además del formulario de entrada de contraseña de la línea de comando, sshpass también incluye -f, -e y otros parámetros, que admiten respectivamente contraseñas de entrada de archivos y formularios de entrada de contraseñas variables de entorno del sistema, como se muestra en la figura.
Para lograr la penetración en la intranet, además de reenviar el puerto 22, también podemos reenviar puertos de otras aplicaciones, como el puerto 80 de servicios web, el puerto 3306 de mysql, etc. Aquí no entraré en detalles uno por uno.