firewalld rich-rules 实现源ip限制需绑定区域、指定源地址与动作并持久化,支持单ip/网段放行、端口协议组合、日志限速及兜底拒绝,执行--reload生效。

Linux 系统中用 firewalld 的 rich-rules 实现源 IP 限制,核心是绑定区域、明确源地址、指定动作,并持久化生效。它比简单端口开放更精准,也比直接操作 iptables 更安全可控。
确认区域并绑定规则作用域
rich-rule 必须属于某个 zone(如 public、internal),不能脱离区域存在:
- 查当前活跃区域:firewall-cmd --get-active-zones
- 查目标 zone 当前全部配置(含已有 rich-rule):firewall-cmd --list-all --zone=public
- 若需在 internal 区域加白名单,所有命令必须显式加 --zone=internal
添加单 IP 或网段白名单
只允许特定来源访问,是最常见的源 IP 限制场景。语法简洁,字段不可省略:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 放行单个 IP(任意端口):firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" accept'
- 放行整个子网(如办公网段):firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.100.47.0/24" accept'
- 注意:不写 port 或 service 表示该 IP 可访问本机所有开放服务(前提是其他规则未拒绝)
组合目的端口与协议做精细放行
仅允许可信 IP 访问关键端口(如数据库、管理接口),避免“全端口白名单”带来的风险:
- 只允许 192.168.10.5 访问 MySQL 的 3306 端口:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" port port="3306" protocol="tcp" accept'
- 支持端口范围写法,例如 VNC 端口 5900–5905:port port="5900-5905" protocol="tcp"
- 动作必须明确:accept(放行)、reject(返回拒绝响应)、drop(静默丢弃)
增强防护:日志、限速与兜底拒绝
生产环境建议叠加可观测性与防御强度,避免规则“裸奔”:
- 记录匹配流量(日志进 /var/log/messages):log prefix="db-access" level="notice"
- 防暴力探测,限制新连接频率(如每分钟最多 3 次):limit value="3/m"
- 加一条无 source 的兜底拒绝规则,确保未授权 IP 对目标端口完全不可达:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="3306" protocol="tcp" drop'
- 完整示例(带日志+限速+放行):firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" port port="3306" protocol="tcp" log prefix="mysql-allow" limit value="3/m" accept'
规则添加后必须执行 firewall-cmd --reload 才会生效;所有带 --permanent 的操作,重启 firewalld 后仍保留。不复杂但容易忽略。










