直接用firewalld富规则可精准实现IP白名单,需先移除默认开放端口或服务,再添加source address+port/service的accept规则,推荐追加显式drop规则,最后重载并验证。

直接用 firewalld 的富规则(rich rule)就能精准实现,核心是把“源 IP”和“服务或端口”两个条件组合起来,再指定 accept 动作。不需要改服务监听地址,也不依赖应用配置,干净且可持久化。
先清理默认开放,避免规则冲突
如果已用 --add-port 或 --add-service 开放过目标端口(比如 80、3306、8080),这些规则会允许全网访问,会覆盖后续的白名单规则。必须先移除:
- 关闭已开放的端口:
firewall-cmd --permanent --remove-port=8080/tcp - 或关闭已启用的服务:
firewall-cmd --permanent --remove-service=https - 执行
firewall-cmd --reload生效
用 rich-rule 添加白名单规则
语法结构清晰,关键字段不能漏:family、source address、port/service、protocol、action。例如只允许 192.168.5.20 访问 Nginx 的 80 端口:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.5.20" port port="80" protocol="tcp" accept'- 若服务有标准名(如 ssh、mysql),可用
service name="ssh"替代 port+protocol,更安全 - 支持 CIDR 网段,如
source address="10.0.10.0/24"
显式拒绝其他访问(可选但推荐)
firewalld 默认策略是拒绝未匹配流量,但加一条明确的 drop 规则能防止误配、提升防御强度:
- 丢弃所有对 80 端口的其他请求:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="80" protocol="tcp" drop' - 注意:这条规则要放在白名单规则之后添加,firewalld 按添加顺序匹配(后加的排在后面,优先级更低)
验证与生效
配置完必须重载,且需检查是否写入永久配置:
- 确认已持久化:
firewall-cmd --list-rich-rules应显示刚添加的规则 - 立即生效:
firewall-cmd --reload - 从白名单 IP 和非白名单 IP 分别测试连通性,例如:
curl -I http://your-server-ip或telnet your-server-ip 80 - 查看日志排查(如加了 log):
sudo tail -f /var/log/messages | grep "firewalld"


















