Linux环境下有线网络DHCP获取失败时自动切换为静态IP的实现方案咨询
Linux环境下有线网络DHCP获取失败时自动切换为静态IP的实现方案咨询
嗨,这个场景太戳人了——办公室要静态IP,家里用DHCP,每次手动切换确实麻烦!我给你几个Linux下亲测有效的自动切换方案,按需选就行:
方案一:用NetworkManager调度脚本(适合桌面发行版)
大多数桌面Linux发行版默认用NetworkManager管理网络,我们可以写个触发脚本,当它检测到DHCP失败时自动切静态IP:
- 先创建脚本文件并赋予执行权限:
sudo touch /etc/NetworkManager/dispatcher.d/99-dhcp-fallback-static sudo chmod +x /etc/NetworkManager/dispatcher.d/99-dhcp-fallback-static - 编辑脚本内容(记得替换成你的接口和静态IP配置):
#!/bin/bash INTERFACE="$1" STATUS="$2" # 替换成你的有线接口名,比如enp0s3、eth0,用ip link show可以查看 TARGET_IFACE="enp0s3" # 替换成你办公室的静态IP配置 STATIC_IP="192.168.0.100/24" GATEWAY="192.168.0.1" DNS_SERVERS="8.8.8.8,8.8.4.4" if [ "$INTERFACE" = "$TARGET_IFACE" ] && [ "$STATUS" = "dhcp-failure" ]; then echo "[$(date)] DHCP失败,正在切换到静态IP..." >> /var/log/dhcp-fallback.log nmcli con mod "$TARGET_IFACE" ipv4.method manual ipv4.addresses "$STATIC_IP" ipv4.gateway "$GATEWAY" ipv4.dns "$DNS_SERVERS" nmcli con up "$TARGET_IFACE" fi - 脚本会在NetworkManager检测到目标接口DHCP获取失败时自动执行,完成静态IP切换。
方案二:用dhclient钩子脚本(适合依赖dhclient的系统)
如果你的系统用dhclient处理DHCP请求,可以给它加个退出钩子,DHCP失败时触发静态配置:
- 创建钩子文件并加执行权限:
sudo touch /etc/dhcp/dhclient-exit-hooks.d/fallback-static sudo chmod +x /etc/dhcp/dhclient-exit-hooks.d/fallback-static - 编辑脚本内容(同样替换你的接口和配置):
#!/bin/bash # 当DHCP请求失败时执行 if [ "$reason" = "FAIL" ]; then IFACE="enp0s3" # 清空原有IP配置 ip addr flush dev "$IFACE" # 设置静态IP ip addr add 192.168.0.100/24 dev "$IFACE" # 设置网关 ip route add default via 192.168.0.1 dev "$IFACE" # 设置DNS(如果用systemd-resolved,换成resolvectl dns "$IFACE" 8.8.8.8 8.8.4.4) echo "nameserver 8.8.8.8" > /etc/resolv.conf echo "[$(date)] DHCP失败,已切换静态IP" >> /var/log/dhcp-fallback.log fi
方案三:用systemd-networkd内置Fallback(适合服务器/轻量系统)
如果你的系统用systemd-networkd管理网络,它自带DHCP失败 fallback 功能,不用写脚本:
- 创建DHCP配置文件
/etc/systemd/network/20-wired-dhcp.network:[Match] Name=enp0s3 [Network] DHCP=yes FallbackDNS=8.8.8.8 8.8.4.4 [DHCPv4] # DHCP失败时自动使用的静态IP和网关 FallbackAddress=192.168.0.100/24 FallbackGateway=192.168.0.1 - 重启systemd-networkd服务生效:
sudo systemctl restart systemd-networkd
几个注意事项
- 先确认你的有线接口名称:执行
ip link show,找带UP状态的有线接口(通常是en开头或者eth开头) - 测试时可以手动断开DHCP服务器(比如办公室拔网线、家里禁用路由器DHCP),验证切换是否生效
- 如果用NetworkManager,确保你的有线连接是被它管理的(别用其他工具手动配置过)
备注:内容来源于stack exchange,提问作者Stephan C.




