Rocky 10:firewalld rich rule 的写法与增删
在 Rocky Linux 10.2 特权容器(firewalld 2.4.3,默认 bridge 网络,与宿主隔离)里用 systemctl start firewalld 起服务后实测:--add-rich-rule、--reload、--list-rich-rules、--remove-rich-rule,含一条「删错规则」的对照。日志:plans/content-expansion/evidence/logs/rocky-firewalld-rich-rules.log(Rocky 10.2 实测,firewalld 2.4.3)。
容器共享宿主内核(5.14),firewalld 与 systemd 是真正的 EL10 用户态;凡涉及内核 netfilter 行为,以真机为准。
rich rule 解决什么问题
Section titled “rich rule 解决什么问题”普通放行只有「哪个 zone 的哪个端口/服务」;rich rule 加上条件:源地址、目标地址、协议、日志、限速。典型场景是「只允许某个网段访问 8080」或「SSH 放行并记录日志(只限制日志频率)」。
按源地址放行一个端口
Section titled “按源地址放行一个端口”R1='rule family="ipv4" source address="192.0.2.0/24" port port="8080" protocol="tcp" accept'sudo firewall-cmd --permanent --add-rich-rule="$R1"sudo firewall-cmd --reloadsudo firewall-cmd --list-rich-rulessuccesssuccessrule family="ipv4" source address="192.0.2.0/24" port port="8080" protocol="tcp" accept只有 192.0.2.0/24 能到 8080,其他来源仍按 zone 的默认策略。
带日志与限速的放行
Section titled “带日志与限速的放行”R2='rule family="ipv4" service name="ssh" log prefix="SSH-ACCESS: " level="notice" limit value="3/m" accept'sudo firewall-cmd --permanent --add-rich-rule="$R2"sudo firewall-cmd --reloadsudo firewall-cmd --list-rich-rulesrule family="ipv4" source address="192.0.2.0/24" port port="8080" protocol="tcp" acceptrule family="ipv4" service name="ssh" log prefix="SSH-ACCESS: " level="notice" limit value="3/m" acceptlog 记录命中的连接,limit value="3/m" 只限制日志触发频率,不限制连接建立速率。日志前缀要能一眼看出是这条规则,否则排障时无从下手。
删除要一字不差
Section titled “删除要一字不差”sudo firewall-cmd --permanent --remove-rich-rule="$R1"sudo firewall-cmd --reloadsudo firewall-cmd --list-rich-rulessuccesssuccessrule family="ipv4" service name="ssh" log prefix="SSH-ACCESS: " level="notice" limit value="3/m" accept删除时 firewalld 会按规则内容匹配:实测尾部多一个空格仍能删除成功(空白被容忍),但端口/地址等条件不一致时不会删掉任何东西,只输出一行警告:
Warning: NOT_ENABLED: rule family="ipv4" source address="198.51.100.0/24" port port="9091" protocol="tcp" acceptsuccess注意它退出码仍是 0。脚本里不能只看 $?,要检查输出里有没有 NOT_ENABLED。

- 规则写错但删不掉:输出
Warning: NOT_ENABLED却返回 success,脚本会误判成功,要 grep 输出; - 忘记
--permanent+--reload:只改运行时,重启即丢; - rich rule 与 service/port 的关系:rich rule 先匹配,命中后不再走 zone 的普通规则。
练习:加两条 rich rule 并精确删除
Section titled “练习:加两条 rich rule 并精确删除”R='rule family="ipv4" source address="10.0.0.0/24" port port="8443" protocol="tcp" accept'sudo firewall-cmd --permanent --add-rich-rule="$R"sudo firewall-cmd --reloadsudo firewall-cmd --list-rich-rulessudo firewall-cmd --permanent --remove-rich-rule="$R"sudo firewall-cmd --reloadsudo firewall-cmd --list-rich-rules检查:
- 添加后
--list-rich-rules出现该规则 - 删除后列表里不再有它
- 把规则里的端口改掉再删 → 输出
Warning: NOT_ENABLED,规则仍在列表里 --permanent --list-rich-rules与运行时一致
常见问题
rich rule 和直接 add-port 有什么区别?
add-port 对该 zone 全放行;rich rule 可以加源地址、目标、日志、限速等条件。需要「只允许某些来源」时用 rich rule。
为什么 remove-rich-rule 一直失败?
它按字符串精确匹配。把 --list-rich-rules 的输出原样复制(含引号与空格),或用变量保存添加时的字符串。
limit 限制的是连接数吗?
不是。limit 限制的是日志(或动作)的触发频率,不限制连接建立速率;要限连接需用其他机制(如 nftables 的 limit 或上层限流)。
- zone 与端口放行:firewalld 放行端口
- 纯端口放行:
/firewalld-zones/(EL9 页,rich rule 之外的基础用法) - 网络排查:按症状分诊网络问题