Faça o nome do host se adaptar à situação local / remota

1

Eu configurei um servidor ssh local, que eu gosto de acessar com esse apelido puro da minha rede local:

~/.ssh/config :

Host myserver-local
HostName 192.168.2.8
User iago-lito
Port 22

Para acessá-lo remotamente, eu configurei uma conta no-ip para acessá-lo via uma dyndns de resolução IP, que eu gosto de acessar com este alias puro de qualquer outra rede:

~/.ssh/config :

Host myserver
HostName myserver.ddns.net
User iago-lito
Port 22

Infelizmente, como meu roteador não permite loopbacks de NAT , preciso usar:

ssh myserver

quando estou ausente e:

ssh myserver-local

quando estou em casa .. o que torna o script bastante irritante quando se trata de automação scp , git push etc.

Como eu poderia fazer o mesmo alias funcionar nos dois casos?

    
por iago-lito 19.02.2017 / 01:13

2 respostas

1

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.

    
por 20.02.2017 / 01:17
2

Você pode escrever um script que pinga o endereço local do servidor e, com base no resultado, trocar em um ou outro arquivo .ssh / config. Por exemplo:

ping -c1 -W1 192.168.x.x

Essas opções são Contagem, ou seja, um ping e Aguarde, 1 segundo. Use o valor de retorno do ping - 0 encontrado, não 0, não encontrado.

Você pode definir esse script para ser executado quando você se conectar a uma rede.

Desculpe por ser breve, estou escrevendo do meu telefone.

    
por 19.02.2017 / 08:52