说到 firewalld 防火墙白名单配置,它的核心逻辑其实非常清晰:默认拒绝,按需精准放行。在 CentOS 服务器的实际运维场景中,建议优先使用 rich rule 按 IP 与端口进行细粒度控制,或者通过新建 zone 并绑定源 IP 后再开放对应端口。这里有一个关键细节一定要注意:任何包含 --permanent 参数的操作,都必须紧接着执行 firewall-cmd --reload 才会正式生效。另外,务必避免把这类白名单策略与全局端口放行混合使用,以免引发规则冲突或访问控制失效。

确认 firewalld 已启用并运行
在配置 CentOS 防火墙白名单之前,先确认 firewalld 服务已经正常工作:
- 启动服务:
sudo systemctl start firewalld - 设置开机自启:
sudo systemctl enable firewalld - 检查运行状态:
sudo firewall-cmd --state(返回running才表示正常)
两种主流白名单方式选一种即可
方式一:按源 IP + 端口进行精细控制(推荐)
适合只允许特定 IP 访问指定端口,例如仅让 192.168.1.5 访问 8080 端口:
- 允许单个 IP 访问指定 TCP 端口:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.5" port protocol="tcp" port="8080" accept' - 允许某个 IP 段(如 192.168.1.0/24)访问多个端口:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080-8090" accept' - 允许某个 IP 访问全部端口(谨慎使用):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.10" accept'
方式二:按源 IP 绑定到 zone(适合内网多台互信主机)
可以新建一个专用区域,把白名单 IP 全部加入其中,再统一开放所需服务端口:
- 创建新 zone:
sudo firewall-cmd --permanent --new-zone=trusted-intranet - 添加白名单 IP:
sudo firewall-cmd --permanent --zone=trusted-intranet --add-source=192.168.10.10sudo firewall-cmd --permanent --zone=trusted-intranet --add-source=192.168.10.11 - 在该 zone 开放所需端口:
sudo firewall-cmd --permanent --zone=trusted-intranet --add-port=3306/tcpsudo firewall-cmd --permanent --zone=trusted-intranet --add-port=8080/tcp
必须执行的收尾动作
所有带 --permanent 的命令都只是写入配置文件,并不会立即在当前系统中生效:
- 重载防火墙规则:
sudo firewall-cmd --reload(如果漏掉这一步,前面的配置基本等于没有生效) - 验证规则是否生效:
sudo firewall-cmd --list-all或sudo firewall-cmd --list-rich-rules - 查看已生效的源 IP 规则:
sudo firewall-cmd --zone=public --list-sources(如果使用了--add-source这种方式)
特别注意几个坑
下面这些常见错误,往往会导致 firewalld 白名单看起来配置成功,实际上却没有真正生效:
- 不要先全局开放端口,再追加 IP 白名单限制:例如先执行
--add-port=8080/tcp,再添加 rich rule,后者通常就失去意义——因为这个端口已经对所有来源开放 - Docker 容器映射端口默认不完全受 firewalld 管控:如果目标端口是 Docker 通过
-p 8300:8300方式映射出来的,默认情况下 firewalld 规则可能不会按预期生效。此时需要修改/etc/docker/daemon.json,加入"iptables": false,然后重启 Docker - 不要在 public 区域里同时做白名单和全局放通端口:这种混用方式很容易产生冲突。更推荐使用 rich rule 做精准访问控制,或者单独新建 zone 来隔离防火墙策略
