新手用firewalld rich rules需先确保服务运行并绑定zone,再按“谁、条件、访问什么、如何处理”逻辑配置;必须加--permanent持久化,用--reload生效,支持IP白名单、service语义化、log/reject/drop等组合控制。

新手用 firewalld 的 rich rules 做细粒度访问控制,关键不是堆命令,而是理清“谁、在什么条件下、能访问什么、怎么处理”这四件事。它比直接开端口更安全,也比写 iptables 更直观——你不需要记住链名或匹配顺序,只要按逻辑组织规则就行。
先确认基础环境是否就绪
rich rule 不是独立运行的,它依赖 firewalld 正常工作,并绑定到某个 zone(区域)。新手最容易卡在这一步:
- 运行
sudo systemctl status firewalld确认服务已启动;没运行就执行sudo systemctl start firewalld && sudo systemctl enable firewalld - 查当前默认区域:
firewall-cmd --get-default-zone,常见是public;如需切换,用sudo firewall-cmd --set-default-zone=public - 别跳过
--permanent参数:临时添加的 rich rule 在 reload 后会消失,所有生产配置必须带这个参数
从最常用场景开始:IP 白名单放行指定端口
比如只允许运维机 192.168.10.5 访问服务器的 SSH(22端口),其他任何 IP 都不能连——这是典型“默认拒绝、显式允许”策略:
- 命令写法:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" port port="22" protocol="tcp" accept' - 注意引号和空格:整个规则用单引号包裹,
source address和port port中间有空格,不能写成sourceaddress - 子网写法示例(允许整个段):
source address="192.168.10.0/24";单 IP 也可加/32显式声明,如"192.168.10.5/32"
进阶控制:组合条件与动作选择
rich rule 支持叠加多个条件,也能指定不同响应方式,新手容易忽略这些细节:
- 拒绝并反馈(推荐用于调试):
reject会让客户端收到“Connection refused”,适合明确拒绝的场景;drop是静默丢包,更隐蔽但难排查 - 限制特定服务而非端口:
service name="ssh"比port port="22"更语义化,且自动适配服务定义的全部端口/协议 - 加日志便于追踪:
log prefix="my-ssh-block" level="info"可接在accept/reject前,日志会出现在/var/log/messages - 一条规则只能有一个动作(accept/drop/reject),不能同时写两个;如需多动作,得拆成多条规则
验证与日常维护要点
配置完不验证,等于没配。新手常漏掉这步,导致规则看似生效实则无效:
- 查看当前所有 rich rule:
sudo firewall-cmd --list-rich-rules(只显示运行时规则);加--permanent查持久化规则:sudo firewall-cmd --permanent --list-rich-rules - 每次修改后必须重载:
sudo firewall-cmd --reload,否则新规则不会生效 - 删除某条规则:把
--add-rich-rule换成--remove-rich-rule,其余内容完全一致,包括引号和空格 - 不要混用 zone:默认操作的是 default zone,如需指定区域(比如只想在
internal区域加规则),加上--zone=internal

















