Com um OpenSSH razoavelmente moderno, você pode executar um comando shell para selecionar um bloco Match
em ~/.ssh/config
. Supondo que você tenha um script am-on-home-network
que retorna 0 quando executado em sua rede doméstica e 1 quando executado fora:
Match Host myserver exec "am-on-home-network"
HostName myserver
User iago-lito
Port 22
Host myserver
HostName myserver.ddns.net
User iago-lito
Port 22
Para am-on-home-network
, você pode usar arp
para explorar a rede local. Procure o endereço MAC do seu roteador doméstico. (A procura de endereços IP não é confiável porque muitas redes privadas usam os mesmos intervalos de endereços IP privados.)
#!/bin/sh
timeout 0.2 arping -f -q -I eth0 12:34:56:78:9a:bc
Ajuste o endereço MAC para o endereço MAC do roteador que seu computador vê quando está em casa. Ajuste eth0
para a interface de rede no seu computador que é usada para conectar ao seu roteador doméstico.
A abordagem SSH pura tem a vantagem de poder ser feita na userland, mas só funciona para o SSH, e aumenta consideravelmente o atraso no estabelecimento da conexão. Uma solução melhor é executar um servidor DNS no nível do sistema e configurá-lo para servir ao endereço IP local o nome global myserver.ddns.net
quando estiver na rede local. O Dnsmasq é um cache e servidor DNS pequeno e simples, adequado para execução em uma máquina endpoint ou em uma rede pequena. Se você ainda não estiver executando um cache DNS em sua máquina, isso tornará o uso geral da Internet um pouco mais rápido. O Ubuntu roda o dnsmasq por padrão.
No dnsmasq, crie um arquivo /etc/dnsmasq.d/home-server
contendo
host-record=myserver.ddns.net,192.168.2.1
Adicione o seguinte script aos seus scripts de inicialização de rede (sejam eles quais forem na sua distribuição):
#!/bin/sh
comment=\#
if timeout 0.2 arping -f -q -I eth0 12:34:56:78:9a:bc; then
comment=
fi
sed -i "\$s/^#*/$comment/" /etc/dnsmasq.d/home-server
service dnsmasq restart
Se o seu sistema configura o Dnsmasq através do D-Bus, editar o arquivo de configuração não é a melhor opção, e eu nem sei se vai funcionar. Você precisaria chamar dbus-send
para adicionar ou remover o registro do host com base na saída da arping. Ou, se você estiver usando o NetworkManager, configure-o para definir a entrada do host na conexão correspondente à sua rede doméstica.