跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    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 行为,以真机为准。

    普通放行只有「哪个 zone 的哪个端口/服务」;rich rule 加上条件:源地址、目标地址、协议、日志、限速。典型场景是「只允许某个网段访问 8080」或「SSH 放行并记录日志(只限制日志频率)」。

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

    只有 192.0.2.0/24 能到 8080,其他来源仍按 zone 的默认策略。

    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
    sudo firewall-cmd --list-rich-rules
    rule family="ipv4" source address="192.0.2.0/24" port port="8080" protocol="tcp" accept
    rule family="ipv4" service name="ssh" log prefix="SSH-ACCESS: " level="notice" limit value="3/m" accept

    log 记录命中的连接,limit value="3/m" 只限制日志触发频率,不限制连接建立速率。日志前缀要能一眼看出是这条规则,否则排障时无从下手。

    Terminal window
    sudo firewall-cmd --permanent --remove-rich-rule="$R1"
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-rich-rules
    success
    success
    rule 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" accept
    success

    注意它退出码仍是 0。脚本里不能只看 $?,要检查输出里有没有 NOT_ENABLED。

    Rocky Linux 10.2:list-rich-rules 与 NOT_ENABLED 警告(exit=0)

    • 规则写错但删不掉:输出 Warning: NOT_ENABLED 却返回 success,脚本会误判成功,要 grep 输出;
    • 忘记 --permanent + --reload:只改运行时,重启即丢;
    • rich rule 与 service/port 的关系:rich rule 先匹配,命中后不再走 zone 的普通规则。

    练习:加两条 rich rule 并精确删除

    Section titled “练习:加两条 rich rule 并精确删除”
    Terminal window
    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 --reload
    sudo firewall-cmd --list-rich-rules
    sudo firewall-cmd --permanent --remove-rich-rule="$R"
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-rich-rules

    检查:

    1. 添加后 --list-rich-rules 出现该规则
    2. 删除后列表里不再有它
    3. 把规则里的端口改掉再删 → 输出 Warning: NOT_ENABLED,规则仍在列表里
    4. --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 或上层限流)。