应根据系统版本选择firewalld(centos 7+等默认)或iptables(centos 6等旧系统),二者不兼容;确认方式为systemctl status firewalld(active即启用)和systemctl status iptables(not found或inactive即未使用)。

firewalld 是当前主流 Linux 发行版(CentOS 7+、Rocky/AlmaLinux 8+、Fedora)默认且推荐的防火墙工具;iptables 仅适用于旧系统(如 CentOS 6、Debian 9 及更早),新环境强行切换反而易出问题。
怎么确认当前用的是 firewalld 还是 iptables
直接运行以下两个命令:
systemctl status firewalld —— 若显示 active (running),说明 firewalld 正在工作;
systemctl status iptables —— 若提示 Unit iptables.service could not be found 或状态为 inactive,基本可排除 iptables 主导。
注意:两者不能共存。若 firewalld 已启用,iptables -L 显示的规则实际是 firewalld 底层生成的快照,不是你手动写的规则——别误以为“能看懂 iptables 就能改 firewalld”。
firewalld 开启/关闭服务必须分三步走
firewalld 的“开启”不是单个命令的事,漏掉任一环节都可能失联:
- 先放行 SSH:
sudo firewall-cmd --permanent --add-service=ssh(不加--permanent就只是临时生效,重启后失效) - 再重载规则:
sudo firewall-cmd --reload(这一步让刚才的规则真正进入运行时) - 最后启动服务:
sudo systemctl start firewalld(此时才真正激活防火墙) - 开机自启补上:
sudo systemctl enable firewalld(否则重启后又回到裸奔状态)
反向关闭也一样:先 sudo systemctl stop firewalld,再 sudo systemctl disable firewalld。别只停服务不 disable,下次 reboot 它又自己起来了。
开放端口时最容易踩的坑是 permanent 和 reload 漏一环
比如你要开 Node.js 的 3000/tcp 端口:
✅ 正确写法:sudo firewall-cmd --permanent --add-port=3000/tcp + sudo firewall-cmd --reload
❌ 常见错误:
- 只执行
--add-port不加--permanent→ 重启后端口关闭 - 加了
--permanent却忘了--reload→ 规则写进磁盘了,但没加载进内核,端口依然不通 - 用
--remove-port后没--reload→ 看似删了,其实还在生效
验证是否真生效,别只信 firewall-cmd --list-ports,它只显示当前运行时规则;要确认永久规则是否落盘,得看:sudo firewall-cmd --permanent --list-ports。
云服务器上防火墙配置前必须先过安全组这一关
阿里云、腾讯云、AWS 的 ECS 实例,流量路径是:安全组 → 操作系统防火墙 → 应用程序。两者是“与”关系,缺一不可。
也就是说:
- 即使 firewalld 放行了
80/tcp,但安全组没开 80 端口 → 外网根本连不到防火墙 - 即使安全组开了 80,但 firewalld 没放行 → 流量能到服务器,但被防火墙拦在门外
排查不通时,先用 telnet your-server-ip 80 或 curl -v http://your-server-ip 确认是否卡在连接层;再登录服务器跑 sudo firewall-cmd --state 和 sudo firewall-cmd --list-services 查本地策略。别一头扎进防火墙调半天,结果发现安全组压根没配。











