iptables 五链四表
iptables 是 Netfilter 项目的一部分,工作在 Linux 内核空间,负责过滤、修改、重定向进出系统的网络数据包,它的核心就是 “五链四表”。
五链是 PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
四表是 raw、mangle、nat、filter,四表按优先级从高到低为:raw 表 > mangle 表 > nat 表 > filter 表,内核会按此顺序依次匹配各表的规则
iptables 的核心是表和链的组合:表定义做什么操作(如过滤、地址转换),链定义在哪个网络环节做(如入站、转发、出站)。
五个内置链
1. PREROUTING:所有流量进入内核后第一个经过的链,仅在路由判断前执行,核心用于修改目的地址/端口(DNAT),不做过滤(过滤交给后续链)。
2. INPUT:仅处理发往本机应用的入站流量,路由判断后执行,核心做入站流量过滤(如允许/拒绝 SSH/80 端口访问)。
3. FORWARD:仅处理Linux 作为网关/路由器时的转发流量,核心做转发流量过滤(如允许/拒绝内网访问外网)。
4. OUTPUT:仅处理本机应用发起的出站流量,核心做出站流量过滤/修改(如禁止本机访问某外网 IP、修改出站目的地址)。
5. POSTROUTING:所有出站/转发流量的最后一个链,路由判断后执行,核心用于修改源地址/端口(SNAT/MASQUERADE),是 NAT 的最后一步。
容易弄混的地方:
1. 所有入站流量必走 PREROUTING,所有出站流量必走 POSTROUTING,POSTROUTING 是五链的最终出口。
2. Linux 作为纯服务器(非网关):仅用到 PREROUTING、INPUT、OUTPUT、POSTROUTING,FORWARD 链无流量(可默认禁用)。
3. Linux 作为网关/防火墙:五链全部用到,核心依赖 FORWARD 做转发控制,PREROUTING 做 DNAT,POSTROUTING 做 SNAT。
4. 链的执行顺序由内核决定,iptables 仅能在链中添加规则,无法调整链的先后顺序。
四个规则表
filter 表
核心作用
决定数据包的ACCEPT(允许)、DROP(丢弃)、REJECT(拒绝并返回提示)
适用链(仅 3 条,无 PREROUTING/POSTROUTING)
包含 INPUT(本机入站过滤)、FORWARD(转发流量过滤)、OUTPUT(本机出站过滤)
使用例子
拒绝外网访问本机 3306 端口
优先级
最低(最后匹配),因为过滤是 “最终决策”,需等地址转换、报文修改完成后再执行
注意iptables 执行命令时不指定表,默认就是 filter 表(如iptables -A INPUT -p tcp --dport 22 -j ACCEPT)
nat 表
核心作用
负责网络地址转换,修改数据包的源IP/端口(SNAT)或目的IP/端口(DNAT),实现内网上网、端口映射等功能。
适用链(仅 3 条,无 INPUT/FORWARD)
PREROUTING(路由前做 DNAT)、POSTROUTING(路由后做 SNAT)、OUTPUT(修改本机出站的目的地址/端口)
典型操作
POSTROUTING:SNAT/MASQUERADE(内网 192.168.1.0/24 通过网关公网 IP 上网)
PREROUTING:DNAT(将公网 IP 的 8080 端口映射到内网 192.168.1.10 的 80 端口)
OUTPUT:修改本机访问某域名的目的 IP(本地测试端口映射)
优先级
第三(在 raw、mangle 之后,filter 之前)
nat 表规则不做过滤,仅做IP和端口的修改。
mangle 表
核心作用
负责修改数据包的头部信息,如修改TOS(服务类型)、TTL(生存时间)、MARK(标记),还可做数据包分片处理,用于流量整形、QoS(服务质量)、基于标记的后续策略匹配。
适用链(全 5 条链,唯一支持所有链的表)
PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
典型操作
修改数据包 TTL 防止内网数据包被路由丢弃
给数据包打 MARK
优先级
第二(在 raw 之后,nat、filter 之前)
多用于网关路由器的高级网络配置,普通服务器基本用不到(可默认无规则)
raw 表
核心作用
控制内核的连接跟踪(conntrack)功能,实现不跟踪指定数据包,减少内核资源占用,是优先级最高的表(内核最先匹配)。
适用链(仅 2 条,无 INPUT/FORWARD/POSTROUTING)
PREROUTING(不跟踪入站/转发的指定数据包)、OUTPUT(不跟踪本机出站的指定数据包)
典型操作
对访问某公网 IP 的数据包设置NOTRACK(不做连接跟踪,提升大流量场景性能)。
对内网无状态的 UDP 流量关闭连接跟踪。
优先级
最高(内核最先匹配,匹配到 NOTRACK 后,后续 mangle、nat、filter 表将跳过连接跟踪相关规则)
适用场景
高并发服务器/大流量网关的性能优化,普通场景完全无需使用
四表与五链的核心关联总结
按 “链” 维度:每条链仅能匹配指定表的规则
| 五链 | 可匹配的四表(按优先级) | 核心用途 |
| PREROUTING | raw → mangle → nat | 入站先修改、再路由 |
| INPUT | mangle → filter(无 nat/raw) | 入站流量过滤 |
| FORWARD | mangle → filter(无 nat/raw) | 转发流量过滤 |
| OUTPUT | raw → mangle → nat → filter | 本机出站流量先修改、再过滤 |
| POSTROUTING | mangle → nat(无 raw/filter) | 出站流量修改 |
按 “表” 维度:每张表仅能作用于指定链
| 四表 | 可作用的五链 | 核心操作类型 |
| raw | PREROUTING、OUTPUT | 关闭连接跟踪 |
| mangle | 所有 5 条链 | 修改报文头部、打标 |
| nat | PREROUTING、OUTPUT、POSTROUTING | 地址 / 端口转换 |
| filter | INPUT、FORWARD、OUTPUT | 数据包过滤(允许 / 拒绝) |
这里需要留意:
1. 同一表内,规则按从上到下顺序匹配,匹配到第一条满足条件的规则即执行,后续规则不再匹配(可通过-j CONTINUE强制继续匹配)。
2. 高优先级表的规则执行后,低优先级表仍会匹配(除非规则指定-j RETURN跳出),例如 raw 表标记 NOTRACK 后,mangle 表仍可修改该数据包的 TTL。
3. 若某表在某链上无任何规则,数据包会直接跳过该表,传递到下一个表 / 链,不会丢弃流量。
4. 仅 filter 表有默认策略(如iptables -P INPUT DROP),nat、mangle、raw 表无默认策略,无规则时直接放行。
速记口诀
表的功能
raw表免跟踪,mangle表改内容
nat表做转换,filter表管过滤
链的顺序
包进来先路由前(PREROUTING)
路由决策分两边
发给本机走输入(INPUT)
需要转发走转发(FORWARD)
本机发出走输出(OUTPUT)
出去之前路由后(POSTROUTING)
表的优先级
优先级从高到低:
raw → mangle → nat → filter
(口诀:原味芒果那特绿)
原(raw)味(未)芒(mangle)果那(nat)特(filter)绿