当前用的是firewalld而非iptables:运行systemctl status firewalld,若显示active(running),则iptables命令仅作只读查看,实际规则由firewalld动态管理。

怎么判断当前用的是 iptables 还是 firewalld
CentOS 7/RHEL 7+、Fedora、AlmaLinux 等默认启用了 firewalld,哪怕你装了 iptables 命令,底层也可能被它接管;而 CentOS 6 或手动停用 firewalld 的系统才真正走 iptables 内核规则链。不确认就硬敲 iptables -L,看到的可能是空规则或旧残留,实际流量根本不受控。
- 运行
systemctl status firewalld,如果显示active (running),那iptables命令只是个“只读查看器”,改了也不生效 - 想强制用原生 iptables?先停 firewalld:
systemctl stop firewalld && systemctl disable firewalld,再装并启用iptables-services(RHEL系)或直接写/etc/sysconfig/iptables后systemctl start iptables -
iptables -t nat -L -n能看到 SNAT/DNAT 规则,但若 firewalld 在运行,这些规则其实是它动态生成的,别手动混改
INPUT 链里必须加 ESTABLISHED,RELATED 才能上网
很多人加完 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 就以为通了 SSH,结果发现本机能 ping 外网,但外网连不上自己——问题常出在没放行“返回流量”。Linux 默认策略是 INPUT DROP,而连接建立后的响应包(比如你发 HTTP 请求后收到的 HTML)会被当成新连接拦掉。
- 务必在所有
ACCEPT规则前加这一条:iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT - 注意:现代内核已弃用
state模块,推荐改用conntrack:iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 这条不能放最后,否则前面的
DROP或REJECT会先截住返回包,SSH 会卡在密码输入后黑屏
开放端口时,-I 和 -A 的顺序决定生死
iptables -A INPUT 是追加到链尾,iptables -I INPUT 是插入到链首。防火墙按顺序匹配,一旦命中就执行动作不再往后看。很多线上事故就因为把 -A 出来的规则放在了默认 DROP 后面。
- 典型错误:
iptables -P INPUT DROP→iptables -A INPUT -p tcp --dport 80 -j ACCEPT→ 实际等效于“全拒”,因为-A把规则加到了DROP后面 - 正确做法:用
-I插入关键规则,例如:iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT,再iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT - 查顺序用
iptables -L INPUT -n --line-numbers,删某条用iptables -D INPUT 3(删第 3 行)
保存规则不是命令执行完就自动落盘
iptables 命令改的是内核运行时规则,重启就清空。CentOS 6 用 service iptables save,RHEL 7+ 要装 iptables-services 并确保 iptables 服务已启用;Ubuntu/Debian 则依赖 iptables-persistent 包和 netfilter-persistent 服务。
- CentOS 7 执行
service iptables save报错?说明没装iptables-services,先yum install iptables-services,再systemctl enable iptables - Ubuntu 下装完
iptables-persistent后,要手动运行iptables-save > /etc/iptables/rules.v4才算存进去 - 别信“改完就永久生效”,没保存的规则连
reboot都扛不住,上线前必验:iptables -L和reboot后再iptables -L对比
iptables 规则本质是线性匹配的指令流,没有“智能覆盖”——后加的不会覆盖先加的,只会排队等执行。顺序、状态跟踪、保存机制这三点,漏掉任一个,防火墙就从盾变成障。










