Ubuntu DHCP 与其他网络服务冲突的定位与解决
一、先统一网络管理方式
- 查看当前接管网络的组件:
- 检查是否存在 Netplan 配置:ls /etc/netplan/;若有 .yaml 文件,系统通常由 Netplan 编排,并由 NetworkManager 或 systemd-networkd 实际管理。
- 查看服务状态:systemctl is-active NetworkManager、systemctl is-active systemd-networkd。
- 只保留一种管理器,避免“多头管理”导致接口反复切换、地址冲突或 DNS 异常:
- 使用 Netplan + NetworkManager:确保 /etc/netplan/*.yaml 中的 renderer: NetworkManager,然后执行 sudo netplan apply;必要时 sudo systemctl enable --now NetworkManager 并 sudo systemctl disable --now systemd-networkd。
- 使用 Netplan + systemd-networkd:确保 renderer: networkd,执行 sudo netplan apply;sudo systemctl enable --now systemd-networkd 并 sudo systemctl disable --now NetworkManager。
- 桌面环境通常选 NetworkManager,服务器无界面场景常用 systemd-networkd。注意:systemd-networkd 与 NetworkManager 不能并行启用。
二、快速定位 DHCP 冲突与异常
- 查看本机是否拿到地址、是否有重复:ip addr show dev ;必要时释放并重新获取:sudo dhclient -v 。若出现 RTNETLINK answers: File exists,说明接口上已有地址,先清理再取址:sudo ip addr flush dev && sudo dhclient -v 。
- 查看是否与其他 DHCP 服务“抢答”:sudo systemctl status isc-dhcp-server(若安装);检查租约与配置:/var/lib/dhcp/dhcpd.leases、/etc/dhcp/dhcpd.conf、/etc/default/isc-dhcp-server(关注 INTERFACES、subnet、range、option routers、option domain-name-servers)。
- 查系统日志定位冲突与错误:grep -i dhcp /var/log/syslog 或 /var/log/messages。
- 若本机是客户端但仍异常,优先排除“地址已被占用/重复分配”的情形,再检查网关与 DNS 是否下发正确。
三、按场景给出解决方案
- 场景 A:本机既是 DHCP 客户端又是服务器(同一台机器运行 dhcpd 且网卡设为 DHCP)
- 建议二选一:要么作为客户端仅 dhcp4: yes,要么作为服务器仅 dhcp4: no;若必须共存,确保服务器接口不在客户端网段,或在服务器配置中精确限制 INTERFACES,避免“自问自答”与地址冲突。
- 场景 B:静态 IP 与 DHCP 地址池重叠
- 在 DHCP 服务器上将静态 IP 段从 range 中排除;客户端侧用 Netplan 正确配置静态地址、网关与 DNS,例如:
- network:
- version: 2
- ethernets:
- enp0s3:
- dhcp4: no
- addresses: [192.168.1.100/24]
- gateway4: 192.168.1.1
- nameservers: { addresses: [8.8.8.8, 8.8.4.4] }
- 应用:sudo netplan apply。
- 场景 C:多台 DHCP 服务器在同一广播域
- 保留唯一权威 DHCP,其余关闭或改为 relay;统一 subnet、range、router、DNS 参数,避免“争抢”与重复租约。
- 场景 D:DNS 与默认路由异常(能 ping IP、域名不通)
- 检查 /etc/resolv.conf 与 resolvectl status;若使用 systemd-resolved,优先在 /etc/systemd/resolved.conf 配置 DNS=…,再 sudo systemctl restart systemd-resolved;必要时 resolvectl flush-caches。
- 场景 E:容器/虚拟化造成网段或网关冲突(如 Docker 默认 bridge 与办公网同网段)
- 为 Docker 指定不与宿主机/办公网冲突的网段,例如在 /etc/docker/daemon.json 设置 “bip”: “10.200.0.1/24”(示例),然后重启 Docker;或按需调整路由避免冲突。
四、验证与回退
- 验证要点:
- 地址唯一:ip addr 无重复;路由正确:ip route 仅有一条默认路由;租约合理:cat /var/lib/dhcp/dhcpd.leases;日志干净:grep -i dhcp /var/log/syslog 无冲突报错;DNS 正常:resolvectl status 显示正确服务器且 ping 域名 可通。
- 安全回退:
- 保留一份 /etc/netplan/*.yaml 备份;变更前先 sudo netplan try;若异常,快速回滚并重启相应服务(如 NetworkManager 或 systemd-networkd)。