Моя машина Debian в настоящее время является частью моей домашней локальной сети, за коробкой интернет-провайдера, которая обрабатывает все сетевые действия (DHCP, брандмауэр, телефония, IPTV, ...). Классический случай домашней сети.
Я планирую вскоре переместить сервер на коммутатор между оптоволоконным преобразователем (вход оптоволокно, выход RJ45) и устройством интернет-провайдера и настроить его на получение моего публичного IP-адреса в Интернете через DHCP от интернет-провайдера.
К сожалению, мой интернет-провайдер время от времени заставляет менять этот адрес (чтобы предоставлять «профессиональные услуги» фиксированного IP за плату). Я написал скрипт, который проверяет мой IP-адрес, отображаемый в Интернете, и изменяет запись DNS моего внешнего имени в случае несоответствия.
Я могу запускать этот скрипт периодически через cron
, но было бы интереснее запускать его при eth0
изменении IP-адреса (что произойдет, когда интернет-провайдер добавит новый адрес «в свой ящик», который теперь фактически является моим сервером).
Есть ли такой механизм (действия при смене IP-адреса)?
решение1
Вы можете использовать скрипт диспетчера Network Manager для запуска скрипта при включении или выключении интерфейса, что он и сделает, когда интернет-провайдер изменит ваш IP-адрес (он разорвет ваше соединение, а затем восстановит его с новым адресом).
Посмотрите на файлы в /etc/NetworkManager/dispatcher.d/
. В моем есть простой скрипт 20-chrony
, который может стать хорошим шаблоном:
#!/bin/sh
# This is a NetworkManager dispatcher script for chronyd to set its NTP sources
# online/offline when a default route is configured/removed on the system.
export LC_ALL=C
if [ "$2" = "up" ]; then
/sbin/ip route list dev "$1" | grep -q '^default' &&
/usr/bin/chronyc -a online > /dev/null 2>&1
fi
if [ "$2" = "down" ]; then
/sbin/ip route list | grep -q '^default' ||
/usr/bin/chronyc -a offline > /dev/null 2>&1
fi
exit 0
Вы можете адаптировать эти два if
оператора для работы со своими скриптами или, если ваши скрипты должны запускаться только при появлении интерфейса, просто измените первый if
и удалите второй.
решение2
Если вы работаете в системе с инструментом dbus-monitor(1), вы можете запустить эту программу как демон, чтобы она могла отслеживать изменения адреса интерфейса. Не уверен, что это за сообщение, но что-то вроде:
dbus-monitor 'some-filtering-expression' |
while read -r line; do
xargs /path/to/your/script "${line"}
done
Вы также можете разрешить dbus-monitor работать в свободном режиме (без фильтров), чтобы наблюдать за тем, что происходит при появлении сетевого соединения.