iptables -l 默认只显示 filter 表规则,不显示 nat/mangle 表内容,且不反映持久化状态或 firewalld/nftables 后端真实配置;需结合 -t、-v、-n 参数查计数器、默认策略及服务状态才能确认实际生效规则。

iptables -L 显示的规则为什么和实际生效的不一致
直接执行 iptables -L 默认显示的是 filter 表的 INPUT、FORWARD、OUTPUT 链,但很多生产环境规则实际在 nat 表(如端口转发)或 mangle 表(如 TOS 标记),这些不会被默认显示出来。更关键的是:它只显示当前内存中的规则,不反映是否启用了持久化服务(比如 iptables-services 或 netfilter-persistent),重启后可能失效。
- 加
-t nat查看 DNAT/SNAT 规则:iptables -t nat -L -n -v - 加
-t mangle查看数据包修改类规则 -
-n禁用 DNS 反查,避免卡顿;-v显示字节数/包数,确认规则是否真在匹配 - 若输出为空但网络异常,可能是防火墙根本没运行(
systemctl status iptables看状态)
如何确认某条规则是否正在生效并被命中
仅看规则列表不能说明它起作用了,得看计数器是否增长。用 -v 参数后,每行开头的 pkts 和 bytes 列就是该规则匹配的数据包和字节数。如果长期为 0,要么流量没经过这条链,要么上层规则已 DROP 或 REJECT 掉了流量,后续规则根本没机会匹配。
- 对特定端口做测试:用
curl或telnet从另一台机器访问,再立刻执行iptables -L INPUT -n -v | grep :22,观察pkts是否增加 - 注意链的顺序:规则自上而下匹配,一旦匹配就执行动作(
ACCEPT/DROP等),不再继续向下比对 - 若想临时清空计数器以便观察,用
iptables -Z INPUT(慎用,生产环境可能影响监控)
iptables -L 输出里 Chain policy ACCEPT 是什么意思
每条链末尾的 Chain INPUT (policy ACCEPT) 表示该链的默认策略(default policy),即:当所有规则都未匹配时,最终执行的动作。这个策略本身不是一条规则,不参与匹配,也不计入 pkts 计数,但它决定“漏网之鱼”的命运。
- 常见误操作:删光所有规则后发现还能连 SSH,就是因为
INPUT链 policy 还是ACCEPT - 安全加固时通常设为
DROP:iptables -P INPUT DROP,但必须先确保已有允许 SSH 的规则,否则会立即断连 -
iptables -P修改的是运行时策略,重启后还原——需配合iptables-save > /etc/sysconfig/iptables(RHEL/CentOS)或iptables-save | sudo tee /etc/iptables/rules.v4(Debian/Ubuntu)持久化
替代方案:firewalld 或 nftables 下还能用 iptables -L 吗
在启用 firewalld 的系统(如 CentOS 7+/RHEL 8+、Fedora)中,iptables 命令仍可运行,但看到的往往是空规则或少量底层桥接规则,因为 firewalld 实际通过 nftables 后端管理,不再直接操作 iptables 内核接口。此时 iptables -L 已不具备参考价值。
- 查 firewalld 当前配置:
firewall-cmd --list-all(当前 zone)、firewall-cmd --list-all-zones - 查底层 nftables 规则:
nft list ruleset,这才是真实生效的规则集 - 混用风险:手动改
iptables规则 + 启用firewalld极易导致冲突,建议统一用firewall-cmd或彻底禁用firewalld再用iptables
真正要确认“当前生效”的规则,不能只信 iptables -L 的输出,得结合表名、计数器、默认策略、服务状态,以及当前系统是否已切换到 nftables 后端。最稳妥的做法是:先 systemctl status iptables 或 systemctl status firewalld 确认哪个服务在管,再选对应命令查。











