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
fuente
ssh
túneles, muy brevemente. Sin embargo, nunca podría lograr que se quedaran despiertos, incluso conautossh
; 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.Respuestas:
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 lasesame
cuenta en C.Ahora puede iniciar sesión de A a C, pero en lugar de hacerlo, haga lo siguiente:
(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
sesame
cuenta, diferentes cuentas es lo que uso). Y una vez que esté en C, inicie sesión en A usando:Por supuesto, puede usar un número diferente que 19930.
Es posible ejecutar
ssh -N -R ...
desde/etc/rc.local
si su clave privada en A no está protegida con contraseña. En ese caso, asegúrese de crearsesame
una 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
sesame
en/etc/passwd
a/bin/false
, por lo que ya no se puede utilizar la cuenta de inicio de sesión.fuente
sesame
cuenta en C, puede ser que pueda hacer que se ejecute/bin/false
como shell de inicio de sesión (ya que ssh nunca se conecta realmente), o limitarla agregando uncommand=
parámetro en~/.ssh/authorized_keys
/bin/false
.ssh localhost -p portnum
curso)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.
fuente
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.
fuente
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.
fuente
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.
fuente