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:
Match host raspi exec "am_i_outside_of_my_lan"
HostName 12.345.67.89
Port 1234
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, pero exec
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 la exec "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éstica ssh user@raspi
hace exactamente lo que normalmente haría, pero fuera de ella, la regla coincide y en su lugar hace el equivalente de ssh -p 1234 user@12.345.67.89
.
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)
#! /usr/bin/env python
import socket, sys
sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))
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)