多网卡网络分流降低跨境访问网络延迟波动
多网卡网络分流,简单说就是让服务器按来源或目标把流量交给不同线路,避免单一线路拥塞导致跨境访问延迟忽高忽低。
本文用一台双网卡 Linux 服务器做演示,从查看网卡、写策略路由到验证效果,逐步带你完成配置,目标是降低跨境访问时的延迟抖动,而不是简单提升带宽。
动手前先确认这些条件
开始配置前,请先确认服务器满足下面几点,避免做到一半发现环境不支持。
- 服务器至少有 两块物理网卡或两块内网网卡,系统建议使用 CentOS 7/8、Ubuntu 20.04 或更高版本。
- 每块网卡分别接入了不同运营商或不同区域线路,例如电信 + CN2、联通 + 移动。若只有一块网卡,需要先联系服务商开通多线路接入。
- 有 root 权限,能执行
ip、route、iptables等命令。 - 知道每块网卡的 IP、网关和默认路由情况。可用
ip addr和ip route查看。
第一步:查看当前网卡与路由状态
登录服务器后先执行下面的命令,记录下当前网卡名称、IP 和默认网关:
ip addr
ip route show
输出里通常能看到 eth0、eth1 这样的网卡名。
假设:
- eth0:IP
203.0.113.10,网关203.0.113.1,对应线路 A - eth1:IP
198.51.100.20,网关198.51.100.1,对应线路 B
默认只有一条默认路由,ip route show 会显示类似:
default via 203.0.113.1 dev eth0
这意味着所有出站流量都走 eth0。
我们需要用策略路由把不同流量拆分到两条线路上。
第二步:创建两张独立路由表
Linux 的策略路由依赖独立路由表。
编辑 /etc/iproute2/rt_tables,在文件末尾增加两行:
echo "100 lineA" >> /etc/iproute2/rt_tables
echo "200 lineB" >> /etc/iproute2/rt_tables
100 和 200 是路由表编号,lineA、lineB 是自定义名称。
完成后用 cat /etc/iproute2/rt_tables 确认。
第三步:为每块网卡配置默认路由
分别给两张表添加默认路由,并绑定对应网卡。
以 eth0 走线路 A、eth1 走线路 B 为例:
ip route add default via 203.0.113.1 dev eth0 table lineA
ip route add default via 198.51.100.1 dev eth1 table lineB
同时要添加直连路由,让两张表都能找到本机网段:
ip route add 203.0.113.0/24 dev eth0 src 203.0.113.10 table lineA
ip route add 198.51.100.0/24 dev eth1 src 198.51.100.20 table lineB
如果网段前缀不确定,可以用 ip addr 里显示的掩码。
执行后可以用下面的命令检查:
ip route show table lineA
ip route show table lineB
第四步:配置策略路由实现分流
策略路由的作用是让特定来源或目标 IP 走指定路由表。
常见的分流需求有两种:
按来源 IP 分流,例如让国内访问的流量走线路 A,国外访问流量走线路 B:
ip rule add from 203.0.113.10 lookup lineA
ip rule add from 198.51.100.20 lookup lineB
按目标网段分流,例如让访问某境外 IP 段走线路 B:
ip rule add to 192.0.2.0/24 lookup lineB
配置完成后用 ip rule show 查看规则是否生效。
注意策略路由是按顺序匹配的,优先级越小的规则越先执行,需要灵活调整时可用 ip rule add ... pref 50 这样的方式指定优先级。
第五步:写入持久化配置并重启网络
手动执行的 ip 命令在重启后会失效。
以 CentOS 为例,把下面的配置写入 /etc/sysconfig/network-scripts/route-eth0 和 route-eth1,确保开机自动加载:
/etc/sysconfig/network-scripts/route-eth0:
default via 203.0.113.1 dev eth0 table lineA
203.0.113.0/24 dev eth0 src 203.0.113.10 table lineA
/etc/sysconfig/network-scripts/route-eth1:
default via 198.51.100.1 dev eth1 table lineB
198.51.100.0/24 dev eth1 src 198.51.100.20 table lineB
然后在 /etc/sysconfig/network-scripts/rule-eth0 和 rule-eth1 中写入策略规则:
/etc/sysconfig/network-scripts/rule-eth0:
from 203.0.113.10 lookup lineA
/etc/sysconfig/network-scripts/rule-eth1:
from 198.51.100.20 lookup lineB
保存后重启网络服务:
systemctl restart network
Ubuntu 系统建议直接修改 /etc/netplan/ 下的配置文件,通过 routing-policy 和 routes 字段实现类似效果。
避坑指南:这些错误最容易导致分流失败
网关冲突。
两块网卡的网关不能是同一个 IP,否则流量还是会走同一个出口。
如果服务商给的网关相同,需要联系他们调整。
未添加直连路由。
只配置默认路由没有配置直连路由,会导致回包路由缺失,表现就是 ping 不通或连接超时。
忘记关闭反向路径过滤。
Linux 内核默认的 rp_filter 会检查源地址是否从最优路径返回,多网卡分流时容易误杀正常数据包。
临时关闭方法:
sysctl -w net.ipv4.conf.all.rp_filter=0
永久生效需要修改 /etc/sysctl.conf,添加:
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
然后执行 sysctl -p 加载。
防火墙未放行对应网卡流量。
检查 iptables 或 firewalld 是否对 eth1 做了限制,建议先放行全部流量测试分流,确认正常后再收紧规则。
如何确认延迟波动真的降低了
分流失效或生效后,最简单的验证方法是连续 ping 目标地址,观察延迟的波动幅度。
先测试默认线路:
ping -I eth0 -c 100 目标IP | tail -n 3
再测试另一条线路:
ping -I eth1 -c 100 目标IP | tail -n 3
对比两个结果的 avg 和 mdev 值。mdev 表示平均偏差,数值越小说明延迟越稳定。
更精确的测试可以用 mtr 工具:
mtr -r -i 1 -c 50 -e 目标IP
如果某条线路的丢包率和延迟抖动明显更低,可以把这条线路设为主导线路,再通过策略路由让关键业务流量走它。
判断分流是否真的生效,也可以执行:
ip route get 目标IP
看输出里的 dev 和 src 是否与你预期的线路一致。
如果只是某一段时间延迟高,建议在不同时段多测几轮,跨境网络质量本身就受国际出口拥塞影响。
多网卡网络分流能降低单条线路波动,但无法完全消除物理链路和运营商互联带来的延迟问题。
遇到配置后不生效时,优先回看策略路由顺序、直连路由和 rp_filter 三项设置。
也可以在服务器上临时启动两个会话,分别用 tcpdump -i eth0 和 tcpdump -i eth1 看流量是否真正走了两张网卡。
只要路由表、规则和防火墙都没问题,跨境访问的延迟波动通常能得到明显改善。