更新系统后宿主机出网 TCP/UDP 全断(ICMP 正常),定位为网卡 XDP 程序异常(附完整诊断过程与临时解法)
一、环境信息
- 机型:HP MicroServer Gen8
- CPU:Intel Xeon E3-1265L v2(4 核 8 线程)
- 内存:8GB
- 网卡:
- 板载 Broadcom BCM5720 ×2(eno1 / eno2,已聚合为 bond1)
- PCIe 扩展卡 Intel I226-V 2.5G ×1(ens1)
- 系统版本:更新前
【更新前版本号】 → 更新后 【更新后版本号】
- 网络结构:bond1 开启 OVS(bond1-ovs 为管理口,192.168.3.20/24,网关 192.168.3.1);ens1 开启 OVS(ens1-ovs,静态 192.168.100.2/24,无网关);一台虚拟机(iStoreOS 软路由)的两块 virtio 网卡分别桥接到上述两个 OVS 桥;Docker 服务启用中
二、故障现象
系统更新并重启后,宿主机完全无法访问互联网:curl 挂死、系统内需要联网的功能全部失败。具体表现为:
ping 192.168.3.1(网关):正常
ping 223.5.5.5(公网 IP):正常
- 向网关做 DNS 查询(
nslookup www.baidu.com 192.168.3.1):正常
- 向公网 DNS 查询(
nslookup www.baidu.com 223.5.5.5):超时
curl -I http://www.baidu.com:挂死无响应(curl -4 同样)
- 同路由器下其他设备上网完全正常,排除路由器与宽带问题
即:出方向的 TCP、UDP 全部中断,但 ICMP 与本网段通信正常。接口状态、IP 地址、默认路由(default via 192.168.3.1 dev bond1-ovs)检查均无异常。
三、诊断过程
逐项排除链路、路由、网关、DNS 后,注意到三块物理网卡上都挂载了 XDP 程序,且更新前后发生了变化:
- 更新前:eno1 / eno2 显示
prog/xdp id 27,ens1 无 XDP;
- 更新后:eno1 / eno2 变为
xdpgeneric/id:41,ens1 也新增挂载 xdp/id:41。
随后做摘除测试:
sudo ip link set dev eno1 xdp off
sudo ip link set dev eno2 xdp off
sudo ip link set dev ens1 xdp off
curl -I http://www.baidu.com
结果立即恢复:
HTTP/1.1 200 OK
Server: bfe
...
同时,之前受影响的 OVS 桥接虚拟机(软路由下联的无线网络)上网也一并恢复正常。
四、结论
本次更新后挂载到物理网卡上的 XDP 程序(id 41)存在 bug:放行 ICMP,但出方向的 TCP/UDP 流量被丢弃,导致宿主机断网,并连带影响经 OVS 桥接的虚拟机。该组件属于系统网络栈内部功能,设置界面无对应开关("网卡性能模式"仅针对 Realtek 网卡且为关闭状态,与本问题无关)。
五、临时解决方案(供遇到同样问题的用户参考)
sudo ip link set dev eno1 xdp off # 换成你的网卡名
sudo ip link set dev eno2 xdp off
sudo ip link set dev ens1 xdp off
注意:重启后 XDP 会被系统重新挂载,故障复发。可用下面的 systemd 单元在每次开机后自动摘除,待官方修复后删除:
sudo tee /etc/systemd/system/xdp-off.service > /dev/null <<'EOF'
[Unit]
Description=Detach buggy XDP programs (workaround)
After=network-online.target
Wants=network-online.target
[Service] Type=oneshot ExecStart=/bin/sh -c 'sleep 15; ip link set dev eno1 xdp off; ip link set dev eno2 xdp off; ip link set dev ens1 xdp off' RemainAfterExit=yes
[Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload
code