跳转到内容
搜索 AlmaLinux 文档

    浏览当前文档目录

    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 行为需真机复核。

    三种典型需求:只允许某网段访问端口、放行但记日志、对日志限速。普通 --add-port 只能做到「这个 zone 全放行」,做不到按来源或带日志。

    Terminal window
    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 --reload
    firewall-cmd --list-rich-rules
    success
    success
    rule family="ipv4" source address="192.0.2.0/24" port port="8080" protocol="tcp" accept
    Terminal window
    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 --reload
    firewall-cmd --list-rich-rules

    两条规则同时存在时,--list-rich-rules 的输出顺序不保证与添加顺序一致(Rocky 10.2 实测里就是反的),删除请按字符串而不是顺序。limit value="3/m" 只限制日志触发频率,不限制连接建立速率。

    Terminal window
    sudo firewall-cmd --permanent --remove-rich-rule="$R1"
    sudo firewall-cmd --reload
    firewall-cmd --list-rich-rules

    剩下的是 R2。删除按规则内容匹配:尾部多一个空格实测仍能删(空白被容忍),但条件不一致时什么都不删,只打印:

    Warning: NOT_ENABLED: rule family="ipv4" source address="198.51.100.0/24" port port="9091" protocol="tcp" accept
    success

    退出码依然是 0——脚本必须检查输出,而不是只看 $?。

    AlmaLinux 10.2:list-rich-rules 输出,以及删不存在的规则仍打印 success、exit=0

    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,并记日志”
    Terminal window
    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 --reload
    firewall-cmd --list-rich-rules
    sudo firewall-cmd --permanent --remove-rich-rule="$R"
    sudo firewall-cmd --reload
    firewall-cmd --list-rich-rules

    检查:

    1. 列表里出现带 log 的规则
    2. journalctl -u firewalld --no-pager | tail 能看到规则加载记录
    3. 删除后列表为空
    4. 把端口改成 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 或测试机验证。