Melhor método para atuar na mudança do endereço IP do ISP?

6

Eu tenho um servidor Debian em casa. O servidor é meu roteador e fornece acesso VPN para o exterior.

Eu não tenho um endereço IP estático; o tempo de concessão dado pelo ISP é de duas horas.

Esta célula de cabo que atende a área que vivo, parece ter pelo menos dois diferentes netblocks diferentes para os clientes, e não é totalmente incomum obter um endereço IP diferente após uma reinicialização do servidor Linux , ou menos comumente, mas mais importante no que diz respeito a essa questão, após algumas operações de manutenção do ISP.

Eu tenho alguns serviços que dependem do endereço IP; e o endereço IP público é usado para acesso externo (VPN) e para referência interna.

Em alguns serviços, eu uso o nome DNS dinâmico do FreeDNS para não ter que alterar um endereço IP em vários locais.

Como tal, o melhor método que criei até agora é executar um script em ganchos de dhclient-exit. O script é chamado depois que o DHCP fornece / renova um IP e reinicia os serviços se o IP for alterado.

Eu também altero o IP do meu nome DNS dinâmico em /etc/hosts , para resolver possíveis problemas de uso do IP antigo antes que a alteração no lado do FreeDNS chegue até mim.

O script que escrevi para dhclient-exit-hooks.d é esse; exit_status deve ser 0 se tudo correr bem com dhclient .

#!/bin/bash

PATH=$PATH:/usr/bin

if ! [[ -v exit_status ]]
then
   exit 1
fi

if [ $exit_status -eq 0 ]
then
   IP='ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"'
   OLDIP='awk ' /xxxx.mooo.com/ { print  $1 } '   /etc/hosts'
   if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ] 
   then
      sed -i "s/^[0-9\.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
      timeout 60 /opt/bin/iptables.sh
      timeout 60 /etc/init.d/ipsec restart
      timeout 60 /etc/init.d/asterisk restart
      timeout 120 /etc/init.d/bind9 restart
      timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXXXXXXXXXX > /dev/null
   fi
fi

Estou ciente de outras postagens que também recomendam o uso de dhclient-exit-hooks.d ; No entanto, minha pergunta é que há uma sugestão de um método melhor de reiniciar esses serviços em uma alteração de endereço IP do que esta.

    
por Rui F Ribeiro 13.03.2016 / 23:25

3 respostas

2

No final, acabei simplificando um pouco minha configuração para atuar nas mudanças de endereços IP.

O NAT da Internet foi alterado para MASQUERADE, então não tenho que agir sobre isso; as regras iptables deixaram o dhclient-exit-hooks.d , instalando iptables-persistent .

iptables -A POSTROUTING -o eth0.101 ! -p esp -j MASQUERADE
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4

O BIND parou de falhar na inicialização porque reconhece as dependências no iptables que sobem agora.

Eu também não reinicio o BIND agora. Além disso, o BIND agora depende de dnscrypt-proxy crypt para deixar a Internet, portanto, ele é vinculado apenas às interfaces internas (que não mudam).

Se a variável exit_status for mencionada na documentação dhclient-exit-hooks.d , aparentemente haverá alguma confusão e será usada apenas para passar o status de saída para o DHCP e não para obtê-lo.

O script final é:

#!/bin/bash

PATH=$PATH:/usr/bin


IP='ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"'
OLDIP='awk ' /xxxx.mooo.com/ { print  $1 } '   /etc/hosts'
# if reboot or IP changed
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ] 
   then
      # put it in hosts 
      sed -i "s/^[0-9\.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
      timeout 60 /etc/init.d/ipsec restart
      timeout 60 /etc/init.d/asterisk restart
      # update FreeDNS service
      timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXX > /dev/null
fi

Quanto à ausência de exit_status , estas são as vars apresentadas em dhclient-exit-hooks.d no boot:

requested_broadcast_address=1
new_network_number=95.94.xx.0
new_ip_address=95.94.xx.xx
new_dhcp_message_type=5
pid=1100
new_time_offset=0
new_routers=95.94.xx.xx
new_expiry=1462482903
new_subnet_mask=255.255.240.0
interface=eth0.101
requested_time_offset=1
new_domain_name=netcabo.pt
reason=REBOOT
new_time_servers=212.113.176.129 212.113.176.65
requested_routers=1
PATH=/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin
requested_subnet_mask=1
new_log_servers=212.113.188.209
new_dhcp_server_identifier=79.169.255.254
new_domain_name_servers=0.0.0.0 8.8.8.8
new_broadcast_address=95.94.xx.255
new_dhcp_renewal_time=7200
new_dhcp_rebinding_time=12600
PWD=/
new_next_server=0.0.0.0
new_dhcp_lease_time=14400
    
por 02.05.2016 / 19:25
6

Como Wouter comentou, sua configuração existente já parece bastante decente.

Se você quer algo menos dependente de dhclient , você pode dar uma olhada nos muitos clientes DNS dinâmicos empacotados no Debian.

Por exemplo, ddclient pode reagir às alterações do DHCP ou simplesmente monitorar uma interface Ethernet; quando o endereço IP é alterado (e somente então), ele pode atualizar uma entrada de DNS dinâmico (em qualquer número de provedores), bem como executar um script separado (que cobriria os dois casos de uso).

    
por 13.04.2016 / 23:08
3

Proponho simplificar / dividir ainda mais sua solução seguindo o princípio da separação de interesses:

  • um script /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change só deve decidir se uma ação precisa ser executada e adiar a ação para um script separado /usr/local/bin/act_on_ip_change
  • o script /usr/local/bin/act_on_ip_change só deve executar as alterações necessárias

As razões para separar essas preocupações são:

  • você pode testar separadamente se dhclient está sendo acionado corretamente (sem realmente modificar nada em seu sistema durante a depuração)
  • você pode testar o "change making" sem a necessidade de renovar (e assim potencial de soltar) o seu IP
  • você pode executar /usr/local/bin/act_on_ip_change manualmente caso haja necessidade
  • as partes são muito mais fáceis de entender

Em suma, sugiro ter isso em /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change_action :

# based on /etc/dhcp/dhclient-exit-hooks.d/debug

if [ "$reason" = "BOUND" -a "$old_ip_address" != "$new_ip_address" ]; then
  /usr/local/bin/act_on_ip_change
fi
    
por 04.10.2016 / 18:13