先运行systemctl status firewalld,若显示active (running),则firewalld正在接管;此时iptables命令仅作查看,规则不生效。要切回iptables,需停用firewalld、安装iptables-services并启用iptables服务。

必须先确认你用的真是 iptables,而不是 firewalld 在背后接管规则。直接敲 iptables -L 看到空或旧规则,不代表没防火墙——很可能 firewalld 正在运行,iptables 命令只是个只读查看器。
怎么判断当前生效的是 iptables 还是 firewalld
运行 systemctl status firewalld。如果显示 active (running),那所有你用 iptables 命令加的规则都不会实际生效;流量由 firewalld 动态生成的内核规则控制。此时改 iptables 配置等于白忙。
- 想切回原生 iptables:先停并禁用
firewalld:systemctl stop firewalld && systemctl disable firewalld - RHEL/CentOS 7+ 还需装
iptables-services:yum install iptables-services,再systemctl start iptables - 验证是否真正接管:执行
iptables -t nat -L -n,再立刻firewall-cmd --list-all—— 两者输出应不一致,且后者应报错或提示未运行
为什么 -m conntrack --ctstate ESTABLISHED,RELATED 必须放在最前面
Linux 内核默认对新连接不做状态跟踪,iptables 匹配是严格按顺序逐条执行的。一旦某条规则匹配并触发 DROP 或 REJECT,后续规则就不再检查。
- 典型翻车现场:
iptables -P INPUT DROP后再iptables -A INPUT -p tcp --dport 22 -j ACCEPT→ 实际等效于“全拒”,因为-A把规则加到了默认策略之后 - 正确姿势:用
-I插入高优先级规则,例如:iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 注意:
state模块在较新内核(≥4.18)已被标记为废弃,conntrack是唯一可靠替代;别再用--state NEW这类写法
开放服务端口时,-I 和 -A 的区别直接决定连得上还是连不上
-A 是追加到链尾,-I 是插入到链首(或指定序号)。防火墙没有“智能合并”,只有“从上往下硬匹配”。
- SSH 要能连上,至少需要两条规则:
① 放行返回流量(ESTABLISHED,RELATED)
② 放行新建 SSH 连接(--dport 22 -m conntrack --ctstate NEW)
这两条都必须在任何DROP规则之前 - 查顺序用:
iptables -L INPUT -n --line-numbers - 删某条规则用:
iptables -D INPUT 3(删第 3 行),不是iptables -D INPUT -p tcp --dport 22—— 后者会报错或误删 - 别依赖
-P INPUT DROP当兜底;更稳妥的是显式加一条拒绝规则在末尾:iptables -A INPUT -j DROP,这样还能配合LOG记录被拦的包
保存规则后重启不生效?检查 /etc/sysconfig/iptables 路径和权限
iptables-services(RHEL系)或 iptables-persistent(Debian系)才是持久化机制,service iptables save 只是把当前内存规则写进 /etc/sysconfig/iptables,但该文件是否被加载取决于 init script 是否启用。
- 确认路径存在且可读:
ls -l /etc/sysconfig/iptables,内容应是纯文本规则 dump,不是二进制 - RHEL/CentOS 7+:确保
iptables服务已启用:systemctl is-enabled iptables应返回enabled - Debian/Ubuntu:用
iptables-save > /etc/iptables/rules.v4,并确认netfilter-persistent服务已启动 - 改完规则不重启服务也能生效,但不保存的话 reboot 后全丢 —— 别跳过这步
真正容易被忽略的点在于:状态检测不是开个模块就行,它依赖内核 nf_conntrack 模块加载、连接跟踪表大小设置、以及规则位置是否卡在流量路径关键节点上。哪怕 conntrack 模块已加载,若第一条规则就 DROP,后面再准也没用。











