优先选firewalld:Red Hat系默认且支持热更新、多网卡zone管理;iptables适用于Debian/Ubuntu、老旧系统或需raw/mangle表、限速等精细控制场景;二者共存易冲突,应二选一并确保配置持久化。

该用 firewalld 还是 iptables?看系统默认和运维习惯
Red Hat 系列(CentOS 7+/RHEL 8+/AlmaLinux 9)默认启用 firewalld,且其服务与 iptables 服务互斥——两者同时运行会导致规则覆盖、策略失效甚至 SSH 断连。Debian/Ubuntu 默认不装 firewalld,更倾向 ufw 或直接操作 iptables。所以第一步不是选功能,而是看系统底子:已启用 firewalld 就别硬切 iptables;老旧系统(如 CentOS 6)或容器宿主机无 firewalld 时,iptables 是唯一可行选项。
需要热更新、多网卡或快速上线?选 firewalld
当你执行 firewall-cmd --add-port=8080/tcp,规则立刻生效,不影响现有 TCP 连接;而 iptables -A INPUT ... 后必须 service iptables save && systemctl restart iptables,这个 reload 过程会清空连接跟踪表,导致所有 ESTABLISHED 连接中断(比如正在传大文件的 rsync、长连接 WebSocket)。另外,firewalld 的 zone 模型天然适配多网卡场景:外网走 public 区域(只开 SSH),内网走 internal(放行 NFS、MySQL),不用手写一堆 -i eth0/-i eth1 判断逻辑。
- 适用场景:云服务器日常运维、CI/CD 自动部署防火墙、混合网络环境(如物理机+Docker bridge)
- 坑点:默认策略是 全拒,不开服务/端口就什么都连不上;
--permanent必须配--reload才落地,漏掉 reload 就白配 - 命令示例:
firewall-cmd --permanent --zone=public --add-source=192.168.10.0/24→ 只对这个网段应用 public 规则
要精细控制包头、绕过 conntrack 或写自动化脚本?回退 iptables
firewalld 底层仍调用 iptables,但它屏蔽了 raw/mangle 表、跳转链(-j REDIRECT)、限速模块(-m limit)等能力。比如你想让某 IP 的 HTTP 请求每秒最多 5 次,iptables 一行搞定:iptables -A INPUT -s 203.0.113.5 -p tcp --dport 80 -m limit --limit 5/sec -j ACCEPT;而 firewalld 不支持 limit 模块,得额外套一层 rich rule(语法复杂且难调试)。
SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板
- 适用场景:NAT 网关、透明代理、DDoS 初级防护、嵌入式设备轻量部署
- 坑点:
iptables-save输出的是完整规则集,手动编辑/etc/sysconfig/iptables时缩进/空行错一个字符就会加载失败;-A和-I顺序极易搞混,导致 DROP 规则插在 ACCEPT 前面 - 关键动作:改完务必验证:
iptables -L INPUT -v -n | head -10看计数器是否增长,再ss -tlnp | grep :22确认端口监听没被封死
二者共存?可以但强烈不建议
技术上 firewalld 启动后会接管 iptables 规则链(把 INPUT/FORWARD 设为 firewalld 的自定义链),此时直接用 iptables 命令加规则,大概率被 firewalld 下次 reload 清掉。反过来,若你停了 firewalld 却忘了关它自动生成的 iptables 规则,那些残留规则还会继续生效——查 iptables -L -t filter 能看到一堆 firewalld 留下的链,但 firewall-cmd 已经管不了它们。
- 真实风险:运维交接时,有人用
firewall-cmd开了端口,有人用iptables -D删了某条规则,结果发现“明明开了 80 端口却打不开”,因为删的是另一条关联链 - 底线做法:二选一,并在
/etc/firewalld/firewalld.conf中确认FirewallBackend=iptables(默认值),避免误切到 nftables 后端引发兼容问题
真正容易被忽略的,是状态同步——firewalld 的 --permanent 配置不会自动同步到运行时,iptables 的临时规则重启即丢。别信“我配好了”,一定要 firewall-cmd --runtime-to-permanent 或 iptables-save > /etc/sysconfig/iptables 落盘,再 reboot 测试一次。









