AlmaLinux 10:rich rule 的条件、日志与精确删除
在 AlmaLinux 10.2 特权容器(firewalld 2.4.3,默认 bridge 网络,与宿主隔离)中实测 rich rule 的增删查,含「删错规则」的对照。日志:plans/content-expansion/evidence/logs/alma-firewalld-rich-rules.log(AlmaLinux 10.2 实测)。
容器共享宿主内核(5.14),firewalld/systemd 是真实 EL10 用户态;内核层 netfilter 行为需真机复核。
什么时候需要 rich rule
Section titled “什么时候需要 rich rule”三种典型需求:只允许某网段访问端口、放行但记日志、对日志限速。普通 --add-port 只能做到「这个 zone 全放行」,做不到按来源或带日志。
条件放行:source + port
Section titled “条件放行:source + port”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 --reloadfirewall-cmd --list-rich-rulessuccesssuccessrule family="ipv4" source address="192.0.2.0/24" port port="8080" protocol="tcp" accept日志与限速:log + limit
Section titled “日志与限速:log + limit”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 --reloadfirewall-cmd --list-rich-rules两条规则同时存在时,--list-rich-rules 的输出顺序不保证与添加顺序一致(Rocky 10.2 实测里就是反的),删除请按字符串而不是顺序。limit value="3/m" 只限制日志触发频率,不限制连接建立速率。
删除:必须原样
Section titled “删除:必须原样”sudo firewall-cmd --permanent --remove-rich-rule="$R1"sudo firewall-cmd --reloadfirewall-cmd --list-rich-rules剩下的是 R2。删除按规则内容匹配:尾部多一个空格实测仍能删(空白被容忍),但条件不一致时什么都不删,只打印:
Warning: NOT_ENABLED: rule family="ipv4" source address="198.51.100.0/24" port port="9091" protocol="tcp" acceptsuccess退出码依然是 0——脚本必须检查输出,而不是只看 $?。

与普通放行的关系
Section titled “与普通放行的关系”rich rule 在 zone 内先于普通 service/port 规则匹配;命中后不再继续。因此:
- 想「默认全放行、只对某网段记录日志」:rich rule 放在前面,普通放行放后面;
- 想「只允许某网段」:不要同时开
--add-port,否则普通放行会把范围放大。
- 删错规则仍显示 success:输出里有
Warning: NOT_ENABLED才是没删掉; - 只改运行时:没
--permanent,重启丢; - 日志看不到:firewalld 日志进 journal,用
journalctl -u firewalld或dmesg查。
练习:只允许 10.0.0.0/24 访问 8443,并记日志
Section titled “练习:只允许 10.0.0.0/24 访问 8443,并记日志”R='rule family="ipv4" source address="10.0.0.0/24" port port="8443" protocol="tcp" log prefix="LAB-8443: " level="info" limit value="5/m" accept'sudo firewall-cmd --permanent --add-rich-rule="$R"sudo firewall-cmd --reloadfirewall-cmd --list-rich-rulessudo firewall-cmd --permanent --remove-rich-rule="$R"sudo firewall-cmd --reloadfirewall-cmd --list-rich-rules检查:
- 列表里出现带 log 的规则
journalctl -u firewalld --no-pager | tail能看到规则加载记录- 删除后列表为空
- 把端口改成 9091 再删 → 输出
Warning: NOT_ENABLED,规则仍在
常见问题
rich rule 能同时写 source 和 destination 吗?
可以,一条规则里可同时带 source/destination 与 port/service,但条件越多越难维护;建议拆成多条语义清晰的规则。
日志在哪里看?
firewalld 的 log 规则通过内核日志输出,通常在 journalctl -u firewalld 或 dmesg 里;用 grep 前缀(如 SSH-ACCESS)过滤最快。
EL9 与 EL10 的写法一样吗?
rich rule 语法一致;EL10 的 firewalld 是 2.4.x,EL9 为 1.x,个别选项(如 nftables 后端细节)不同,升级前用 --check-config 或测试机验证。
- 放行端口:firewalld 放行端口
- 纯端口放行:
/firewalld-zones/(EL9 页;add-port 等基础用法在 EL10 语法一致) - 安装后核对:新装系统 7 项核对