需要限源和限速就用富规则
普通放行只有“服务”或“端口”两个维度,无法表达“仅允许某个网段访问”。富规则(rich rule)能组合源地址、目的端口、协议、日志、限速等条件,是 SSH、数据库、管理接口这类敏感服务的标准写法:放行只对指定来源生效,其余一律被区域兜底策略拦掉。写富规则前必须知道一条关键规则:同一区域内富规则的求值顺序是 log、deny、allow,与书写顺序无关。
基本信息
| 加固项 | 敏感服务的来源限定 |
|---|---|
| 适用平台 | Linux(firewalld,富规则自 0.3.9 起可用) |
| 权限要求 | root 或已授权的 polkit 用户 |
| 达标判据 | SSH 与数据库等端口仅对指定网段可达 |
| 功能范围 | 源地址、端口、协议、日志、限速、转发等组合 |
典型使用场景
- 管理端口只允许运维网段访问
- 数据库只允许应用服务器网段访问
- 对暴露服务加日志与限速,观察异常扫描
- 临时放行并设定明确来源范围,避免全域敞开
- 按来源地址划分不同信任级别的访问策略
源网段放行
源网段放行
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.20.0.0/16" port port="22" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.20.30.0/24" port port="3306" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.20.30.0/24" port port="22" protocol="tcp" limit value="4/m" accept'
firewall-cmd --reload # 使规则生效
firewall-cmd --list-rich-rules # 复核已写入的富规则带日志的规则与回收
带日志的规则与回收
# 记录被拒绝的访问,便于观察扫描与误配
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="22" protocol="tcp" log prefix="SSH-DENY " level="info" drop'
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.20.0.0/16" port port="22" protocol="tcp" accept'
firewall-cmd --reload && firewall-cmd --list-rich-rules # 回收后复核动作与顺序
| 动作或规则 | 含义 | 注意点 |
|---|---|---|
| accept | 放行 | 通常配合 source 限定使用 |
| drop | 静默丢弃 | 对外暴露面推荐,减少信息泄露 |
| reject | 回绝并返回错误 | 便于对端快速感知,语义更明确 |
| log | 记录日志 | 与 drop 或 reject 组合使用 |
| limit value="4/m" | 限速,每分钟 4 次 | 缓解扫描与暴力尝试 |
| 求值顺序 | log 优先、其后 deny、最后 allow | 与书写顺序无关,写错会互相抵消 |
最容易被误解的一点是同区域内 deny 与 allow 的求值顺序:写一条针对 0.0.0.0/0 的 drop 会连想你放行的 accept 一起拒掉,与规则书写顺序无关。限源场景应当用区域目标策略兜底,或者只对足够小的地址范围写 deny,并在写完后用一次真实连接验证预期行为。
富规则写完后必须 reload 才生效,--permanent 只表示“下次加载时生效”,这是 firewalld 使用中最常见的返工点。复核时用 --list-rich-rules 确认内容与预期一致,再从其他网段实测是否真的被拒,两侧都对上才算完成。