要实现按应用类型分流,需iptables打标、connmark同步连接标记、策略路由选表三者协同;关键在于用connmark确保双向流量标记一致,再通过ip rule绑定fwmark与路由表,并关闭rp_filter避免回程丢包。

要实现“游戏流量走电信、网页流量走联通”这种按应用类型分流的效果,核心不是靠 iptables 单独决定路径,而是让 iptables 打标 + 策略路由选表 + 路由表绑定网关 三者协同工作。关键在于:标记必须稳定作用于整条连接(尤其是双向),否则回程包会走错出口,连接直接中断。
一、先定义业务流量并打初始标记
用 mangle 表在 PREROUTING 或 OUTPUT 链中识别特征,并打上唯一 fwmark(如 0x100 表示游戏,0x200 表示网页):
# 游戏流量:常见端口(如 3000–4000、7000–8000、UDP 居多) iptables -t mangle -A PREROUTING -p udp --dport 3000:4000 -j MARK --set-mark 0x100 iptables -t mangle -A PREROUTING -p tcp --dport 7777 -j MARK --set-mark 0x100 # 网页流量:HTTP/HTTPS 目标端口(注意:仅限目标地址为公网 Web 服务时有效) iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x200
⚠️ 注意:
-
PREROUTING适用于转发场景(如软路由);若本机发起访问(如浏览器),需改用OUTPUT链。 - 若需更精准识别(如区分游戏登录 vs 游戏对战),可结合
string模块匹配协议特征,但性能略低。
二、用 CONNMARK 实现连接级标记同步(必须!)
只打 MARK 不够——TCP/UDP 连接有请求和响应两个方向。回程包若没标记,策略路由就查不到表,必然走默认路由(通常只有一条出口)。所以必须用 CONNMARK 把标记“绑到连接上”:
# 对刚打标的包,存入 conntrack 连接记录 iptables -t mangle -A PREROUTING -m mark --mark 0x100 -j CONNMARK --save-mark iptables -t mangle -A PREROUTING -m mark --mark 0x200 -j CONNMARK --save-mark # 后续所有同连接包(含回程)恢复标记 iptables -t mangle -A PREROUTING -m connmark --ctmark 0x100 -j CONNMARK --restore-mark iptables -t mangle -A PREROUTING -m connmark --ctmark 0x200 -j CONNMARK --restore-mark # 本机作为服务端响应时,OUTPUT 包也要恢复(避免响应走错网卡) iptables -t mangle -A OUTPUT -m connmark --ctmark 0x100 -j CONNMARK --restore-mark iptables -t mangle -A OUTPUT -m connmark --ctmark 0x200 -j CONNMARK --restore-mark
✅ 效果:每个连接从首包开始就被打上持久标记,后续所有进出包都携带该 fwmark,策略路由全程可控。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
三、创建独立路由表并绑定网关
- 编辑
/etc/iproute2/rt_tables,添加自定义表名:
echo "100 telecom" >> /etc/iproute2/rt_tables echo "200 unicom" >> /etc/iproute2/rt_tables
- 为每张表配置对应网关和源地址(假设):
-
eth0接电信:IP192.168.1.100/24,网关192.168.1.1 -
eth1接联通:IP192.168.2.100/24,网关192.168.2.1
# 电信表:所有流量发往 192.168.1.1,源地址强制为 192.168.1.100 ip route add default via 192.168.1.1 dev eth0 src 192.168.1.100 table telecom # 联通表:所有流量发往 192.168.2.1,源地址强制为 192.168.2.100 ip route add default via 192.168.2.1 dev eth1 src 192.168.2.100 table unicom
- 绑定
fwmark与路由表:
ip rule add fwmark 0x100 table telecom ip rule add fwmark 0x200 table unicom
✅ 此时,带 0x100 标记的连接,无论请求还是响应,都会查 telecom 表,走电信出口;同理网页走联通。
四、补充关键细节,避免连接失败
-
关闭反向路径校验(rp_filter):
多出口场景下,若回程包从非原路返回(比如请求走 eth0、响应误走 eth1),内核可能丢包。临时关闭:echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
永久生效可写入
/etc/sysctl.conf。 确保源地址已配置在对应网卡:
如192.168.1.100必须ip addr show eth0中可见,否则路由无法命中。规则顺序很重要:
restore-mark规则建议放在save-mark之前(尤其在PREROUTING开头),防止新连接尚未保存就尝试恢复导致跳过。-
测试验证命令:
# 查看策略规则 ip rule show # 模拟某标记下的路由路径(例如游戏目的 IP 1.1.1.1) ip route get 1.1.1.1 oif eth0 mark 0x100 # 查看连接标记状态 conntrack -L | grep "mark=0x100"
不复杂但容易忽略。










