firewall-cmd 配置 ip 白名单需遵循“先放行、再拒绝、最后持久化”原则:先用 rich rule 精确允许指定 ip/端口,再添加对应端口的兜底拒绝规则,最后执行 --reload 生效并验证。

直接用 firewall-cmd 配置 IP 白名单,核心是“先放行、再拒绝、最后持久化”,不能只加一条允许规则就以为完事了。默认的 public 区域通常已开放 HTTP、SSH 等服务,若不清理或兜底,白名单形同虚设。
确认 firewalld 状态和当前区域
执行前先检查基础环境,避免命令无效:
- 运行
systemctl status firewalld确保服务处于 active (running) 状态;未运行则执行systemctl start firewalld && systemctl enable firewalld - 查默认区域:
firewall-cmd --get-default-zone(通常是public) - 查活跃接口:
firewall-cmd --get-active-zones,确认你要控制的网卡(如eth0)确实在该 zone 下
按需添加富规则(rich rule)
白名单必须精确到 IP + 端口/服务,推荐使用 rich rule,语法清晰且支持细粒度控制:
- 只允许
192.168.5.20访问 MySQL 的 3306 端口:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.5.20" port port="3306" protocol="tcp" accept' - 允许整个子网
10.200.30.0/24访问 SSH:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.200.30.0/24" port port="22" protocol="tcp" accept' - 允许某 IP 使用系统预定义服务(如
http):firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" service name="http" accept'
务必添加兜底拒绝规则
光放行不够,必须显式拒绝其他所有来源对目标端口的访问,否则默认策略仍会放行:
- 拒绝其他所有 IP 访问 3306 端口:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="3306" protocol="tcp" reject' - 拒绝其他所有 IP 访问 22 端口:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" reject' - 注意:这两条拒绝规则必须在对应放行规则之后添加,firewalld 按顺序匹配 rich rule
保存并验证配置
所有带 --permanent 的操作都只是写入配置文件,不立即生效:
- 执行
firewall-cmd --reload加载全部新规则 - 查看当前生效的 rich rule:
firewall-cmd --list-rich-rules - 查看整个 public zone 的完整策略:
firewall-cmd --list-all --zone=public - 测试时建议保留一个已有连接(如本地终端),再从被允许 IP 和非允许 IP 分别尝试 telnet 或 curl,确认行为符合预期











