iptables是内核netfilter的用户态工具,非传统服务;重启丢规则需手动保存,确认生效需检查firewalld状态、iptables规则链、内核模块及命令版本。

iptables 不是“开个服务就能用”的传统服务,它本质是内核 netfilter 框架的用户态操作工具。在 CentOS 7+/Ubuntu 16.04+ 等现代发行版中,iptables 命令仍可用,但默认不带持久化服务——你加的规则重启就丢,除非手动保存。
怎么确认当前生效的是 iptables 还是 firewalld
别猜,直接看:
-
systemctl status firewalld:如果显示active (running),说明firewalld正在管事,此时iptables -L显示的可能是它自动生成的兼容规则(非你手写的) -
iptables -t filter -S:输出原始规则语句,比-L更可靠,能看清是否真有你加的规则 -
lsmod | grep ip_tables:返回非空说明内核模块已加载,iptables命令底层可用 -
which iptables和iptables --version:确认命令存在且版本 ≥ 1.4.21(避免老系统里缺-m state支持)
关键点:Ubuntu 默认没装 iptables-services 包,CentOS 7+ 默认禁用 iptables 服务,但 iptables 命令本身仍可临时加规则。
添加一条放行 Web 端口的 INPUT 规则
常见错误是只写 -A INPUT -p tcp --dport 80 -j ACCEPT 就以为完事了——这规则加在链末尾,而默认策略(POLICY DROP)可能已经把包拒之门外。
正确做法(以 Ubuntu/Debian 或关闭 firewalld 的 CentOS 为例):
- 先确保已有 ESTABLISHED/RELATED 流量放行:
iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 再插入新规则到合适位置(比如第2条):
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT - 最后检查顺序:
iptables -nL INPUT --line-numbers,确认 ESTABLISHED 在最前、你的规则紧随其后
注意:-I 插入比 -A 追加更安全;--dport 必须配合 -p tcp 或 -p udp,否则无效;conntrack 模块名在新版内核中替代了旧的 state 模块(-m state --state 已弃用)。
为什么重启后规则没了?怎么保存
因为 iptables 规则是运行时写进内核的,不自动落盘。不同系统保存方式不同:
- Ubuntu/Debian:
sudo apt install iptables-persistent,然后sudo netfilter-persistent save(会存到/etc/iptables/rules.v4) - CentOS 7+(启用传统服务):
sudo yum install iptables-services,再sudo service iptables save(存到/etc/sysconfig/iptables) - 通用临时方案(不推荐长期用):
iptables-save > /root/my-iptables.rules,开机时用iptables-restore 加载
容易踩的坑:Ubuntu 上装了 iptables-persistent 但没运行 netfilter-persistent reload,规则依然不会加载;CentOS 7+ 执行 service iptables save 前必须先 systemctl stop firewalld,否则会被覆盖。
INPUT 链里有一条 REJECT 规则,但它总在生效,怎么调顺序
iptables 是**从上到下逐条匹配**,一旦命中就执行目标(ACCEPT/DROP/REJECT),不再继续。所以如果你在末尾加了 REJECT,又没在它前面放好 ACCEPT 规则,所有流量都会被拦住。
排查和修复步骤:
- 用
iptables -nL INPUT --line-numbers查看带行号的规则列表 - 找到那条
REJECT规则的行号(比如第5行),再看它上面有没有覆盖目标端口的ACCEPT - 若没有,用
iptables -I INPUT 4 -p tcp --dport 22 -j ACCEPT把 SSH 规则插到它前面 - 若已有但位置靠后,先删掉再重插:
iptables -D INPUT 5,再iptables -I INPUT 4 ...
真正麻烦的不是加规则,而是理解「匹配即终止」这个逻辑——很多连不上 SSH 的问题,根源就是一条 REJECT 规则挡在了所有 ACCEPT 前面,而且没人去看行号。

















