Linux多网卡分流跨境网络流量,从零开始配置
为什么需要多网卡分流跨境流量
当你用一台Linux服务器同时服务国内和海外用户时,单线路上网速度慢、丢包高是常见痛点。Linux多网卡分流跨境网络流量可以让国内请求走国内网卡、国外请求走国际网卡,显著提升两侧体验。
本文面向零基础读者,手把手教你配置策略路由实现智能分流。
准备工作
- 一台Linux服务器(CentOS 7/8、Ubuntu 18.04+均可),已安装双网卡并接入两条不同运营商线路
- 两张网卡的IP地址、网关信息(例如:eth0:10.0.0.2/24,网关10.0.0.1;eth1:192.168.1.2/24,网关192.168.1.1)
- 拥有root权限(或sudo)
- 一条测试用的国内外目标IP(例如国内:114.114.114.114,国外:8.8.8.8)
查看当前网络配置
登录服务器后先确认网卡和现有路由:
ip addr show
ip route show table main
新建自定义路由表
Linux默认有一个main路由表,我们需要为每条线路单独创建一张路由表,并在其中添加默认路由。
echo "100 china" >> /etc/iproute2/rt_tables
echo "200 global" >> /etc/iproute2/rt_tables
其中100和200是路由表ID,china和global是自定义名字,可以按实际线路名称修改。
向路由表添加默认路由
假设国内网卡(eth0)网关为10.0.0.1,国际网卡(eth1)网关为192.168.1.1,执行:
ip route add default via 10.0.0.1 dev eth0 table china
ip route add default via 192.168.1.1 dev eth1 table global
同时向main表保留基本直连路由(通常已存在):
ip route add 10.0.0.0/24 dev eth0 table china
ip route add 192.168.1.0/24 dev eth1 table global
配置策略路由规则
策略路由通过ip rule让数据包根据条件匹配不同的路由表。
最常用的方式是按目的IP归属国家分流,但手工维护IP库太复杂。
更简单的方式是按源IP或标记分流。
按源IP分流(推荐): 给国内访问的客户端分配固定内网IP段,让这部分流量走国内路由表。
# 假设10.0.0.0/24走国内,其他走国际
ip rule add from 10.0.0.0/24 table china priority 100
ip rule add from 192.168.1.0/24 table global priority 200
优先级数字越小越优先。priority 100和200可根据需要调整。
如果需要按目标IP分流,需要借助iptables标记数据包,再配合ip rule fwmark。
这里不作深入,适合有经验用户。
使配置永久生效
上述命令重启后会丢失。
在CentOS/RHEL中,可将命令追加到/etc/rc.d/rc.local并赋予执行权限:
echo 'ip route add default via 10.0.0.1 dev eth0 table china' >> /etc/rc.d/rc.local
echo 'ip route add default via 192.168.1.1 dev eth1 table global' >> /etc/rc.d/rc.local
echo 'ip rule add from 10.0.0.0/24 table china priority 100' >> /etc/rc.d/rc.local
echo 'ip rule add from 192.168.1.0/24 table global priority 200' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
Ubuntu用户建议将命令写入/etc/network/interfaces或netplan的post-up脚本中。
验证分流效果
检查路由表是否加载成功:
ip route show table china
ip route show table global
查看IP规则:
ip rule list
应有类似输出:
0: from all lookup local
100: from 10.0.0.0/24 lookup china
200: from 192.168.1.0/24 lookup global
32766: from all lookup main
32767: from all lookup default
测试: 在服务器上模拟不同源的连接,看路由走向。
# 指定源IP ping(需有对应IP的网卡)
ping -I 10.0.0.2 8.8.8.8
ping -I 192.168.1.2 8.8.8.8
使用traceroute或tcpdump可更详细验证走的是哪个网关。
避坑指南
- 防火墙影响: 如果
iptables或firewalld开启了rp_filter反向路径过滤,可能导致从非对称路径返回的包被丢弃。建议将rp_filter设为2(宽松模式):
sysctl -w net.ipv4.conf.all.rp_filter=2
- DNS解析问题: 如果DNS请求走的网卡对不上目标线路,会出现国内能解析但国外慢的情况。建议配置DNS按接口或使用本地缓存DNS。
- 优先级冲突: 确保规则优先级唯一,多条规则匹配时优先级高的生效。
- 重启丢失: 除非写入自启动脚本,否则每次重启后需重新执行。
常见问题
Q:为什么规则配置后,流量还是走默认路由?
A:检查ip rule的优先级,确保自定义规则优先级高于32766(main表)。同时确认源IP或条件匹配正确。
Q:单网卡能否分流?
A:技术上可通过多IP绑不同网关,但效果不如双物理网卡稳定。本文基于双网卡场景。
Q:有图形面板管理吗?
A:宝塔面板等暂不支持直接配置策略路由,仍需命令行操作。
总结
本文从零开始介绍了Linux多网卡分流跨境网络流量的核心步骤:查看网卡、新建路由表、添加默认路由、配置策略规则、设置开机自启。
每一步都给出了可直接运行的命令和排查手段。
建议你根据自己的线路IP和客户类型调整源IP段规则,测试后效果立竿见影。
遇到问题时优先检查rp_filter和规则优先级,再回看本文避坑部分。