Linux网络配置:如何实现DHCP失败时系统仍能正常启动


阅读 8 次

问题场景描述

在Linux系统网络配置中,我们经常遇到这样的场景:

auto lo eth0
iface lo inet loopback
iface eth0 inet dhcp

这种标准配置下,当DHCP服务器不可用时,系统启动过程会卡在获取IP地址的环节,导致启动无法完成。这对于需要保证系统高可用的生产环境来说是不可接受的。

解决方案原理

Linux的DHCP客户端实际上提供了超时机制,我们可以通过配置dhclient来实现:

  1. 设置合理的超时时间
  2. 配置超时后的回退行为
  3. 确保网络接口最终能被激活

具体配置方法

修改/etc/dhcp/dhclient.conf文件:

# 设置超时时间为10秒
timeout 10;

# 超时后使用链路本地地址
interface "eth0" {
    supersede interface-mtu 1500;
    request subnet-mask, broadcast-address, routers, domain-name-servers;
    require subnet-mask;
    script "/sbin/dhclient-script";
}

同时修改/etc/network/interfaces文件:

auto eth0
iface eth0 inet dhcp
    # 设置DHCP超时后使用本地链路地址
    post-up /sbin/ifconfig eth0 up || true
    post-up /sbin/ip addr add 169.254.0.1/16 dev eth0 || true

进阶配置方案

对于更复杂的场景,可以使用NetworkManager结合自定义脚本:

#!/bin/bash
# /etc/NetworkManager/dispatcher.d/99-dhcp-fallback

IF=$1
STATUS=$2

if [ "$STATUS" = "dhcp4-change" ] || [ "$STATUS" = "up" ]; then
    # 检查是否获取到IP
    if ! ip addr show dev $IF | grep -q "inet "; then
        # 设置本地链路地址
        ip addr add 169.254.0.1/16 dev $IF
    fi
fi

测试验证方法

可以通过以下命令模拟DHCP服务器不可用的情况:

# 停止网络服务
systemctl stop networking

# 手动触发DHCP请求
dhclient -v eth0

# 查看接口状态
ip addr show eth0

生产环境建议

  • 对于关键业务系统,建议配置多网卡绑定
  • 考虑使用keepalived实现高可用
  • 监控网络状态并设置告警