应将内部服务部署在internal或home等高信任zone,仅对可信网段用rich rule精准放行端口,避免在public zone开放端口或依赖粗粒度source限制。

要限制指定网段访问内部服务,关键不是“封禁”,而是“精准放行”或“条件拒绝”——firewalld 默认策略是拒绝未明确允许的入站连接,所以更稳妥的做法是:只允许可信网段访问目标端口/服务,其余一律拦截。
确认服务运行在正确的 zone 中
firewalld 的规则按 zone 生效,不同 zone 有不同默认行为。内部服务(如数据库、内网 API)应部署在 internal 或 home 这类高信任区域,而非默认的 public 区域。
- 查看当前活跃 zone 和绑定接口:
firewall-cmd --get-active-zones - 把内网网卡(如 ens160)永久加入 internal 区域:
firewall-cmd --permanent --zone=internal --add-interface=ens160 - 设 internal 为默认 zone(可选):
firewall-cmd --set-default-zone=internal
只允许特定网段访问某服务或端口
不建议在 public zone 上开放端口再加 IP 限制,而应在目标 zone(如 internal)中用富规则(rich rule)精确控制源地址。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 允许 192.168.10.0/24 访问 SSH:
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' - 允许同一网段访问 MySQL 端口:
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="3306" protocol="tcp" accept' - 若需拒绝某网段(如屏蔽 10.5.0.0/16),可用
reject或drop:firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="10.5.0.0/16" reject'
验证并重载配置
富规则生效前必须重载,且需检查是否已正确加载到目标 zone。
- 重载所有规则:
firewall-cmd --reload - 查看 internal zone 全部规则:
firewall-cmd --zone=internal --list-all - 特别留意输出中的 rich rules 部分,确认你添加的规则已存在
补充说明:避免常见误操作
直接在 public zone 添加端口(如 --add-port=3306/tcp)会向所有外部网络开放,失去网段控制能力;同样,用 --add-source 添加网段仅适用于整个 zone 的粗粒度控制,不如 rich rule 灵活精准。
如果服务监听在 127.0.0.1(仅本地),外部无论如何都访问不到——请先确认服务 bind 地址是 0.0.0.0 或内网 IP。

















