Linux复杂网络环境配置_多场景适配说明【指导】

7次阅读

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

Linux 复杂网络环境配置_多场景适配说明【指导】

多网卡 路由 冲突导致某张网卡无法通信

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 显示 DOWNnmcli 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-networkdNetworkManager,且清空 /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-net6in4 隧道接入 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 showip -6 route get 验证路径,比反复重启服务更省时间。

text=ZqhQzanResources