firewalld配置IP白名单必须使用rich-rule显式指定source address、服务/端口及动作,禁用--add-service或--add-port全局放行;需分别添加本机(127.0.0.1)、管理IP及拒绝规则,并按顺序reload验证。

firewalld 配置复杂源地址白名单,核心在于用 rich rule 精确控制源 IP、端口、协议和动作,同时必须理清规则顺序、默认策略与持久化机制。直接加 service 或 port 会绕过白名单逻辑,导致失效。
必须用 rich rule 显式定义源+服务/端口
firewalld 的 --add-service 或 --add-port 是全局放行,不识别来源限制。真要白名单,每条规则都得带 source address 和具体目标条件:
- 只允许 192.168.1.100 访问 SSH:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' - 只允许 10.10.5.0/24 访问 TCP 8080:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.5.0/24" port port="8080" protocol="tcp" accept' - 支持多个源 IP,需分别添加多条规则;不支持在一条 rule 中写多个 address
务必显式放行本机和管理网段
白名单规则只匹配经过外部网卡的流量。本地回环(127.0.0.1)、内网管理地址(如跳板机或监控节点)若未单独放行,会导致运维中断:
- 放行本机 SSH:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" service name="ssh" accept' - 放行内网管理 IP(如
192.168.10.5):firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" service name="ssh" accept' - 别用
localhost—— firewalld 不识别该字符串,只认 IPv4/IPv6 地址或 CIDR
设置明确拒绝规则并控制匹配顺序
firewalld 默认对未匹配规则的连接是 silent drop(无响应),不利于排查。加一条带 reject 的兜底规则,让非法访问立刻返回 Connection refused:
- 在所有
accept规则添加完毕后,再加拒绝规则:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="ssh" reject' - firewalld 按添加顺序匹配,所以
reject必须最后加,否则会提前截断合法请求 - 加完全部规则后,必须执行
firewall-cmd --reload才生效
验证与清理关键步骤
配置后不验证,等于没配。尤其远程操作时,错一条可能失联:
- 查看当前所有富规则:
firewall-cmd --list-rich-rules—— 输出里应有你加的accept和最后的reject - 检查是否残留全局开放规则(如之前用
--add-port=22/tcp):firewall-cmd --list-ports,若有,先删:firewall-cmd --permanent --remove-port=22/tcp - 临时备份当前配置:
firewall-cmd --permanent --zone=public --list-all > /root/firewall-backup-$(date +%s).txt


















