多网卡路由冲突、NetworkManager与systemd-networkd混用、VLAN与Bridge的MTU不一致、IPv6隧道路由优先级错乱是Linux网络四大典型问题,需分别通过策略路由、统一网络管理器、逐级MTU对齐和调整IPv6路由metric解决。

多网卡路由冲突导致某张网卡无法通信
Linux 默认只维护一张主路由表,当系统存在 eth0(内网)、eth1(公网)、enp0s8(管理网)等多张网卡时,内核会按路由表顺序选择出口,常出现「能 ping 通网关但无法访问外网」「SSH 连得上却 curl 超时」这类现象——本质是回程路径不一致触发了反向路径过滤(rp_filter)或默认路由覆盖了特定网段。
- 先查当前生效路由:
ip route show table main
- 确认每张网卡的网关是否被重复添加,尤其注意
default via是否只应出现在公网接口上 - 临时禁用严格反向路径检查(仅调试用):
sysctl -w net.ipv4.conf.all.rp_filter=0
,但生产环境必须配合策略路由解决 - 若需
eth1走默认路由、eth0仅走192.168.10.0/24,必须启用策略路由:ip rule add from 192.168.10.100 table 100
ip route add 192.168.10.0/24 dev eth0 src 192.168.10.100 table 100
ip route add default via 192.168.10.1 dev eth0 table 100
NetworkManager 与 systemd-networkd 混用引发配置覆盖
Ubuntu 22.04+/CentOS 8+ 默认启用 systemd-networkd,但用户手动装了 NetworkManager 后未停用前者,会导致 /etc/systemd/network/*.network 和 /etc/NetworkManager/system-connections/ 两套配置同时生效,接口状态反复震荡,ip link 显示 DOWN 却 nmcli device status 显示 connected。
- 确认当前网络服务管理者:
systemctl list-units | grep -E "(network|NetworkManager)"
- 二选一:停用
systemd-networkd并屏蔽其 socket:systemctl stop systemd-networkd systemd-networkd.socket
systemctl disable systemd-networkd systemd-networkd.socket - 或彻底卸载
NetworkManager(适合服务器场景):apt remove network-manager
(Debian/Ubuntu)或dnf remove NetworkManager
(RHEL/Fedora) - 修改后必须重启
systemd-networkd或NetworkManager,且清空/run/systemd/network/下缓存文件
VLAN 子接口与 Bridge 混合配置时 MTU 不一致
在 KVM/QEMU 或容器宿主机上,常见把物理口 ens3f0 划 VLAN(如 ens3f0.100),再绑到 br0 桥接器。此时若 ens3f0 的 MTU 是 1500,而 br0 设为 9000(启用 jumbo frame),虚拟机或容器内会频繁出现 TCP 重传、HTTPS 握手失败——因为 VLAN tag 占 4 字节,但桥接器未自动补偿,实际帧长超限被丢弃。
- 物理口 MTU 必须 ≥ 桥接器 MTU + 4:
ip link set ens3f0 mtu 9004
- VLAN 子接口和桥接器 MTU 应完全一致:
ip link set ens3f0.100 mtu 9000
ip link set br0 mtu 9000 - 检查是否启用了 GRO/LRO:
ethtool -k ens3f0 | grep generic-receive-offload
,开启时可能掩盖 MTU 问题,调试阶段建议关闭:ethtool -K ens3f0 gro off lro off
IPv6 隧道与本地链路地址共存时路由优先级错乱
使用 he-net 或 6in4 隧道接入 IPv6 时,系统自动生成的 fe80::/64 链路本地路由会抢占隧道接口的默认路由(::/0),导致出站 IPv6 流量全部走本地链路而非隧道,curl -6 https://ifconfig.co 返回空或超时。
- 查看所有 IPv6 路由及协议来源:
ip -6 route show table all
,重点关注proto kernel(链路本地)与proto static(隧道)的metric值 - 降低隧道接口默认路由优先级(数字越小越优先):
ip -6 route replace ::/0 via 2001:db8::1 dev he-ipv6 metric 100
- 禁用无状态地址自动配置(SLAAC)避免干扰:
sysctl -w net.ipv6.conf.he-ipv6.accept_ra=0
sysctl -w net.ipv6.conf.he-ipv6.autoconf=0 - 隧道配置写入
/etc/network/interfaces或/etc/systemd/network/时,务必显式指定metric,否则重启后失效
多网卡、多协议、多管理器叠加时,问题往往不出在单点配置,而在各层路由决策的交互逻辑。最易忽略的是:策略路由的 from 规则匹配的是**源 IP**,不是入接口;MTU 补偿必须从物理层开始逐级对齐;而 rp_filter 关闭后若未配好策略路由,反而会放大连接不稳定。动手前先 ip rule show 和 ip -6 route get 验证路径,比反复重启服务更省时间。










