Способ реагирования на изменение IP-адреса от провайдера?

Я предполагаю, что вы имеете в виду 11-минутный обновления часов в Linux . Если вы хотите, чтобы ntpd работал без обновления аппаратных часов, похоже, единственный жизнеспособный вариант - перестроить ядро ​​без параметра RTC_SYSTOHC :

Установите время RTC на основе Синхронизация NTP

Если вы здесь ответите утвердительно, системное время (настенные часы) будет сохраняться в RTC, указанном RTC_HCTOSYS_DEVICE, примерно каждые 11 минут, если пользовательское пространство сообщает о состоянии синхронизации NTP.

Это требует перестройки, параметр не может быть изменен с помощью флагов загрузки.

В качестве альтернативы, согласно информации сравнения Chrony , openntpd не активирует синхронизацию ядра.

3
04.04.2019, 09:33
3 ответа

В конце концов, я немного упростил свою настройку, чтобы действовать при изменении IP-адресов.

Internet NAT был изменен на MASQUERADE, поэтому мне не нужно его использовать; правила iptables оставили dhclient-exit-hooks.d , установив iptables-persistent .

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

BIND перестал давать сбой при загрузке, потому что теперь он распознает зависимости от iptables.

Я тоже сейчас не перезапускаю BIND. Более того, BIND теперь зависит от крипты dnscrypt-proxy для передачи в Интернет, поэтому он привязан только к внутренним интерфейсам (которые не меняются).

В то время как переменная exit_status упоминается в документации dhclient-exit-hooks.d , очевидно, есть некоторая путаница, и она используется только для передачи статуса выхода в DHCP, и не получить.

Итак, окончательный сценарий:

#!/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

Что касается отсутствия exit_status , это переменные, представленные в dhclient-exit-hooks.d при загрузке:

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
0
27.01.2020, 21:16

Как Wouter прокомментировал, ваша существующая установка уже выглядит довольно приличной.

Если вы хотите что-то менее зависимое от dhclient, вы можете посмотреть на множество динамических DNS клиентов, упакованных в Debian.

Например, ddclient может реагировать на изменения DHCP или просто следить за интерфейсом Ethernet; когда IP-адрес меняется (и только тогда), он может обновить запись динамического DNS (на любом количестве провайдеров), а также запустить отдельный скрипт (который покроет оба ваших случая использования).

3
27.01.2020, 21:16

Предлагаю еще больше упростить/разделить ваше решение по принципу разделения задач:

  • a script /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change должен только решить, нужно ли предпринимать действие, и отложить действие до отдельного скрипта /usr/local/bin/act_on_ip_change
  • скрипт /usr/local/bin/act_on_ip_change должен выполнять только необходимые изменения

Причины разделения этих проблем:

  • вы можете отдельно проверить, правильно ли срабатывает dhclient (фактически не изменяя ничего в вашей системе во время отладки)
  • вы можете протестировать «внесение изменений» без необходимости обновлять (и, следовательно, потенциально свободным) ваш IP
  • вы можете выполнить /usr/local/bin/act_on_ip_change вручную в случае необходимости
  • Части намного проще понять

Короче говоря, d/trigger_on_ip_change[trigger_on_ip_change должны только решить, нужно ли выполнять действие до отдельного действия

Я бы предложил иметь это в /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
2
27.01.2020, 21:16

Теги

Похожие вопросы