iptables处理UDP/TCP流量的优先级取决于表顺序(raw→mangle→nat→filter)、链位置(如INPUT)及规则在链内的上下顺序,协议本身无内置优先级,完全由规则插入位置(-I或-A)决定匹配先后。

iptables 处理 UDP/TCP 流量的优先级,核心取决于三件事:数据包经过哪张表、落在哪条链、以及规则在链中的位置。它不是按协议类型(TCP 或 UDP)自动排序,而是完全由你写的规则顺序和所处的表链结构决定。
表优先级决定处理阶段
数据包一进入内核,就会按固定顺序穿过四张表:raw → mangle → nat → filter。每张表只在特定阶段生效:
- raw 表最先接触数据包,常用于关闭连接跟踪(如对某些 UDP 流跳过 conntrack)
- nat 表只在 PREROUTING 和 POSTROUTING 阶段工作,做 DNAT/SNAT,不用于过滤
- filter 表(默认表)负责最终放行或拦截,INPUT/FORWARD/OUTPUT 链都在这里做 TCP/UDP 判断
链内规则从上到下逐条匹配
一旦数据包进入某条链(比如 INPUT),iptables 就从第一条规则开始比对,遇到第一个完全匹配的规则就立即执行动作(ACCEPT/DROP),不再看后面的规则。
- 写
iptables -I INPUT -p tcp --dport 22 -j ACCEPT,这条规则插在 INPUT 链最前面,所有 SSH 请求会立刻放行 - 如果后面还有
iptables -A INPUT -p udp --dport 53 -j DROP,它只影响没被前面规则匹配的 UDP 53 包 - 哪怕 UDP 规则写得早,只要它在链里位置靠后,就永远排在 TCP 规则之后执行
协议本身不带内置优先级
TCP 和 UDP 在 iptables 中没有“谁更高”的设定。优先级完全由你组织规则的方式体现:
- 想让某 TCP 端口流量优先进入,就把对应 ACCEPT 规则用
-I插到链首 - 想先拦截所有 UDP 再放行特定 TCP,就把 UDP DROP 规则放在前面,TCP ACCEPT 放后面
- 混用时注意:一条规则只匹配一种协议(-p tcp 或 -p udp),不能用
-p tcp,udp这种写法
实际配置建议
避免因顺序错乱导致策略失效,推荐操作习惯:
- 先清理旧规则:
iptables -F INPUT,再从头构建逻辑清晰的规则链 - 把明确要放行的可信流量(如管理端口)放在最前
- 把宽泛拒绝规则(如
-p udp -j DROP)放在链尾,作为兜底策略 - 用
iptables -L INPUT --line-numbers查看当前顺序,确认关键规则位置是否符合预期

















