VMware NSX 安全
免责声明:这是一个社区维护的开源项目,与 VMware, Inc. 或 Broadcom Inc. 无关,也未获得其认可或赞助。"VMware"和"NSX"是 Broadcom 的商标。源代码以 MIT 许可证公开发布于 github.com/zw008/VMware-NSX-Security,可供审计。
VMware NSX DFW 微分段与安全——21 个用于分布式防火墙、安全组、虚拟机标签、Traceflow 和 IDPS 的 MCP 工具。
面向 NSX-T / NSX 4.x Policy API 的领域专用安全技能。 配套技能:vmware-nsx(网络)、vmware-aiops(虚拟机生命周期)、vmware-monitor(只读监控)、vmware-avi(AVI/ALB/AKO)、vmware-harden(合规基线)。 | vmware-pilot(工作流编排)| vmware-policy(审计/策略)|
本技能的功能
| 类别 | 工具 | 数量 |
|---|---|---|
| DFW 策略 | 列出、获取、创建、更新、删除、列出规则 | 6 |
| DFW 规则 | 创建、更新、删除、获取统计 | 4 |
| 安全组 | 列出、获取、创建、删除 | 4 |
| 虚拟机标签 | 列出虚拟机标签、应用标签、移除标签 | 3 |
| Traceflow | 运行追踪、获取结果 | 2 |
| IDPS | 列出配置文件、获取状态 | 2 |
总计:21 个工具(10 个只读 + 11 个写入)
快速安装
uv tool install vmware-nsx-security
vmware-nsx-security doctor
何时使用本技能
- 列出、创建或修改 DFW 安全策略和规则
- 基于虚拟机标签、IP 范围或网段成员资格创建安全组
- 在虚拟机上应用或列出 NSX 标签
- 运行 Traceflow 追踪数据包路径并诊断丢弃原因
- 检查 IDPS 配置文件配置、签名状态和全局 IDS 设置
- 在应用层之间实现零信任微分段
配套技能用于:
- NSX 网段、网关、NAT、路由、IPAM →
vmware-nsx - 虚拟机生命周期、部署、客户机操作 →
vmware-aiops - vSphere 清单、健康状态、告警、事件 →
vmware-monitor - 存储:iSCSI、vSAN、数据存储 →
vmware-storage - Tanzu Kubernetes →
vmware-vks - 负载均衡、AVI/ALB、AKO、Ingress →
vmware-avi
相关技能——技能路由
| 用户意图 | 推荐技能 |
|---|---|
| NSX 安全:DFW 规则、安全组、IDS/IPS | vmware-nsx-security ← 本技能 |
| NSX 网络:网段、网关、NAT、路由 | vmware-nsx |
| 只读 vSphere 监控、告警、事件 | vmware-monitor |
| 虚拟机生命周期、部署、客户机操作 | vmware-aiops |
| 存储:iSCSI、vSAN、数据存储 | vmware-storage |
| Tanzu Kubernetes | vmware-vks |
| 需要审批的多步骤工作流 | vmware-pilot |
| 合规基线(CIS / 等保 / PCI-DSS)、漂移检测、LLM 修复建议 | vmware-harden(uv tool install vmware-harden) |
| 负载均衡器、AVI、ALB、AKO、Ingress | vmware-avi(uv tool install vmware-avi) |
| 审计日志查询 | vmware-policy(vmware-audit CLI) |
常见工作流
实现应用层微分段
前置检查(判断——DFW 更改可能锁定所有人):
- 首先默认允许:任何新策略中的第一条规则必须是针对管理流量(DNS、NTP、vCenter、从跳板机的 SSH)的 ALLOW。否则,一旦添加默认拒绝,您将阻塞自己的访问。
- 标签清查:确认您要保护的虚拟机确实携带了标签(
tag list <vm>)。基于不存在的标签的组会匹配零个虚拟机——策略看似“已应用”,但实际上不执行任何操作。 - 类别选择:应用层微分段使用
Application(规则在基础架构规则通过后较晚评估)。将Emergency用于常规规则会占用真正的应急响应能力。 - 无状态?默认使用有状态——NSX DFW 是有状态的,几乎没有任何规则应该是无状态的。无状态意味着必须显式允许两个方向。
- 始终在新规则上启用日志记录;确认后再禁用它。静默丢弃是最令人讨厌的错误。
步骤:
- 首先为虚拟机打标签(参见下方工作流)——空组 = 无强制
- 使用
create_groupMCP 工具,通过tag_scope/tag_value创建组(标签条件匹配为"scope|tag",例如tier|web;注意多个条件类型——标签/IP/网段——是 OR 关系,而非 AND 关系) policy create app-microseg --category Application- 按顺序添加规则:ALLOW 管理流量 → ALLOW 层内流量 → ALLOW web→app 在 app 端口 → 启用日志的 DROP any-any
- 在启用默认拒绝之前,使用 traceflow(见下文)进行验证
为虚拟机应用 NSX 标签
判断:标签驱动组成员身份,进而驱动 DFW 强制。拼写错误的标签会悄悄地将虚拟机排除在保护之外。应用后务必重新列出。
tag list my-web-vm-01→ 记录虚拟机外部 ID,同时查看已存在的标签(避免重复/拼写冲突)tag apply <vm-external-id> --scope tier --value web- 验证:再次执行
tag list my-web-vm-01→ 确认新标签已出现,并且没有意外的标签
使用 Traceflow 追踪数据包
判断:traceflow 是您对任何 DFW 更改的验证机制。在启用拒绝规则之前和每次规则修改之后运行它。不要相信“在 UI 中看起来正确”。
- 通过
vmware-nsx troubleshoot vm-segment获取源虚拟机的逻辑端口 ID traceflow run <lport-id> --src-ip <src> --dst-ip <dst> --proto TCP --dst-port <port>- 检查 DFW 命中链:哪个规则匹配了,ALLOW 还是 DROP,以及在哪个传输节点上
- 常见失败:规则在 Application 类别匹配,但被 Environment 类别中更早的 DROP 规则遮蔽——从头到尾阅读追踪结果,而不仅仅是最终裁决
检查 DFW 策略命中计数
vmware-nsx-security policy list
vmware-nsx-security rule list <policy-id>
vmware-nsx-security rule stats <policy-id> <rule-id>
多目标操作
所有命令都接受 --target <name> 参数以针对特定的 NSX Manager 进行操作:
# 默认目标
vmware-nsx-security policy list
# 特定目标
vmware-nsx-security policy list --target nsx-prod
vmware-nsx-security group list --target nsx-lab
使用模式
| 场景 | 推荐 | 原因 |
|---|---|---|
| 本地/小型模型(Ollama、Qwen) | CLI | 约 2K tokens vs. MCP 的约 8K |
| 云模型(Claude、GPT-4o) | 任一 | MCP 提供结构化 JSON I/O |
| 自动化流水线 | MCP | 类型安全参数、结构化输出 |
MCP 工具(21 个——10 个读取,11 个写入)
所有 MCP 工具都接受可选的 target 参数。
| 类别 | 工具 | 类型 | 描述 |
|---|---|---|---|
| DFW 策略 | list_dfw_policies | 读取 | 列出所有 DFW 安全策略,包含类别、序号和规则计数 |
get_dfw_policy | 读取 | 获取策略详情:类别、有状态、锁定、作用域、标签 | |
create_dfw_policy | 写入 | 创建新的 DFW 策略,包含类别和序号 | |
update_dfw_policy | 写入 | 部分更新:display_name、description、sequence_number、stateful | |
delete_dfw_policy | 写入 | 删除策略——如果存在活动规则则拒绝 | |
list_dfw_rules | 读取 | 列出策略中的规则:操作、源、目标、服务 | |
| DFW 规则 | create_dfw_rule | 写入 | 创建规则,包含源/目标/服务/操作/作用域 |
update_dfw_rule | 写入 | 部分更新规则字段 | |
delete_dfw_rule | 写入 | 从策略中删除规则 | |
get_dfw_rule_stats | 读取 | 获取规则的数据包/字节/会话/命中计数和 popularity_index | |
| 安全组 | list_groups | 读取 | 列出所有安全组,包含表达式计数 |
get_group | 读取 | 获取组详情:表达式条件 + 最多 50 个有效虚拟机成员 | |
create_group | 写入 | 创建组,包含标签/IP/网段成员资格条件(标签匹配为 "scope | |
delete_group | 写入 | 删除组——如果被 DFW 规则/作用域引用,或引用扫描失败,则拒绝 | |
| 虚拟机标签 | list_vm_tags | 读取 | 按显示名称列出虚拟机上的 NSX 标签 |
apply_vm_tag | 写入 | 为虚拟机应用 scope/value 标签(附加,保留现有标签) | |
remove_vm_tag | 写入 | 从虚拟机移除 scope/value 标签(保留其他标签;可能更改动态组成员身份) | |
| Traceflow | run_traceflow | 写入 | 注入探测数据包;返回 operation_state + 逐跳观察(按 resource_type)+ dfw_hits |
get_traceflow_result | 读取 | 检查现有 traceflow 的 operation_state/observations | |
| IDPS | list_idps_profiles | 读取 | 列出 IDPS 配置文件,包含严重性和过滤条件 |
get_idps_status | 读取 | 获取 IDPS 签名状态 + 全局 IDS 设置(auto_update、syslog export) |
CLI 快速参考
# DFW 策略
vmware-nsx-security policy list [--target <name>]
vmware-nsx-security policy get <policy-id>
vmware-nsx-security policy create <id> --name "Display Name" --category Application [--dry-run]
vmware-nsx-security policy delete <id> [--dry-run]
# DFW 规则
vmware-nsx-security rule list <policy-id>
vmware-nsx-security rule stats <policy-id> <rule-id>
vmware-nsx-security rule delete <policy-id> <rule-id> [--dry-run]
# 安全组
vmware-nsx-security group list
vmware-nsx-security group get <group-id>
vmware-nsx-security group delete <group-id> [--dry-run]
# 标签
vmware-nsx-security tag list <vm-display-name>
vmware-nsx-security tag apply <vm-external-id> --scope env --value production [--dry-run]
vmware-nsx-security tag remove <vm-external-id> --scope env --value production [--dry-run]
# Traceflow
vmware-nsx-security traceflow run <lport-id> --src-ip <src-ip> --dst-ip <dst-ip>
# IDPS
vmware-nsx-security idps profiles
vmware-nsx-security idps status
# 诊断
vmware-nsx-security doctor [--skip-auth]
故障排除
"无法删除策略——存在活动规则"
delete_dfw_policy 在删除前会检查活动规则。使用 vmware-nsx-security rule list <policy-id> 查看需要先移除哪些规则。然后逐个删除每个规则,再重试策略删除。
"无法删除组——被 DFW 规则引用"
delete_group 会扫描所有策略中对该组的引用,包括规则的 source_groups、destination_groups 和应用作用域,以及策略级作用域。首先从这些引用中移除该组(通过 update_dfw_rule 将组路径替换为 'ANY' 或其他组),然后重试。如果错误提示引用扫描本身失败,则删除已作为预防措施中止——使用 vmware-nsx-security doctor 验证 NSX 连接,然后重试。
"未找到显示名称为...的虚拟机"
list_vm_tags 通过 NSX fabric API 按显示名称查找虚拟机。常见原因:
- 显示名称不匹配——NSX Manager 中的名称可能与 vCenter 中的不同。使用
vmware-monitor vm list检查确切的 NSX fabric 显示名称。 - 虚拟机未注册——新部署的虚拟机可能需要一分钟才能在 NSX fabric 中显示。
- 存在多个同名虚拟机——使用
apply_vm_tag并指定 external_id。
Traceflow 返回空观察结果
- 如果
operation_state为IN_PROGRESS,追踪尚未完成——使用get_traceflow_result <traceflow-id>再次轮询。 - 确认
src_lport_id是正确的逻辑端口连接 UUID——而不是网段端口路径。通过vmware-nsx troubleshoot vm-segment <vm>获取。 - 源虚拟机必须已开机并连接到 NSX overlay 网段。
- 如果虚拟机位于 VLAN 支持的网段上,则不支持 Traceflow。
- NSX Manager 要求承载源虚拟机的传输节点可达。检查
vmware-nsx health transport-nodes。
DFW 规则统计显示零命中
新创建的规则在流量匹配之前将具有零命中计数。如果预期的流量仍然显示为零:
- 确认规则未禁用(
list_dfw_rules输出中的disabled: false)。 - 使用
get_group检查源/目标组成员身份是否正确。 - 验证规则序号——具有 ALLOW/DROP 的较低序号规则可能首先匹配。
"密码未找到"错误
密码变量约定:VMWARE_NSX_SECURITY_<TARGET_UPPER>_PASSWORD
其中连字符替换为下划线。对于目标 nsx-prod:
VMWARE_NSX_SECURITY_NSX_PROD_PASSWORD。检查 ~/.vmware-nsx-security/.env。
invalid peer certificate: UnknownIssuer(uvx)
企业 TLS 代理不被 uv 捆绑的证书存储信任。使用 v1.5.15+ 的单命令形式 vmware-nsx-security mcp(无 PyPI 重新解析),或
export UV_NATIVE_TLS=true 使 uv 使用系统证书存储。
安全
- 审计日志记录:所有写入操作都记录到
~/.vmware/audit.db(SQLite WAL,通过 vmware-policy),包含时间戳、用户、目标、操作、参数和结果 - 依赖检查:
delete_dfw_policy检查活动规则;delete_group检查 DFW 规则引用——防止意外级联故障 - 输入验证:所有 ID 都根据安全字符集(字母数字、连字符、下划线、点)进行验证;所有文本字段都经过清理以去除控制字符
- 干运行模式:CLI 写入命令支持
--dry-run以预览 API 调用而不执行 - 双重确认:CLI 破坏性操作(删除)需要两个独立的确认提示
- 凭据安全:密码仅从环境变量(
.env文件)加载,绝不从config.yaml加载 - 无网络更改:无法修改网段、网关、NAT 或路由——该范围属于
vmware-nsx - 提示注入防御:所有 API 源字符串在包含到工具输出之前都经过
_sanitize()处理
设置
uv tool install vmware-nsx-security
# 创建一个 .env 文件并设置您的 NSX Manager 凭据
# VMWARE_NSX_SECURITY_NSX_HOST=https://nsx-manager.example.com
# VMWARE_NSX_SECURITY_NSX_USERNAME=admin
# VMWARE_NSX_SECURITY_NSX_PASSWORD=your_password
# 验证设置
vmware-nsx-security doctor
配置
创建 ~/.vmware-nsx-security/.env:
# 默认目标
VMWARE_NSX_SECURITY_NSX_HOST=https://nsx-mgr-01.corp.local
VMWARE_NSX_SECURITY_NSX_USERNAME=admin
VMWARE_NSX_SECURITY_NSX_PASSWORD=super-secret-password
# 附加目标
VMWARE_NSX_SECURITY_LAB_NSX_HOST=https://nsx-mgr-lab.corp.local
VMWARE_NSX_SECURITY_LAB_NSX_USERNAME=admin
VMWARE_NSX_SECURITY_LAB_NSX_PASSWORD=lab-password
有关更多详细信息,请参阅完整文档。