NSX的分布式防火墙(简称:DFW)能够帮助企业进行严格的东西/南北向的访问控制,如果策略配置得当,最大程度保障企业环境的安全性。在部署和实施NSX的DFW策略时,经常需要登录到ESXi主机查看虚拟机的策略应用情况,并需要通过多个命令组合完成,极大降低了工作效率。 为解决此问题,我写了一个脚本,用于获取虚拟机的以下DFW信息:
- 虚拟机的网卡名称,支持多网卡
- 每个网卡上已应用的DFW策略
- 每个网卡上的策略状态
- 每个网卡上的活动流
- 每个网卡上的地址集合中IP地址
相关资料
Troubleshooting DFW on ESX Hosts
相关命令解释
summarize-dvfilter
和 vsipioctl
都是与 VMware NSX 相关的命令,用于获取有关虚拟化环境中虚拟机、网络和安全策略的信息。以下是对这两个命令的简要说明:
summarize-dvfilter:
- 这个命令主要用于显示 ESXi 主机上所有虚拟机的分布式防火墙 (Distributed Firewall, DFW) 过滤器信息。
- 它会列出所有虚拟机、它们的 World ID、vNic 以及与这些 vNic 相关联的 dvFilter 信息。
- 使用这个命令可以帮助管理员识别与特定 VM 或 vNic 关联的 DFW 规则。
vsipioctl:
- 这是一个更通用的命令,用于查询和管理 NSX DFW 的状态和配置。
- 常见的用法包括:
vsipioctl getrules -f <vNic Name>
:显示与指定 vNic 关联的所有 DFW 规则。vsipioctl getrules -f <vNic Name> -s
:获取与指定 vNic 关联的 DFW 规则的状态。vsipioctl getaddrset -f <vNic Name>
:获取与指定 vNic 关联的真实地址集。
- 通过这个命令,管理员可以查看、修改或调试分布式防火墙的配置和行为。
总之,这两个命令为 VMware NSX 管理员提供了强大的工具,使他们可以深入了解、管理和调试其虚拟化环境中的网络安全策略。
脚本示例
此脚本用于获取单个虚拟机的DFW信息,在ESXi中,执行此脚本,第一个参数时“虚拟机名称”。
注意:要查询的虚拟机必须在所在的ESXi主机上运行,不能垮ESXi主机查询。
#!/bin/sh
# ******************************************************
# * Author : Guoqiang Li
# * Email : guoqiangli@vmware.com
# * Create time : 2023-09-15
# * Description : quickly get the NSX-T dfw policy information and status of the VM on ESXi.
# ******************************************************
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <VM Name>"
exit 1
fi
VM_NAME=$1
# Get VM ID
VM_ID=$(vim-cmd vmsvc/getallvms | grep "${VM_NAME}" | awk '{print $1}')
if [ -z "$VM_ID" ]; then
echo "Cannot find VM with name: ${VM_NAME}"
exit 1
fi
# Get VM's World ID
WORLD_ID=$(esxcli vm process list | grep -A1 "${VM_NAME}" | grep "World ID:" | awk '{print $3}')
if [ -z "$WORLD_ID" ]; then
echo "Cannot find World ID for VM: ${VM_NAME}"
exit 1
fi
# Get vNic Name
vNicNames=$(summarize-dvfilter | awk -v worldid="$WORLD_ID" '
$1 == "world" && $2 == worldid { flag=1; next }
$1 == "world" && flag { exit }
flag && /^ name:/ { sub(/^ name: /, ""); print }
')
# sort by vNic Name,eg: eth0->eth1.
sortedVNicNames=$(echo "$vNicNames" | sort -t'-' -k3 -n)
# Get DFW info by vNic Name.
for vNic in $sortedVNicNames; do
echo "-----------------------------------"
echo "vNic Name: ${vNic}"
echo -e "-----------------------------------\n"
# Get Policy
echo "----------Policy:------------------"
vsipioctl getrules -f ${vNic}
echo -e "----------Policy End.--------------\n"
# Get Policy Status
echo "-------Policy Status:--------------"
vsipioctl getrules -f ${vNic} -s
echo -e "-------Policy Status End.----------\n"
# Get Active Flow
echo "------Active Firewall flow:--------"
vsipioctl getflows -f ${vNic}
echo -e "------Active Firewall flow End.----\n"
# Get Real Address
echo "------Real Address:----------------"
vsipioctl getaddrset -f ${vNic}
echo -e "------Real Address End.------------\n"
done
命令执行完成后,看到以下内容输出,通过这个输出,可以快速判断防火墙策略的优先级,以及策略是否符合预期期望。
完毕
至此,我们通过一个简单的脚本,快速在ESXi主机上,获取DFW策略的应用和状态情况,当然,您也可以根据需要,修改脚本,以满足特定的需求。