iptables
定义
iptables是面向Linux的命令行工具,用于在用户空间增删改查内核包过滤规则;它与内核中的netfilter框架配合,后者才是实际处理数据包的部分。因此iptables常被理解为一套“规则编辑器”:规则由用户态程序写入内核的过滤表,数据包经过网络协议栈时再由netfilter逐条比对[3]。在Linux 2.4内核之前,类似的角色由ipchains承担,iptables是在其基础上重新设计的产品[4]。
同一套内核框架下还有面向IPv6的ip6tables、面向ARP的arptables和面向以太网桥的ebtables,它们合并称为xtables工具族[5]。
原理
iptables把规则按功能分成若干张表:filter表负责放行或拦截数据包,nat表负责改写源、目的地址与端口,mangle表用于修改报文头部字段,raw表用于决定报文是否进入连接跟踪,security表则依安全策略处理数据包[1]。每张表包含若干内建链,链就是规则的顺序列表;filter表有INPUT、FORWARD、OUTPUT三条链,nat表主要使用PREROUTING与POSTROUTING[4]。
数据包到达后先经过PREROUTING钩子做路由判定,发往本机的进入INPUT,需要转发的进入FORWARD,本机产生的外出报文走OUTPUT,最后在POSTROUTING离开网卡[1]。因此三条典型路径分别为“PREROUTING→INPUT”“PREROUTING→FORWARD→POSTROUTING”和“OUTPUT→POSTROUTING”[6]。同一位置若有多张表的规则,处理次序依次为raw、mangle、nat、filter[7]。
每条规则由匹配条件与动作组成,匹配条件可指定协议、源与目的地址、进出网卡和端口,动作则用-j指定跳转目标[8]。常见动作包括ACCEPT放行、DROP静默丢弃、REJECT拒绝并回送错误报文、LOG记录日志;链上若无规则命中,则按该链的默认策略处理[4]。
规则匹配是自上而下逐条进行的,命中即止,因此规则顺序直接决定结果[9]。连接跟踪机制让防火墙能识别NEW、ESTABLISHED、RELATED、INVALID等连接状态,据此放行已建立连接的回程流量。下图概括了报文在钩子点上的去向。
flowchart LR
A[报文到达] --> B[PREROUTING]
B --> C{路由判定}
C -->|目的为本机| D[INPUT]
C -->|需要转发| E[FORWARD]
F[本机进程] --> G[OUTPUT]
D --> H[本机进程]
E --> I[POSTROUTING]
G --> I
I --> J[发出网卡]
发展历程
Linux早期使用源自BSD的ipfw,2.0内核时期的管理工具为ipfwadm,2.2内核时期改为ipchains[10]。Netfilter框架由Rusty Russell于1998年创建,2000年3月合入内核,并随Linux 2.4版正式应用,iptables成为其用户空间的配置工具[11]。
随着规则规模扩大,iptables的结构性问题逐渐显现:修改一条规则往往要把整套规则复制到用户空间改完再整体写回内核,规则集庞大时开销明显;内核侧也逐条匹配,难以支撑大规模策略[10]。Netfilter项目的开发者因此另起炉灶,2008年由Patrick McHardy提出nftables,该项目于2009年正式启动,并被设计为iptables的替代者[12]。
nftables自Linux 3.13起进入内核主线,采用基于netlink的原子规则集更新与集合、映射等结构[2]。为保证过渡,iptables 1.8系列同时提供传统命令与以nft为后端的iptables-nft等变体,以及规则翻译工具[5]。iptables由此进入维护状态,新功能不再增加,但在既有系统与工具链中仍被广泛调用[13]。
应用
在主机防护方面,管理员常用iptables设定默认拒绝入站、放行已建立连接,再按端口放行SSH、HTTP、HTTPS等服务[14]。规则的持久化依赖iptables-save与iptables-restore,或在启动脚本中重新加载[15]。
在网关场景中,iptables的nat表可用于源地址转换与目的地址转换,实现内网共享公网地址的伪装上网和端口映射转发[15]。容器与虚拟化平台也常借助iptables完成端口发布与流量隔离[16]。
由于直接书写规则门槛较高,出现了多个上层前端:UFW是Ubuntu等发行版中简化配置的封装,firewalld则以区域与服务的概念提供运行时动态调整,二者底层仍依托netfilter[17]。在CentOS 7之后的版本中,系统默认防火墙服务改为firewalld,iptables命令仍可添加规则,但不再作为服务常驻[14]。
局限
iptables的规则以线性链表形式存放,数据包需按顺序逐条比对,规则数量增加后匹配开销随之上升[13]。借助ipset把大量地址或网段收进哈希集合,可以缓解这一问题,但集合功能需额外安装,集成度有限[12]。
更新规则集的方式也带来局限:修改通常需要整体替换当前规则集,在高负载环境中可能造成短暂中断[13]。此外,IPv4与IPv6需分别用iptables和ip6tables配置,规则难以保持一致;四套工具之间的代码重复也增加了维护负担[2]。
命令语法有较多特例,被认为复杂且不便于使用,尽管存在大量脚本和生成器帮助隐藏具体命令,架构层面的限制仍无法靠前端解决[10]。面向未来,iptables已不再增加重大功能,新部署通常转向nftables[13]。
参见
参考资料
- iptables/netfilter [引用日期2026-10-29]
- Netfilter – Wikipedia [引用日期2026-10-29]
- 解析iptables原里及设置规则 [引用日期2026-10-29]
- Chapter 17. iptables [引用日期2026-10-29]
- iptables [引用日期2026-10-29]
- google.com 上的网页 [引用日期2026-10-29]
- Linux安全基础 [引用日期2026-10-29]
- iptables.8 [引用日期2026-10-29]
- nftables-and-iptables [引用日期2026-10-29]
- linux-magazin.de 上的网页 [引用日期2026-10-29]
- netfilter - Linux 2.4.x引入的网络数据包处理框架 [引用日期2026-10-29]
- nftables, far more than %s/ip/nf/g [引用日期2026-10-29]
- nftables和iptables的区别,多维度对比理解! [引用日期2026-10-29]
- 防火墙 [引用日期2026-10-29]
- Linux防火墙如何配置 [引用日期2026-10-29]
- iptables, nftables, UFW, and firewalld [引用日期2026-10-29]
- Debian防火墙与其他安全工具比较 [引用日期2026-10-29]