iptables本身不管理路由表,真正的路由决策由内核ip route和ip rule完成;iptables仅通过mangle表打标(如mark)配合策略路由实现按条件选路,必须先配置ip rule指向指定路由表,否则标记无效。

iptables 本身不管理路由表,它只做包过滤和地址转换;真正的路由决策由内核的 ip route 和 ip rule 体系完成。但 iptables 可以与策略路由(Policy-Based Routing, PBR)协同工作,实现“按需选路 + 按策过滤”的双重控制。这种编排不是简单叠加,而是分层配合:路由决定数据包走哪条路径,iptables 决定这条路径上的包是否放行、如何改写、是否记录。
下面从实际协作角度讲清楚怎么编排、为什么这么编排、哪些地方容易出错:
路由层先于防火墙生效,顺序不能颠倒
Linux 网络栈中,数据包进入系统后依次经过:
-
PREROUTING(iptables nat/mangle/raw 表)→ 路由决策(查ip route+ip rule)→INPUT/FORWARD(filter 表起作用)
这意味着:
- 如果你想让某个目的网段走特定出口(比如
1.1.1.0/24必须从eth1出),必须先用ip rule+ip route建好策略路由; - iptables 的
OUTPUT链规则(如 SNAT)或FORWARD链规则(如限速、封 IP),才在选定路径之后生效; - 若跳过路由配置直接在 iptables 里
-j MARK打标,却没配对应ip rule table xxx,标记就无效。
iptables 与策略路由的两种典型协同方式
方式一:用 iptables 标记 + 路由表联动(推荐用于精细化控制)
适用于需要区分流量类型再路由的场景,比如:
- SSH 流量走主线路,视频上传走备用链路
- 来自某子网的请求强制走透明代理网关
操作步骤:
- 给匹配流量打标记:
iptables -t mangle -A OUTPUT -d 10.20.30.0/24 -j MARK --set-mark 0x100 iptables -t mangle -A PREROUTING -s 192.168.5.0/24 -j MARK --set-mark 0x200
- 创建对应路由表并添加路由:
echo "100 fast_route" >> /etc/iproute2/rt_tables ip route add default via 10.0.0.1 dev eth0 table fast_route echo "200 proxy_route" >> /etc/iproute2/rt_tables ip route add default via 172.16.1.1 dev eth1 table proxy_route
- 绑定标记到路由表:
ip rule add fwmark 0x100 table fast_route ip rule add fwmark 0x200 table proxy_route
✅ 优势:标记可复用,一条
ip rule控制多条iptables匹配逻辑;支持mangle表的复杂条件(如端口范围、连接数限制)。
❌ 注意:fwmark规则对INPUT链无效(本地进程发起的包在OUTPUT或PREROUTING打标更可靠)。
方式二:iptables SNAT/DNAT 与策略路由互补
当策略路由已指定出口设备,但还需修改源/目标地址时,两者必须配合:
- 例如:从
10.0.0.3访问1.1.1.0/24,要求走eth0并伪装成10.0.0.3 - 此时
ip rule决定走哪张路由表 →ip route指定出口和源 IP →iptables -t nat -A POSTROUTING补充 SNAT(若路由表未带src参数)
常见错误:
- 只配了
ip route ... src 10.0.0.3,却还在POSTROUTING加SNAT --to-source 10.0.0.3→ 重复 NAT,导致源 IP 错乱; -
ip rule to 1.1.1.0/24存在,但ip route show table custom_table缺少默认路由 → 包被丢弃,iptables 日志里也看不到(根本没进 INPUT/FORWARD)。
编排时的关键检查点
-
确认路由是否真正生效:
ip route get 1.1.1.1 from 10.0.0.3 oif eth0 # 看返回的实际路由表和下一跳
-
验证 iptables 是否命中:
iptables -t mangle -L OUTPUT -v --line-numbers # 查看标记规则计数是否增长 iptables -t nat -L POSTROUTING -v # 确认 SNAT 规则有匹配计数
-
避免默认策略干扰:
若iptables -P FORWARD DROP,而策略路由把本该FORWARD的包导向了非预期接口,又没开对应FORWARD规则,包就静默丢弃——此时要检查FORWARD链是否放行了该接口间的流量(如-i eth0 -o eth1 -j ACCEPT)。 -
持久化要分开处理:
- 策略路由用
ip rule/ip route配置 → 写入/etc/network/interfaces(Debian)或/etc/sysconfig/network-scripts/(RHEL); - iptables 规则用
iptables-save > /etc/iptables/rules.v4或netfilter-persistent save; - 二者启动顺序必须是:网络接口 up → 策略路由加载 → iptables 规则载入。
- 策略路由用
不复杂但容易忽略










