firewall-cmd --reload是标准做法,它通过D-Bus向运行中进程发送指令,增量更新netfilter规则链,毫秒级完成且不中断TCP连接,前提是先用--permanent将配置写入磁盘。

直接执行 firewall-cmd --reload 就是标准做法,它本身设计目标就是平滑重载、不中断连接、零丢包。
为什么 --reload 能做到零丢包
firewalld 的 reload 不是重启服务,而是通过 D-Bus 向运行中的 firewalld 进程发送指令,让它:
- 读取
/etc/firewalld/下所有已修改的 XML 文件(zone、service、rich rule 等) - 比对当前运行时规则与磁盘配置差异
- 仅增量更新 netfilter 规则链 —— 新增的端口/服务追加,删除的自动撤出,已有规则保持不动
- 整个过程在毫秒级完成,TCP 连接状态由内核 conntrack 维护,不受影响
--reload 前必须确保磁盘配置已写入
reload 只加载磁盘配置,它不会“猜”你刚输过什么命令。常见错误是:
- 只运行
firewall-cmd --add-port=8080/tcp(仅改运行时,未落盘) - 再执行
--reload,结果新端口消失
正确流程只有两步:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
firewall-cmd --permanent --zone=public --add-port=8080/tcpfirewall-cmd --reload
这两步合起来,才是把 XML 配置(实际写入 /etc/firewalld/zones/public.xml)真正推入内核。
验证是否生效且无丢包
不用抓包也能确认:
- 查运行时开放端口:
firewall-cmd --zone=public --list-ports(应立刻显示 8080) - 查磁盘配置是否写入:
grep 8080 /etc/firewalld/zones/public.xml(应存在对应 port 行) - 持续 ping 或 curl 测试服务:reload 执行期间,已有连接不断,新连接按新规则放行
批量更新时建议一次 reload
如果要开多个端口或服务,不要每加一条就 reload 一次:
- 重复 reload 会触发多次 netfilter 更新,徒增开销
- 应统一加
--permanent,最后集中执行一次--reload - 例如:
firewall-cmd --permanent --add-service=http && firewall-cmd --permanent --add-service=https && firewall-cmd --reload










