iptables 和 netfilter 是一套 Linux 防火墙组合工具,共同合作完成系统的防护工作。
iptables 是客户端工具,netfilter 是服务端程序,
iptables 工作在用户态,netfilter 工作在内核态,
用户可以通过 iptables 命令作用到服务端的 netfilter,netfilter 触发相应的回调函数(hook 机制)执行相应的防护动作。
五链
netfilter 是 Linux 内核中内置的网络数据包处理框架,提供了 5 个 hook 点,当网络包在协议栈中流转到这些 hook 点时,就会依次执行在这些hook 点上注册的各种规则,进而实现对网络包的各种处理。

PRE_ROUTING
- 通过数据链路层解包,进入网络层的数据包通过该 hook 点
- 所有接收数据包到达的第一个 hook 点
- 此处可以进行数据包目的地址转换(DNAT)
LOCAL_IN
- 经过路由查找后,目的地址是本机的数据包,会到达该 hook 点
IP_FORWARD
- 进过路由查找后,目的地址不是本机地址的数据包(即转发的数据包),会到达该 hook 点
LOCAL_OUT
- 所有本地生成的发往其它机器的数据包,在进入网络栈后首先到达该 hook 点
POST_ROUTING
- 本机产生准备发出的数据包或转发的数据包,在经过路由判断后,会到达该 hook 点
四表
每个 hook 点可以注册各种规则,这些规则根据用途的不同,可以分为 4 个表,分别是 raw 表,mangle 表,nat 表和 filter 表。
每个链中的表,按照下面的优先顺序进行查找匹配:
1 | raw > mangle > nat > filter |

raw 表
- 用于决定数据包是否被连接跟踪机制处理
mangle 表
- 用于数据包的拆解、修改、再封装
- 修改包的 IP 头
nat 表
- 数据包的网络地址转换
filter 表
- 用于数据包过滤,判断是否允许一个包通过
更准确的说
用户通过 iptables(或 nftables)将规则添加到某个“表”中
当数据包到达某个 hook 点(如 NF_IP_PRE_ROUTING)时,内核会依次调用注册在该 hook 上的各个表的处理函数
每个表只在它“关心”的 hook 点注册处理逻辑
在每个表内部,规则按链(chain)组织