ssh a través de un enrutador sin reenvío de puertos

11

Tengo un servidor Linux y quiero ponerlo en una red doméstica detrás de un enrutador. Necesito enviar ssh a este servidor en algún momento desde el exterior, pero no quiero configurar el reenvío de puertos porque no tengo acceso al enrutador y tampoco conozco la ip del enrutador.

Lo que puedo hacer es poner algún programa en el servidor Linux, de modo que cuando esté conectado a Internet, envíe constantemente datos a mi otro servidor en línea para que sepa la dirección IP del mismo. Pero, ¿hay alguna forma de enviar ssh al servidor detrás del enrutador desde afuera? algo como NAT o socket que mantiene la conexión de red?

Muchas gracias

Jiechao Li
fuente

Respuestas:

24

Lo que querría hacer es ssh DESDE su "servidor Linux" A algo en el exterior, como "my_other_server" o algo más a lo que ambos servidores puedan acceder.

Usaría el reenvío de puerto remoto ssh.
[user@linux_server]$ ssh -R8022:localhost:22 my_other_server.com
Explicación: conéctese a my_other_server y abra el puerto 8022 allí, que me reenviará en el puerto 22.

Desde my_other_server.com podrá enviar ssh a localhost en el puerto 8022 y reenviar su tráfico a linux_server piggybacking en linux_server -> my_other_server tunnel [user@linux_server]$ ssh -p8022 localhost
Explicación: conectarme a mí mismo en el puerto 8022 que se reenvía a linux_server

Si tiene problemas con el abandono del túnel linux_server -> my_other_server inicial, puede hacer un script para mantenerlo abierto, ajustar la configuración de keepalive o usar autossh.

MattPark
fuente
1
Gracias, eso funciona muy bien! Quiero usar script para mantenerlo abierto. La otra pregunta es, ¿qué pasa si tengo como 1000 de estos 'servidores de Linux' y solo uno 'my_other_server'? ¿Puedo enviarlos a alguno de ellos de esta manera? Supongo que todos necesitan un puerto diferente y ¿hay una mejor manera de hacerlo?
Jiechao Li
Bueno eso depende. Ahora que está en linux_server, ¿podría simplemente pasar a linux_server2 y linux_server3 desde allí? Eso sería lo más fácil. Entonces, sí, podría hacer esto varias veces, en lugar de usar 8022 usaría 8023, 8024. Si sigue esa ruta, cree un archivo ~ / .ssh / config en "my_other_server" que contenga todos los números de puerto, así que simplemente ssh [alias] en lugar de ssh [puerto] localhost. Eso se volverá engorroso.
MattPark
1
¿Es posible configurar esto con solo dos máquinas? ¿Conectar B a A, la A de vuelta a B a través de sí mismo?
adamyonk
1
Solo lo hice. Puede confirmar que funciona. \ o /
adamyonk
Sí hombre --- obviamente lo descubriste. Puedes usar algo como autosshmantenerlo abierto.
MattPark
3

Puede usar una especie de VPN para que esto funcione, pero requeriría que tenga un servidor al que pueda acceder el servidor inaccesible. Luego puede configurar OpenVPN en el servidor, su PC y el servidor con firewall, habilitar client-to-clienty listo. http://openvpn.net/howto.html

Nathan C
fuente
Gracias. Estoy investigando esto, pero parece un poco complicado. Si entiendo correctamente, necesito instalar OpenVPN en ambos servidores para que puedan comunicarse sin configurar el enrutador, ¿verdad?
Jiechao Li
Exactamente. Configura un servidor como el "servidor", luego los dos clientes que desea conectar juntos como "clientes" en la configuración. Sin embargo, el SSH inverso mencionado anteriormente parece ser más fácil para usted.
Nathan C
2

Esta respuesta se basa en la aceptada, pero agrega los detalles que me permitieron hacerlo. Pido disculpas por la explicación peatonal, ya que esto no es para nada mi experiencia.

Supongamos que tiene dos computadoras, Ay B. Desea pasar sshde Aa B, y no puede hacer ningún reenvío de puertos en los enrutadores conectados a ellos.

Como dice la respuesta aceptada, necesita un servidor Spara hacer esto: en la computadora B, permitirá sshconexiones desde S; y desde la computadora A, accederás a ese túnel Spara llegar B.

Pero, ¿cómo se obtiene ese servidor S? Encontré serveo(enlace: https://serveo.net/ ). Es de uso muy simple. No tiene que instalar nada ni registrarse y es gratis. Según el sitio web, los pasos a seguir son:

  1. Piensa en un alias para computadora B. Por ejemplo, computer_B_alias.

  2. En la computadora B, ejecutar ssh -R computer_B_alias:22:localhost:22 serveo.net.

  3. Ahora, puede acceder a la computadora Bdesde la computadora Aejecutando lo siguiente en la computadora A:, ssh -J serveo.net user@computer_B_aliasdonde debe sustituir userpor el nombre del usuario en la computadora B.

PD: Por supuesto, haces que el punto 2 sea una tarea automática al iniciar tu computadora B.

PSS: antes de intentar esto, asegúrese de que sshesté instalado en ambas computadoras. Para Ubuntu, sudo apt-get install sshharía el trabajo.

Godoy
fuente
1

Mucho tiempo para responder. Esperar podría ayudar a alguien que está buscando lo mismo ahora.

Si desea acceder a un servidor detrás de NAT y no desea escribir código, probablemente pueda buscar una herramienta entre las siguientes y usar lo que se adapte a sus necesidades.

Ambas herramientas anteriores suponen que tiene acceso a la máquina Linux para instalar su cliente. Algunos de sus beneficios son:

  • Ambos le dan acceso al terminal mediante la interfaz web.
  • No necesita un host ssh inverso inverso propio.
  • Muy fácil de instalar
  • Ambos son de código abierto.

Personalmente, prefiero tmate más, ya que puede alojar el servidor tmate en su propio servidor intermedio (para ssh inverso), mientras que la teleconsola solo puede conectarse a sus propios servidores para ssh inverso.

Ankit Kulkarni
fuente