¿Cómo puedo configurar para que siempre pueda SSH a mi sistema a través de Internet en una IP dinámica?

11

Básicamente quiero poder hacer algo como teamviewer, independientemente de cuál sea la configuración de la red, siempre que tanto mi servidor ssh (Máquina A) como mi cliente ssh (Máquina B) tengan acceso a Internet (y algún tercer servidor, Máquina C ), Puedo obtener acceso; la razón de esto es que quiero poder mover la máquina A, conectarla a la alimentación, hacer que se conecte automáticamente a una de varias redes wifi preconfiguradas (cada una única / diferente) , sin haber configurado el reenvío de puertos o similar en las redes, y poder iniciar sesión a través de Internet desde la máquina B

¿Cómo puedo lograr esto? No me importa configurar algo en un servidor con una dirección IP estática para ayudar con el apretón de manos, pero tampoco me importa un servidor de terceros si ya existe algo (como lo hace, por ejemplo, Teamviewer)

editar para mayor claridad: tengo 3 máquinas, AB y C

A es una frambuesa pi sin cabeza que se encenderá / apagará en ubicaciones aleatorias, conéctese a una red wifi preconfigurada

B es la máquina con un monitor, teclado, etc. adecuado desde el que quiero conectar

C es un servidor AWS alquilado que tengo con una dirección IP estática, puede ingresar SSH de forma confiable desde B e instalar lo que sea necesario para ayudar a B a conectarse a A

usuario2813274
fuente
¿Puedes pasar a la tercera máquina?
Anthon
@Anthon Creo que sí, los renombré AB y C y agregué descripciones para ellos, espero que eso lo aclare
user2813274
tos no-ip.com tos
Joshua
1
¡no-ip.com no ayudará si el firewall perimetral en su ubicación no permite el tráfico de retorno!
bobstro
Solía ​​usar sshtúneles, muy brevemente. Sin embargo, nunca podría lograr que se quedaran despiertos, incluso con autossh; Si el enlace ascendente se cae por algún motivo, siempre tendrían que reiniciarse a mano. Finalmente, configuré una pequeña VPN para mí con OpenVPN, y funcionó muy bien.
Blacklight Shining

Respuestas:

11

Como tiene la máquina C en Internet, cree una cuenta especial allí nombrada sesame, y en A cree una cuenta con una clave pública / privada desde la cual ha copiado la clave pública en la sesamecuenta en C.

Ahora puede iniciar sesión de A a C, pero en lugar de hacerlo, haga lo siguiente:

ssh -N -R 19930:localhost:22 sesame@yourserverC

(es posible que desee combinar esto con una declaración de suspensión o, por ejemplo, 10 segundos y envolverlo en un bucle sin fin para que la conexión se restablezca si la desconexión de WiFi provocó una interrupción)

Desde la máquina B, normalmente inicie sesión en cualquier cuenta que tenga en C (puede ser pero no tiene que ser la sesamecuenta, diferentes cuentas es lo que uso). Y una vez que esté en C, inicie sesión en A usando:

ssh localhost -p 19930

Por supuesto, puede usar un número diferente que 19930.

Es posible ejecutar ssh -N -R ...desde /etc/rc.localsi su clave privada en A no está protegida con contraseña. En ese caso, asegúrese de crear sesameuna cuenta separada con funcionalidad limitada, de modo que cuando su máquina A se vea comprometida / robada, el riesgo para su servidor C sea limitado. Por eso también recomiendo usar una cuenta separada para ir de B a C.

En realidad se puede establecer el shell de entrada para sesameen /etc/passwda /bin/false, por lo que ya no se puede utilizar la cuenta de inicio de sesión.

Anthon
fuente
Esta solución es diferente de usar TeamViewer, allí el servidor se usa para abrir los puertos que luego se redirigen para comunicarse directamente. Al igual que los programas como BitTorrent se comunican directamente después de encontrar máquinas para descargar (sin tener que abrir puertos de antemano tampoco).
Anthon
Entonces, la principal diferencia es que de esta manera TODO el tráfico pasa a través del servidor C, vs C solo se usa para establecer un enlace, y luego no se usa para el resto de la conexión, estoy de acuerdo con eso. Tiene un buen punto en cuanto a seguridad, ¿hay algo que deba hacer en particular para que el sésamo no pueda hacer nada en C además del mínimo mínimo de inicio de sesión? (Sistema RHEL)
usuario2813274
1
@ user2813274 De hecho, todo el tráfico pasa por C en este escenario (lo que quitaría la utilidad de BitTorrent). No estoy seguro de hasta qué punto puede limitar la sesamecuenta en C, puede ser que pueda hacer que se ejecute /bin/falsecomo shell de inicio de sesión (ya que ssh nunca se conecta realmente), o limitarla agregando un command=parámetro en~/.ssh/authorized_keys
Anthon
@ user2813274 En caso de que no lo haya intentado usted mismo: si tiene una cuenta especial para configurar el proxy inverso, puede deshabilitar los inicios de sesión en esa cuenta cambiando el shell de inicio de sesión a /bin/false.
Anthon
1
@ user2813274 Sí, lo intenté y me permitió configurar el túnel inverso (necesita una cuenta diferente para acceder al servidor C para hacer el ssh localhost -p portnumcurso)
Anthon
7

Instale un túnel IPv6 (como Sixxs ) en su Raspberry Pi. Ahora tendrá una dirección IPv6 estática permanente que se conectará siempre que su Pi esté en línea. Asegúrese de asegurar su Pi ya que está conectada al mundo ahora.

Si su B está conectado a una red IPv6, conéctese directamente a la Pi. Si B no está conectado a una red IPv6, use C como servidor de salto, donde se conecta a través de IPv4 a C y luego ssh a través de IPv6 de C a su Pi.

garethTheRed
fuente
Me gusta esto, ya que ni siquiera requiere C si las redes admiten IPV6, sin embargo, tendré que probarlo, ¿hay algún problema en cuanto a que los firewalls bloqueen esto de forma predeterminada?
user2813274
1
Sixxs proporciona más de un protocolo para tunelizar IPv6. Si usa Anything In Anything (AYIYA), necesitará el puerto TCP 3874 y el puerto UDP 5072 abiertos desde el Pi a Internet. En las redes domésticas, esto debería estar bien; Las redes corporativas o del campus pueden ser diferentes.
garethTheRed
La instalación del túnel parecía factible, pero parece que tendría que registrarme para el servicio Sixxs, esperar a que me devuelvan una dirección IP, etc. no creo que sea la ruta por la que voy a ir por ahora.
user2813274
1

También eche un vistazo a esto:

La tecnología utilizada es la misma que la descrita en la respuesta aceptada, pero utiliza algunos scripts para automatizar las cosas y hacer que la solución sea más genérica. También realiza todas las configuraciones dentro de un contenedor Docker, de modo que el sistema principal es seguro en caso de que algo se vea comprometido.

Sin embargo, no proporciona una conexión automática de A a C, debe iniciarse manualmente. Tal vez pueda personalizar un poco la solución para que haga exactamente lo que desea.

dashohoxha
fuente
0

Quizás necesite usar otro concepto que no sea ssh o tunneling ... Sugiero que use un concepto de mensajería como whatsapp o telegram ... Pero creo que si quiere usar algo como vim, no es tan bueno como ssh ...

Telegram tiene un cliente telegram-cli que puede modificar para aceptar y ejecutar cierto comando e implementarlo en el raspi.

Si usa Telegram, puede simplificar su red y al menos reducir la máquina C para hacer el Hub porque el servidor C está sustituido por el servidor de mensajería de telegramas. Telegram ya viene con un cliente de iPhone y Android, así que no creo que necesite su B Máquina también, puede instalar el cliente de telegramas para un sistema operativo específico si lo desea ... ¿seguridad? el mensaje de telegrama está encriptado .. Si alguien quiere hacer tu raspi? primero harán el servidor de telegramas.

Por lo tanto, siempre que su raspi pueda conectarse al servidor de telegramas (simplemente su raspi se conecte a Internet) incluso si el raspi está detrás de firewall / proxy / IP privado / IP dinámico, siempre puede hacer el control remoto.

Con este concepto, puede hacer el control remoto en cualquier lugar, en cualquier momento.

Wicaksono Trihatmaja
fuente
Wat Eso es inseguro, estás confiando en alguna aplicación de mensajería aleatoria, estás diciendo que OP debe modificar dicha aplicación de mensajería aleatoria para que funcione. Esto ni siquiera se da cuenta de que la aplicación de mensajería aleatoria se rompería por completo con algo como vim y tendría una latencia horrible.
Otro usuario más
Bueno, si lo usas solo para enviar comandos, creo que está bien ... si lo usas para algo como vim, no creo que sea bueno ... buenos consejos ...
editaré
No creo que esto sea lo que quiero, quiero acceso completo a la consola, nada menos que eso, en lo que respecta a la dosificación de Pi ... No estoy realmente preocupado, en primer lugar porque tengo que hacer una configuración especial para incluso conectarme a mí mismo, en segundo lugar porque sus conexiones serán intermitentes y cambiarán aleatoriamente de todos modos
user2813274
0

Creo que deberías echar un vistazo al reenvío de puerto ssh inverso. En pocas palabras, primero inicias un ssh de A a C usando la sintaxis a continuación y luego usas ese puerto para volver de túnel de C a A. No golpearás el firewall de inicio de A cuando lo hagas porque el R-Pi ya tiene un túnel.

ssh -R 2210: localhost: 22 myCoolAwsSite.com

Tenga en cuenta las ramificaciones de seguridad cuando lo haga. Puede agregar algunos jujitsu cron para que la conexión se restablezca después de un reinicio.

Saltando conejito
fuente
Err ... ¿en qué se diferencia esto de la respuesta de Anthon?
usuario2813274