在firewalld中为指定IP加白名单需用rich rule显式允许,设public zone默认target为DROP,并重载生效;否则仅加accept规则无效。

在 firewalld 中为指定 IP 加入白名单,核心是使用 rich rule 显式声明允许该 IP 的访问,并确保规则持久化、重载生效。不能只用 --add-source 或 --add-service,否则会绕过白名单逻辑,导致全网可连。
确认 firewalld 状态并进入 public zone
大多数服务器默认使用 public 区域,操作前先确认:
- 检查服务是否运行:
systemctl status firewalld - 如未运行,启动并设开机自启:
systemctl start firewalld && systemctl enable firewalld - 确认当前默认 zone:
firewall-cmd --get-default-zone(通常为public)
添加单个 IP 白名单(开放所有端口)
适用于管理 IP(如跳板机或运维终端),允许该 IP 访问服务器上所有服务:
- 执行命令(替换
192.168.1.100为你的真实 IP):firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept' - 立即重载使规则生效:
firewall-cmd --reload - 验证是否写入:
firewall-cmd --list-rich-rules,应看到含accept的对应条目
添加精准白名单(仅放行某 IP + 某端口)
生产环境推荐方式,例如只允许 10.0.0.5 访问 SSH(22 端口)或数据库(3306 端口):
- 先清理可能冲突的全局规则(如有):
firewall-cmd --permanent --zone=public --remove-port=22/tcp - 添加富规则:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="22" protocol="tcp" accept' - 重载:
firewall-cmd --reload - 注意:IP 后不加空格,引号必须匹配,
port port="22"写法不可省略
设置默认拒绝策略(真正实现“白名单”效果)
仅加 accept 规则还不够——firewalld 默认是“默认允许”,必须显式关闭其他流量:
- 将 public zone 的默认目标设为 DROP:
firewall-cmd --permanent --zone=public --set-target=DROP - 重载后,只有你明确添加的 rich rule 才能通过,其余全部拦截
- 此步至关重要,否则白名单形同虚设


















