firewalld 不支持 --Query-Zone 参数;正确方式是:1. 用 firewall-cmd --get-zone-of-interface=INTERFACE 查询网卡实际所属 zone;2. 用 firewall-cmd --get-active-zones 和 --list-all 验证 zone 是否启用并加载规则;3. 结合 --query-port 等布尔接口做脚本化校验。

Firewalld 没有 --Query-Zone 这个接口。这是常见误解——firewalld 的命令行工具 firewall-cmd 不支持 --Query-Zone 参数,官方文档和源码中均无此选项。
你真正需要的是以下两个标准、稳定、可脚本化的方式,来实时确认某网卡(如 eth0)当前所属 zone 及其生效规则状态:
✅ 1. 查看网卡实际归属的 zone(最核心)
使用 `firewall-cmd --get-zone-of-interface=INTERFACE`,它返回当前绑定的 zone 名称,若未绑定则返回空:
# 示例:检查 eth0 所属 zone
zone=$(firewall-cmd --get-zone-of-interface=eth0 2>/dev/null)
if [ -z "$zone" ]; then
echo "⚠️ eth0 未绑定到任何 zone(可能未配置,或已移除)"
else
echo "✅ eth0 当前属于 zone: $zone"
fi
✅ 关键点:
- 输出是纯文本 zone 名(如 public、trusted),无多余信息,适合 Shell 判断;
- 若接口不存在或未被 firewalld 管理,命令返回非零退出码,可用 $? 捕获;
- 不依赖配置文件,读取的是 运行时实际状态,满足“实时核准”需求。
✅ 2. 验证该 zone 是否启用且规则已加载
仅知道 zone 名不够——还需确认该 zone 处于激活状态,并应用了预期规则:
-
检查 zone 是否在运行时启用:
firewall-cmd --list-all-zones | grep -q "^$zone:$"(粗略)
更可靠方式:firewall-cmd --get-active-zones | grep -q "^$zone:" -
检查该 zone 是否有明确规则(非默认继承):
firewall-cmd --zone=$zone --list-all --quiet(加--quiet抑制错误输出)
若返回非零码,说明 zone 不存在或未加载;若返回内容含services:或ports:,说明有自定义策略。
? 小技巧:用 --permanent 对比运行时,可发现配置未重载问题:firewall-cmd --permanent --zone=$zone --list-services vs firewall-cmd --zone=$zone --list-services
✅ 3. 在监控脚本中组合判断(实用模板)
下面是一个轻量、健壮的 Shell 片段,用于监控 eth0 的隔离状态是否符合预期(例如:必须在 dmz zone,且开放 80/tcp):
iface="eth0" expect_zone="dmz" expect_port="80/tcp" <p>actual_zone=$(firewall-cmd --get-zone-of-interface=$iface 2>/dev/null) if [[ "$actual_zone" != "$expect_zone" ]]; then echo "❌ FAIL: $iface is in '$actual_zone', expected '$expect_zone'" exit 1 fi</p><p>if ! firewall-cmd --zone=$actual_zone --query-port="$expect_port" >/dev/null; then echo "❌ FAIL: $expect_port not open in zone '$actual_zone'" exit 1 fi</p><p>echo "✅ PASS: $iface correctly isolated in $actual_zone with $expect_port"
? 注意:
- --query-port、--query-service 等才是 firewalld 提供的真·布尔查询接口;
- 所有 firewall-cmd 命令默认操作运行时(runtime),加 --permanent 才查持久配置;
- 监控脚本建议加超时和重试(如 timeout 5 firewall-cmd ...),避免 firewalld 偶发卡顿导致误报。
? 补充:为什么没有 --Query-Zone?
firewalld 设计上区分「查询」与「管理」:
- 查询类操作统一用 --get-*(如 --get-zone-of-interface)、--query-*(如 --query-port)、--list-*;
- --Query-Zone 是混淆了其他工具(如 nmcli 或某些第三方封装脚本)的命名习惯,并非 firewalld 原生命令。
建议始终以 firewall-cmd --help 或 官方 man page 为准。


















