搞Linux运维和网络安全这块的,要是没跟iptables打过交道,那基本等于没进过机房。哪怕是现在nftables、firewalld这些新工具铺天盖地,大量存量服务器、容器网络方案、云平台底层策略,绕来绕去最后还是落到iptables这套规则框架上。不少面试题里也喜欢拿它考人,软考和等保测评里更是常客。正因为它太常用,反而很多人只是机械地记几条命令,规则一多就乱,出了问题不知道从哪里查起。
这篇东西我准备换个思路,不给你整那种“命令大全”式的罗列,而是从“4表5链”的底层逻辑出发,把查规则、增删改、保存还原、NAT转发、日常排障这些真正高频的操作串起来讲。每一条指令我都会说清楚它解决什么问题、背后走的是什么流程、有哪些必须避开的坑。不管你是刚接手服务器的新人,还是被防火墙规则折磨过的老手,按这条线走一遍,iptables基本就能玩转了。
1. 先把“4表5链”刻进脑子,否则后面全是死记硬背
很多人学iptables最大的障碍,是一上来就背指令。-A、-I、-D这些参数背得滚瓜烂熟,可真到了要给服务器开一个端口,或者做一条端口转发的时候,反而不知道要写在哪个表、哪条链上。问题的根源在于,没理解iptables的骨架——表和链。
1.1 三张核心表和它们的职责边界
iptables里有多张表,日常折腾得最多的其实就三张:filter表、nat表、mangle表。还有一张raw表,一般搞特殊需求的人才碰,日常运维基本用不上,了解即可。
- filter表:负责过滤,也就是我们常说的“允许”和“拒绝”。它是默认表,你平时执行
iptables -A INPUT -p tcp --dport 22 -j ACCEPT这类命令,如果不显式指定-t参数,规则默认就进filter表。工作节点是INPUT、FORWARD、OUTPUT三条链。 - nat表:负责网络地址转换,核心功能是改写数据包的源地址或目标地址。典型场景就是SNAT(源地址转换,常用于共享上网)、DNAT(目标地址转换,常用于端口映射/转发)。它工作在PREROUTING、INPUT、OUTPUT、POSTROUTING这几条链上。
- mangle表:负责数据包的标记、修改头部字段,比如修改TTL、设置QoS标记、打上MARK标记供策略路由使用。优先级最高,最先处理数据包。日常用得少,但在一些复杂限速和分流场景里是神器。
提示:查规则的时候一定要带
-t参数看清是哪张表。很多人用iptables -L -n一看没有规则,就以为防火墙没配,实际是nat表里有NAT规则没看见。
1.2 五条链的流量走向和判断技巧
链就是数据包经过的路径节点。五条链分别是:
- PREROUTING:数据包进入网卡后、路由判断前。
- INPUT:数据包目的地是本机时,进入本机进程前。
- FORWARD:数据包目的地不是本机,需要转发给其他主机时。
- OUTPUT:本机进程发出的数据包,出去之前。
- POSTROUTING:数据包即将离开网卡前。
判断一条规则该放哪条链,核心就问两个问题:数据包是发给谁的在?是进还是出?
如果是外部访问服务器本身的SSH端口,那是进,走的是PREROUTING → INPUT,过滤规则放INPUT链。如果是服务器主动访问外面的网站,那是出,走的是OUTPUT链,过滤规则放OUTPUT链。如果这台服务器是路由器/网关,内网机器通过它上外网,数据包只是路过,不发给本机,那走的是FORWARD链,同时要配合nat表做SNAT。
这个概念搞不清楚,后面所有规则都会写得四不像。我自己见过很多新手在INPUT链里写FORWARD规则,或者在nat表里做filter的事,最后只能一脸懵地排查为什么不通。
1.3 数据包在表与链之间的穿越顺序
数据包穿过一串链的时候,各个表是有优先级顺序的。顺序大致是:
- PREROUTING链:raw → mangle → nat
- INPUT链:mangle → filter
- FORWARD链:mangle → filter
- OUTPUT链:raw → mangle → nat → filter
- POSTROUTING链:mangle → nat
看这个顺序能发现一个关键点:mangle表最先处理,filter表排最后。所以如果你既想标记数据包又想做过滤,标记规则必须在过滤规则之前生效。这也是为什么有些复杂场景里,你在filter表里写的规则明明看着对,却总是不生效——因为包在mangle表里就被拦截或者标记了,根本到不了filter表。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 查询指令:你要先学会看,才能学会改
我接手任何一台服务器,第一件事永远是查看现有规则,而不是急着加规则。很多线上事故都是因为不清楚已有规则,盲目追加导致冲突或者把管理通道给堵死了。
2.1 三条查询命令和它们的差异
实践中最常用的是这三条:
bash复制iptables -L -n -v
iptables -t nat -L -n -v
iptables -t mangle -L -n -v
拆开解释一下:
-L:列出规则。-n:不做DNS反解。这个参数非常重要,如果不加,iptables会对IP做反查域名,一旦DNS解析卡住,命令会在那里干等半天,线上排障时急死人。-v:显示更多详细信息,包括每个规则匹配了多少个包、多少字节、对应的网卡接口。
我个人的习惯是再加一个--line-numbers参数,给每条规则编号:
bash复制iptables -L -n -v --line-numbers
有了编号,后面插入、删除规则就方便多了。否则你想删一条规则还得把整条规则原样打出来,非常容易打错。
2.2 查看规则的输出信息怎么看
拿一段典型的输出举例:
text复制Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target
