You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.

火山引擎 最新活动