Tengo una Raspberry Pi (RPi) y estoy haciendo conexiones remotas con ssh. Me las arreglé para configurar ssh correctamente de modo que pueda acceder al RPi tanto desde una red de área local como desde Internet (usando un puerto específico que abrí en mi enrutador).
Asumiendo un nombre de usuario john
y un RPi llamado raspi
:
Acceso LAN interno
ssh [email protected]
ssh john@raspi
ssh raspi
Acceso LAN externo
ssh -p 1234 [email protected]
ssh -p 1234 12.345.67.89
Pero, ¿cómo puedo simplemente hacerlo ssh raspi
desde fuera de mi LAN? ¿Hay alguna forma de configurar raspi para que apunte a dos direcciones IP, una en una LAN y otra en Internet?
Lo que básicamente quiero es acceder a mi RPi de una sola manera, sin importar si estoy en casa o en el trabajo.
ssh
ip
openssh
port-forwarding
Aeronaelius
fuente
fuente
Respuestas:
Mirando más de cerca su pregunta, parece que está usando la misma computadora tanto dentro como fuera de la LAN. He revisado mi respuesta en consecuencia:
En su
~/.ssh/config
, agregue:Luego, puede hacerlo
ssh raspi-wan
desde fuera de la LAN, ossh raspi-lan
desde el interior de la LAN sin preocuparse por los servidores DNS o editar/etc/hosts
para todos los usuarios, o incluso sin tener que hacer nada como root. Si desea que el nombre seraspi
resuelva de manera diferente dependiendo de dónde se encuentre, eso probablemente requerirá algo de magia de scripting de shell para detectar su red y actuar en consecuencia.fuente
-wan
y-lan
postfix. Sin embargo, a mi ssh no le gustó elUsername
campo (opción de configuración incorrecta). Está funcionando bien sin él.User john
, noUserName
. Estoy corrigiendo mi respuesta para reflejar esto, y una vez que haya configurado su configuración, puede omitir el nombre de usuario desde lassh
línea de comandos.Esto es perfectamente factible solo con la configuración ssh, sin tener que usar alias separados para lan y wan o crear ningún puerto adicional hacia adelante. (Pero, naturalmente, necesita alguna forma de detectar si está dentro de su lan o no)
En
~/.ssh/config
, querrás agregar algo como esto:En lugar de
am_i_outside_of_my_lan
, querrá colocar un comando que determine si está dentro de su red doméstica o no, y regresa con un código de salida 0 si está fuera de ella, y algo más.La
host
condición probablemente se explica por sí misma, peroexec
merece una explicación: coincide solo cuando el comando dado regresa con el código de salida 0, es decir. No hay error.En otras palabras, lo que hace es que la
host raspi
parte restringe esta regla a cuando intentas conectarte al host raspi, y laexec "am_i_outside_my_lan"
restringe aún más para que solo se aplique cuando te estás conectando desde fuera de tu red doméstica. Entonces, dentro de su red domésticassh user@raspi
hace exactamente lo que normalmente haría, pero fuera de ella, la regla coincide y en su lugar hace el equivalente dessh -p 1234 [email protected]
.En cuanto a qué usar en lugar de
am_i_outside_of_my_lan
, eso depende completamente de su configuración. Sugiero colocar los comandos en un script separado en lugar de intentar escribirlo en línea, porque las citas parecen ser un poco difíciles de entender.Personalmente, utilicé el siguiente script de Python para detectar si estoy dentro de mi propia red: (Dado que mi nombre de dominio se resuelve en una IP local dentro de mi propia red)
Si no tiene una configuración similar, es posible que tenga que hacer otra cosa. (Por ejemplo, puede mirar el nombre de la red inalámbrica a la que está conectado, o incluso consultar algún servicio what-is-my-ip para obtener la ip externa de la red a la que está conectado)
fuente
En el ordenador (el Connect- ing uno), se puede establecer un nombre de host para
12.345.67.89
. Abra su/etc/hosts
archivo y configure una entrada DNS:Luego, su máquina transformará "raspi" en "12.345.67.89" como parte de un proceso de resolución de DNS local. Si utiliza varias máquinas, el cambio debe realizarse en todas y cada una de ellas. El problema es que requiere acceso root para editar
/etc/hosts
, y es posible que no lo tenga en todas partes.Si desea que "raspi" sea reconocido automáticamente desde cualquier lugar, entonces lo siento: no es posible. Esto requeriría el registro de "raspi" como nombre de dominio, lo que no puede suceder ya que "raspi" no tiene TLD y no dependería de ningún servidor raíz DNS. Sin embargo, puede registrar un nombre de dominio (digamos
cfbaptista.me
, y señalarlo a su dirección IP de WAN. Con algún reenvío de puertos, podrá acceder a su Raspberry Pi con:(Aún así, eso es gastar dinero por casi nada ...)
En cuanto a la
user@
parte, depende de su nombre de inicio de sesión en las diferentes máquinas. Si tiene el mismo nombre en la máquina de conexión y en la remota , no es necesario especificarlo. De lo contrario, debe especificar quién es usted en la máquina remota .fuente
Objetivo:
ssh raspi
debe funcionar dentro de la LAN y en la Internet pública.Para hacer esto, debe asegurarse de que el nombre se resuelva en la IP interna de la LAN y en la IP pública desde el exterior.
Primero, debe obtener un nombre de dominio como
raspi.yourdomain.com
. Visite http://freedns.afraid.org/ para obtener dominios gratuitos para uso hobby. Apunte el dominio a su IP públicaPara la LAN, recomiendo ejecutar DNSMasq. El firmware abierto DD-WRT se integra estrechamente con DNSMasq, utilizándolo para DHCP y DNS. Solo tiene que indicarle su dominio de búsqueda ("yourdomain.com") y asignará automáticamente nombres DNS en función del nombre solicitado de cada cliente. Para que esto funcione, debe leer raspi's / etc / hostname
raspi
.Una vez que esto esté configurado, raspi.yourdomain.com debería resolver la IP local en su LAN (solo asegúrese de estar usando el DNS local en todas sus máquinas).
Ahora, probablemente no desee exponer el puerto 22 a Internet público, ya que obtendrá un montón de tráfico sniffer. Por lo tanto, puede hacer que su enrutador exponga raspi: 22 como algún otro puerto, digamos 1234. Para usar el mismo puerto en redes públicas e internas, puede agregar una regla de redireccionamiento de puerto a raspi. En Linux:
(cambie eth0 al nombre de su interfaz de red como se muestra con
ip link
oifconfig
, y 1234 a su puerto público)Ahora puedes hacerlo
ssh -p 1234 raspi.yourdomain.com
desde público y LAN.Puede agregar una entrada a ~ / .ssh / config en su máquina cliente para acortar esto a solo
ssh raspi
, como lo menciona @DopeGhoti.Si desea exponer puertos SSH de máquinas adicionales en la misma IP pública, simplemente repita el proceso con otro nombre DNS y puerto público. ¡Salud!
fuente
Aquí hay una versión sucinta y funcional de la respuesta de Aleksi Torhamo usando curl para tomar su IP pública actual y luego verificar si coincide con la IP pública de su servidor (es decir, está en la misma red local).
En su
~/.ssh/config
complementofuente
ssh
va a procesar todas las directivas que coinciden, en orden, así que en teoría debería ser capaz de hacer algo asíMatch host raspi / User john / HostName 192.168.2.7
seguido deMatch host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234
y conseguir el mismo efecto con una solacurl
invocación, dejando que el== '12.345.67.89'
caso sea asumido por el fracaso de la segundaMatch
regla deexec
.Match
sean iguales o también especificados en el segundo, si especificó un no estándarPort xxxx
en el primeroMatch
y desea utilizar el puerto estándar en el segundoMatch
, tendrías que anularlo explícitamente con unPort 22
para que no continúe usando el puertoxxxx
.)Suponiendo que su máquina tiene IP 192.168.1. * Cuando está conectada a su LAN, puede lograr esto con la siguiente configuración
~/.ssh/config
para que siempre pueda usar el mismo comando (solossh raspi
) para conectarse:fuente
Esta solución supone que su red doméstica tiene un solo enrutador, lo cual creo que es el caso común.
Añadir a tu
~/.ssh/config
fuente