Intereting Posts
таймер systemd работает rsync в 3 часа ночи и останавливается в 6 утра Как клонировать раздел NTFS (WinXP) с поврежденного диска на новый? Имеет ли диспетчер пакетов Nix спецификацию формата данных, позволяющую альтернативные реализации, подобно Git? Какую команду я должен выполнить после внесения изменений в файл / etc / passwd «Заменить» оболочку по умолчанию (bash) с помощью tmux Инструмент командной строки для комплексного и комплексного тестирования подключения к Интернету Установка портативной пакетной системы (PBS) для подачи заявки Как заставить «startx iceweasel» запускать полноэкранный режим? Куда ушли все мои иноды? Запись разрешений внутри сценария оболочки Команды IAC Telnet Удаленный доступ к cassandra, работающему на локальном шлейфе IP / port 127.0.0.1 Управление (добавление / удаление и т. Д.) Пользователей в squashfs (файловая система RO) с небольшим R / W-разделом Как заставить find следовать большинству, но не всем, символическим ссылкам? В FreeBSD, как найти пакеты в зависимости от конкретного пакета

Лучший способ для изменения 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