Linux软路由分流需构建策略路由系统:基于源IP、目标地址、端口、协议或iptables标记,通过多路由表(如telecom/unicom)与ip rule规则联动实现;关键要保证回程一致并启用ip_forward。

Linux 中配置软路由分流策略,核心是结合 策略路由(Policy-Based Routing, PBR) 与 多表路由 + ip rule 规则,实现按源地址、目标地址、端口、协议甚至应用标记(如 iptables 的 CONNMARK/TOS)来决定走哪条出口线路。这不是简单改一条默认路由,而是构建“条件路由系统”。
明确分流依据:先定义“谁走哪条路”
分流的前提是能准确识别流量特征。常见依据包括:
- 源 IP 段:如内网 192.168.10.0/24 走电信,192.168.20.0/24 走联通
- 目标域名或 IP 地址:如访问 1.1.1.1 或 cn域名走国内线路,海外域名走科学上网隧道(如 wg0 或 tun0)
- 端口/协议:如 53/UDP DNS 查询强制走本地 DoH 代理,80/443 流量按地域分流
- iptables 标记:用 mangle 表对连接打 MARK,后续路由查表时匹配 mark 值
建立多路由表并绑定规则
Linux 默认只用 main 表(表 254),需新增自定义表(如 table 100 对应电信、101 对应联通):
- 编辑 /etc/iproute2/rt_tables,追加:
100 telecom<br>101 unicom<br>102 proxy
- 为 telecom 表添加路由(假设 eth0 是电信出口,网关 192.168.1.1):
ip route add default via 192.168.1.1 dev eth0 table telecom - 添加策略规则,让特定源 IP 查 telecom 表:
ip rule add from 192.168.10.0/24 table telecom - 确保回程路由一致(关键!):若响应包从另一接口返回,可能被丢弃。建议开启反向路径过滤宽松模式:
sysctl -w net.ipv4.conf.all.rp_filter=2
结合 iptables 实现高级分流(如按域名/端口)
纯 ip rule 不支持端口或域名,需借助 iptables + ip rule + 自定义路由表协同:
- 给匹配的连接打标记(在 mangle 表 PREROUTING 链):
iptables -t mangle -A PREROUTING -p tcp --dport 443 -m string --string "google.com" --algo bm -j MARK --set-mark 1 - 创建专用路由表(如 table 200)并添加默认路由到代理接口:
ip route add default dev wg0 table 200 - 添加基于 mark 的策略规则:
ip rule add fwmark 1 table 200 - 启用转发:
sysctl -w net.ipv4.ip_forward=1
验证与排错要点
分流失效常因链路不闭环或规则优先级混乱:
- 查所有策略规则:
ip rule show(注意数字越小优先级越高) - 查某表路由:
ip route show table telecom - 跟踪具体流的路由决策:
ip route get 8.8.8.8 from 192.168.10.100 iif eth1 - 确认 conntrack 状态是否影响标记(如已建立连接不会重入 PREROUTING),必要时加
-t raw -A PREROUTING -m rpfilter --invert -j DROP防绕过











