更新时间:2025 年 6 月
iptables
和 netfilter
iptables
其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过 iptables
这个代理,将用户的安全设定执行到对应的『安全框架』中,这个『安全框架』才是真正的防火墙,名字叫 netfilter
。netfilter
是防火墙真正的『安全框架』( framework), 位于内核空间。iptables
其实是个命令行工具,位于用户空间,通常用这个工具去操作真正的框架
表、链和规则
iptables 结构
iptables -> 表 -> 链 -> 规则
( iptables -> tables -> chains -> rules
)。 简单地讲,表
(tables
)由 链
(chains
)组成,而 链
(chains
)又由 规则
(rules
) 组成。我们通过设置 规则
来完成过滤、重定向、修改数据包等功能
iptables
的内建链和内建表
链(chain
)
什么是 链
(chains
)呢?当数据包从网络上来到主机,需要经过一些『关卡』,经过这些『关卡』的时候,则必须符合通过的『条件』,而且,『关卡』会根据检验『条件』来放行、拒绝或者丢弃数据等等;这里的『关卡』就是链
(chains
),而『条件』就是 规则
(rules
);iptables
默认有 5 个内建链
(chains
),如下图所示:

每个内建链的功能如下:
- INPUT 链 – 处理来自外部的数据
- OUTPUT 链 – 处理向外发送的数据
- FORWARD 链– 将数据转发到本机的其他网卡设备上
- PREROUTING 链 – 处理刚到达本机并在路由转发前的数据包。它可以转换数据包中的目标IP地址(destination ip address),通常用于 DNAT (destination NAT)
- POSTROUTING 链 – 处理即将离开本机的数据包。它可以转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)
处理不同方向的数据,由不同内建链负责,系统内建链与数据流向可以由下图描述

根据上图,我们能够得知报文的流向
- 到本机某进程的报文:
PREROUTING --> INPUT
- 由本机转发的报文:
PREROUTING --> FORWARD --> POSTROUTING
- 由本机的某进程发出报文:
OUTPUT --> POSTROUTING
表(table
)
每个 链
(chains
)上都放置了一串规则,但是有些规则负责的功能有些很相似,这个时候,可以把具有相同功能的规则的集合叫做表
(table
),所以不同功能的规则,可以放置在不同的表中进行管理,而 iptables 已经内置定义了4种表,每种表对应了不同的功能
filter 表:负责过滤数据包,有以下三种内建链:
- INPUT
- OUTPUT
- FORWARD
nat 表:负责网络地址转换功能;有以下三种内建链:
- PREROUTING
- POSTROUTING
- OUTPUT
- INPUT链(CentOS 6 之前不存在,CentOS 7 之后新增加)
mangle 表:拆解报文,做出修改,并重新封装数据包;能改变 TCP 头中的 QoS 位;有以下 5 个内建链:
- PREROUTING
- OUTPUT
- FORWARD
- INPUT
- POSTROUTING
raw 表:用于处理异常, 在整个防火墙体系优先级最高,如果启动用raw表,数据将会跳过conntrack(关闭nat表上启用的连接追踪机制;),有以下2个内建链:
- PREROUTING
- OUTPUT
加上表的描述,数据包经过防火墙的流程可以总结为下图:

优先级次序
表间优先顺序
raw -–> mangle –-> nat -–> filter
链间优先顺序
入站数据:PREROUTING、INPUT
出站数据:OUTPUT、POSTROUTING
转发数据:PREROUTING、FORWARD、POSTROUTING
链内规则匹配顺序
自上向下按顺序依次进行检查,找到相匹配的规则即停止,若在该链内找不到的相匹配的规则,则按该链的默认策略处理(未修改的情况下,默认策略为允许 ACCEPT
)
iptables 的规则
iptables
规则的关键:
- Rules 包括一个条件和一个目标 (target)
- 如果满足条件,就执行目标(target)中的规则或者特定值。
- 如果不满足条件,就判断下一条Rules
目标值(Target Values)
可以在 target 里指定的特殊值:
ACCEPT
:允许数据包通过DROP
:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应REJECT
:拒绝数据包通过,必要时会给数据发送端响应信息,客户端刚请求就会收到拒绝的信息SNAT
:源地址转换,解决内网用户用同一个公网地址上网的问题MASQUERADE
:是 SNAT 的种特殊形式,适用于动态的、临时会变的IP上DNAT
:目标地址转换REDIRECT
:在本机做端口映射LOG
:在文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
举例
iptables -t filter -I INPUT -p tcp --dport 12345 -j REJECT
该命令表示在 filter
表的 INPUT
链上添加一条 REJECT
规则,由以上可知,INPUT
链在数据流入的方向上,将 tcp 连接且目标端口为12345 的数据包拒绝掉,即以 tcp 访问本机 1234 5的数据都会被拒绝,达到防火墙的目的
本文为原理简介,关于更多 iptables
的操作将有另一篇文章说明