我的 Debian 机器目前是我家庭 LAN 的一部分,位于 ISP 盒子后面,负责处理所有网络相关活动(DHCP、防火墙、电话、IPTV...)。住宅家庭网络的经典案例。
我计划很快将服务器移至光纤转换器(光纤输入、RJ45 输出)和 ISP 盒子之间的交换机,并将其配置为通过 DHCP 从 ISP 接收我的互联网公共 IP 地址。
不幸的是,我的 ISP 时不时地强制更改此地址(以便提供固定 IP 的“专业服务”,但需付费)。我编写了一个脚本,用于检查 Internet 上显示的 IP 地址,并在不匹配的情况下修改我的外部名称的 DNS 条目。
我可以通过定期运行此脚本,cron
但当 IP 更改时触发它会更有趣eth0
(当 ISP 将新地址“推入其盒子”时会发生这种情况,实际上现在是我的服务器)。
是否有这样的机制可用(IP 地址更改时执行的操作)?
答案1
您可以使用网络管理器调度程序脚本在接口启动或关闭时运行脚本,当 ISP 更改您的 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 自由运行(没有过滤器)来观察网络连接出现时发生的情况。