firewall-cmd添加永久规则需先确认firewalld运行状态,明确zone作用域,使用--permanent选项添加端口或服务,再执行--reload生效,并通过--list-all和外部连通性测试验证。

直接用 firewall-cmd 添加永久规则并重载即可,关键是要区分临时和永久配置、明确作用域(zone)、并验证是否真正生效。
确认 firewalld 正在运行
很多问题其实出在防火墙根本没启动。先检查状态:
- 运行
sudo firewall-cmd --state,输出running才说明服务已启用 - 如果未运行,执行
sudo systemctl start firewalld启动,并用sudo systemctl enable firewalld设置开机自启
明确当前使用的 zone 区域
firewalld 按“区域”管理规则,默认通常是 public,但不能假设——必须查准:
- 查看默认 zone:
sudo firewall-cmd --get-default-zone - 查看所有活跃 zone 及对应网卡:
sudo firewall-cmd --get-active-zones - 后续所有添加操作都建议显式指定
--zone=xxx,避免规则加错区域
开放端口:推荐永久 + 显式协议
不要只加一次临时规则,生产环境必须用 --permanent 并 --reload:
- 开放单个 TCP 端口(如 8080):
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent - 开放 UDP 端口(如 DNS 的 53):
sudo firewall-cmd --zone=public --add-port=53/udp --permanent - 开放端口范围(如 8000–8010):
sudo firewall-cmd --zone=public --add-port=8000-8010/tcp --permanent - 执行
sudo firewall-cmd --reload让永久规则生效
更安全的做法:用服务名或富规则限制来源
硬写端口号容易出错且难维护;加 IP 限制能大幅降低风险:
- 优先启用内置服务(自动适配标准端口+协议):
sudo firewall-cmd --zone=public --add-service=https --permanent - 若需自定义服务(如 Nginx 监听 8080),可创建
/usr/lib/firewalld/services/myapp.xml,再启用:sudo firewall-cmd --add-service=myapp --permanent - 仅允许某网段访问特定端口(如只让内网 192.168.1.0/24 访问 22):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept'
验证是否真的放通
别只看命令返回 success,要交叉验证:
- 查永久规则:
sudo firewall-cmd --permanent --list-ports或--list-services - 查当前运行时规则:
sudo firewall-cmd --list-all(含 zone、服务、端口、富规则) - 从外部机器测试连通性:
telnet your-server-ip 8080或nc -zv your-server-ip 8080 - 确认服务本身在监听:
sudo ss -tlnp | grep ':8080'(比 netstat 更现代)


















