Лучший способ для изменения IP-адреса от провайдера?

У меня есть сервер Debian у себя дома. Сервер является моим маршрутизатором и обеспечивает VPN-доступ к внешней стороне.

У меня нет статического IP-адреса; время аренды, предоставленное провайдером, составляет два часа. Эта кабельная ячейка, по-видимому, имеет как минимум два разных разных сетевых блока для клиентов, и не совсем необычно получить другой IP-адрес после перезагрузки сервера Linux или, что менее обычно, но что более важно в отношении этого вопроса, после некоторых операций по обслуживанию ISP.

У меня есть некоторые службы, зависящие от IP-адреса; а общедоступный IP-адрес используется для внешнего (VPN) доступа и для внутренней ссылки. В некоторых службах я использую динамическое имя DNS из FreeDNS, чтобы не менять IP-адрес в нескольких местах.

Таким образом, лучшим методом, который я разработал до сих пор, является запуск сценария на dhclient-exit hooks. Сценарий вызывается после того, как DHCP предоставляет / обновляет IP-адрес и перезапускает службы, если IP-адрес изменен.

Я также изменяю IP-адрес моего динамического DNS-имени на /etc/hosts для решения возможных проблем с использованием старого IP-адреса до того, как изменение со стороны FreeDNS сойдет со мной.

Сценарий, который я написал для dhclient-exit-hooks.d является этим; exit_status должен быть 0, если все прошло нормально с 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 

Я знаю другие сообщения, которые также рекомендуют использовать dhclient-exit-hooks.d ; однако мой вопрос в том, что есть предложение о более эффективном способе перезапуска этих сервисов при изменении IP-адреса, чем этот.

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

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

  • сценарий /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 вручную в случае необходимости
  • детали намного легче понять

Короче говоря, я бы предложил использовать это в /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 

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

Интернет-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 crypt, чтобы выйти в Интернет, поэтому он 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 , это vars, представленные в 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