k-guo/nsx-pktcap-multimode

GitHub: k-guo/nsx-pktcap-multimode

该脚本封装了 ESXi/NSX 的 pktcap-uw 命令,支持通过 API 或 SSH 在 vNIC、物理 uplink 及 VMkernel 接口进行远程多模式并行抓包并自动回收数据。

Stars: 0 | Forks: 0

# nsx-pktcap-multimode — NSX / ESXi 多模式抓包工具 直接从你的笔记本电脑在 ESXi 主机上运行多点 `pktcap-uw` 抓包 —— 无需手动 SSH 登录或记忆抓包点语法。该脚本抽象了底层复杂性:同时跨多个抓包点启动并行抓包,等待抓包时间窗口结束,将 `.pcapng` 文件下载到本地机器,并在完成后自动清理。 支持四种模式:**NSX Policy API**(无需 SSH,虚拟机必须位于 VPC 或 NSX segment 上)、通过 SSH **直连**到 ESXi 主机并在虚拟机交换机端口上抓包、**物理 uplink**,以及 **VMkernel interface**。内置了生产环境安全防护机制 —— 会检查 SSH 连接性、interface 是否存在、VMFS 可用空间,并会在高流量 uplink 上启动未过滤的抓包前发出警告。 ## 抓包模式 | 模式 | 抓包位置 | 要求 | 最适用于 | |---|---|---|---| | `api` | NSX SEGMENTPORT(DVS 逻辑端口边界) | 虚拟机在 NSX segment 上 | 标准 IP/TCP/UDP;无需 SSH | | `direct` | 虚拟机交换机端口 —— `VnicRx`、`VnicTx`、`ENSInput`、`Drop` **并行** | 虚拟机在任何 ESXi 主机上 | PROFINET、PTP、L2 multicast、丢包;在没有 NSX segment 的情况下也可工作 | | `uplink` | 物理 vmnic —— `UplinkRcvKernel` + `UplinkSndKernel` **同时进行** | `--host` + `--uplink` | 物理线缆层面:确认流量到达/离开主机,发往特定虚拟机 MAC 的单播 | | `vmk` | VMkernel NIC (`--vmk vmk0`) | `--host` + `--vmk` | 管理、vMotion、vSAN、NFS 流量 | ### 抓包点协议栈 ``` Physical wire ↕ NIC driver [ --uplink vmnicX --dir 2 ] raw NIC level (hardware wiretap) ↕ VMkernel boundary [ UplinkRcvKernel / UplinkSndKernel ] VMkernel ↔ NIC driver ↕ DVS portset [ UplinkRcv / UplinkSnd ] DVS portset ← default for uplink mode ↕ DVS logical port [ PortInput / PortOutput ] = SEGMENTPORT in NSX API ↕ vNIC driver [ VnicRx / VnicTx ] VM vNIC driver ← default for direct mode [ ENSInput ] ENS fast-path (sender view) [ Drop ] dropped at vSwitch ↕ VM guest OS ``` ## 要求 - `bash` (macOS 或 Linux) - `curl`, `python3` - `sshpass` (direct/uplink/vmk 模式 —— 或配置 SSH 密钥认证) ## 设置 ``` chmod +x nsx-pktcap-multimode.sh ``` 在脚本顶部编辑凭据: ``` NSX_MGR="https://" NSX_USER="admin" NSX_PASS="" ESXI_USER="root" ESXI_PASS="" # direct / uplink / vmk modes ``` ## 用法 ``` # api / direct: 始终需要 VM_NAME 和 MAC_ADDRESS ./nsx-pktcap-multimode.sh [OPTIONS] ./nsx-pktcap-multimode.sh --mode direct [--host ] [OPTIONS] # uplink: 始终需要 --host 和 --uplink (非特定于 VM) ./nsx-pktcap-multimode.sh --mode uplink --host --uplink [OPTIONS] # vmk: 始终需要 --host 和 --vmk ./nsx-pktcap-multimode.sh --mode vmk --host --vmk [OPTIONS] ``` ### 所有选项 | 标志 | 默认值 | 描述 | |---|---|---| | `--mode api\|direct\|uplink\|vmk` | `api` | 抓包模式 | | `--host ` | — | ESXi 主机 IP。uplink/vmk 模式**必需**。direct 模式**可选**(跳过 NSX 虚拟机查找 —— 当虚拟机所在的主机不是 NSX 传输节点时使用) | | `--uplink ` | — | 物理 NIC(uplink 模式必需)。可通过以下命令查找:`esxcli network vswitch dvs vmware list` | | `--vmk ` | — | VMkernel NIC(vmk 模式必需)。可通过以下命令查找:`esxcli network ip interface list` | | `--ethtype ` | — | EtherType 过滤器 (direct/uplink/vmk) | | `--proto ` | — | IP 协议过滤器:`0x1`=ICMP, `0x6`=TCP, `0x11`=UDP (direct/uplink/vmk) | | `--ip ` | — | IP 地址过滤器 —— 匹配源地址**或**目的地址 (direct/uplink/vmk) | | `--rcf ` | — | 原始抓包过滤器,例如 `'geneve and host 10.0.0.1'` (direct/uplink/vmk)。请为表达式加上引号。用于 NSX/Geneve overlay 流量。 | | `--src ` | — | 源 IP 过滤器(仅限 api) | | `--dst ` | — | 目的 IP 过滤器(仅限 api) | | `--srcmac ` | — | 源 MAC 过滤器 (direct/uplink/vmk) | | `--dstmac ` | — | 目的 MAC 过滤器 (direct/uplink/vmk) | | `--vlan ` | — | VLAN ID 过滤器 (uplink/vmk) | | `--duration ` | `60` | 抓包时间窗口(秒) | | `--amount ` | `1000` | 每个抓包点的最大数据包数 | | `--points ` | 见下文 | 逗号分隔的 `pktcap-uw` 抓包点 | | `--out ` | `.` | 用于存放 `.pcapng` 文件的本地目录 | **默认 `--points`:** - `direct` → `VnicRx,VnicTx,ENSInput,Drop` - `uplink` → `UplinkRcvKernel,UplinkSndKernel`(VMkernel/NIC 边界 —— 对于 ENS/PROFINET 最可靠) - `vmk` → 不适用(使用 `--dir 2` 进行单向双向抓包) ## 抓包场景 ### 1. 虚拟机的所有流量(api 模式 —— 无需 SSH) NSX API 在 DVS 逻辑端口(SEGMENTPORT)进行抓包。适用于标准 IP/TCP/UDP 流量。虚拟机必须位于 NSX segment 上。 ``` # 所有流量 ./nsx-pktcap-multimode.sh my-vm 00:50:56:b2:50:c8 # 按源和目的 IP 过滤 ./nsx-pktcap-multimode.sh --src 10.1.1.5 --dst 10.1.1.10 my-vm 00:50:56:b2:50:c8 ``` ### 2. 虚拟机 vNIC —— 同时进行 4 个抓包点(direct 模式) `direct` 模式并行运行四个 `pktcap-uw` 抓包: | 抓包点 | 抓包内容 | |---|---| | `VnicRx` | 交付给虚拟机 vNIC 的数据包(入站)。虚拟机是否真的收到了? | | `VnicTx` | 虚拟机 vNIC 发出的数据包(出站)。 | | `ENSInput` | 从虚拟机进入 ENS fast-path 的数据包。 | | `Drop` | 在此端口被 vSwitch 丢弃的数据包。 | ``` # 所有流量 — 使用 --host 时,无论是否有 NSX segment 均可工作 ./nsx-pktcap-multimode.sh --mode direct my-vm 00:50:56:b2:50:c8 # 仅 TCP ./nsx-pktcap-multimode.sh --mode direct --proto 0x6 my-vm 00:50:56:b2:50:c8 # PROFINET 流量 (EtherType 0x8892) ./nsx-pktcap-multimode.sh --mode direct --ethtype 0x8892 ievd-vlan-107 00:50:56:a7:1a:5d # 绕过 NSX host 查找 — 在 VM 不在 NSX segment 上时使用 # 或 ESXi host 不是 NSX transport node 时 ./nsx-pktcap-multimode.sh --mode direct --host 10.1.1.203 my-vm 00:50:56:a7:bb:80 ``` ### 3. 物理 uplink(uplink 模式) 在 VMkernel/NIC 边界抓包(默认为 `UplinkRcvKernel,UplinkSndKernel`)。同时抓取双向数据。对于绕过 DVS portset 的纯 L2 协议是必需的。 ``` # VLAN 107 上的所有流量 ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 --vlan 107 # 发往/来自特定 host 的 UDP 流量 ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 \ --proto 0x11 --ip 10.1.1.55 --vlan 107 # 发送到特定 VM MAC 的 Unicast ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 \ --dstmac 00:50:56:a7:31:43 --vlan 107 # PROFINET 流量 (EtherType 0x8892) ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 \ --ethtype 0x8892 --vlan 107 ``` 如果 `UplinkRcvKernel` 没有输出,请在 ESXi 主机上手动验证 —— 可能只是没有匹配的流量: ``` pktcap-uw --capture UplinkRcvKernel --uplink vmnic2 -e -c 10 -o - | tcpdump-uw -r - -nn -e ``` ### 4. VMkernel NIC(vmk 模式) ``` # vmk0 (management / vMotion / vSAN / NFS) 上的所有流量 ./nsx-pktcap-multimode.sh --mode vmk --host 10.1.1.203 --vmk vmk0 # 仅 ICMP (proto 0x1) ./nsx-pktcap-multimode.sh --mode vmk --host 10.1.1.203 --vmk vmk0 --proto 0x1 # 仅 ARP (EtherType 0x0806) ./nsx-pktcap-multimode.sh --mode vmk --host 10.1.1.203 --vmk vmk0 --ethtype 0x0806 ``` ### 其他示例 **Uplink —— 按 IP 地址过滤(源或目的):** ``` ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 \ --ip 10.1.1.55 ``` **Uplink —— NSX/Geneve overlay 抓包:** ``` ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 \ --rcf 'geneve and host 10.1.1.55' ``` **Direct —— 在 DVS portset 级别而不是 VMkernel 边界抓包:** ``` ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 \ --points UplinkRcv,UplinkSnd --vlan 107 ``` ## Uplink 抓包点详解 `pktcap-uw` 可以在三个不同的层级抓取 uplink 流量: | 抓包点 | 层级 | 备注 | |---|---|---| | `UplinkRcvKernel` / `UplinkSndKernel` (**脚本默认**) | VMkernel/NIC 边界 | 在 NIC 驱动程序 ↔ VMkernel 边界的入站/出站。ENS 环境和 L2 协议(PROFINET、PTP)必需。 | | `UplinkRcv` / `UplinkSnd` | DVS portset | 有效,但**已被 VMware 标记为已废弃**(在 ESXi 上已确认)。位于 ENS 之上 —— 会漏掉 ENS fast-path 流量。如果你特别需要 portset 级别的抓包,请使用 `--points UplinkRcv,UplinkSnd`。 | | `--uplink vmnicX --dir 2` *(仅限手动)* | 原始 NIC 驱动程序 | 最接近物理线缆。需在 ESXi 主机上手动运行 —— 脚本使用的是 `--capture` 抓包点。 | ## 抓包设置 所有设置的默认值都在脚本顶部硬编码。大多数也可以在运行时使用 CLI 标志覆盖 —— 无需编辑脚本。 | 设置 | 默认值 | CLI 标志 | 描述 | |---|---|---|---| | `CAP_DIRECTION` | `DUAL` | *(编辑脚本)* | `INPUT`、`OUTPUT` 或 `DUAL`。仅限 NSX API 模式。不要使用 `BOTH` —— NSX API 需要使用 `DUAL` 来进行双向抓包。 | | `CAP_DURATION` | `60` | `--duration ` | 抓包运行时长。经过指定的秒数后,脚本将终止所有 `pktcap-uw` 进程并下载文件。 | | `CAP_AMOUNT` | `1000` | `--amount ` | 每个抓包点的最大数据包数。`pktcap-uw` 也会在达到此数量时停止,以先到者为准。 | | `CAP_SNAPLEN` | `1500` | `--snaplen ` | 每个数据包抓取的字节数。`1500` 覆盖标准以太网帧。设置为 `0` 可抓取完整数据包(巨型帧、隧道)。作为 `-s` 传递给 `pktcap-uw`。 | | `OUTPUT_DIR` | `.` | `--out ` | 保存 `.pcapng` 文件的本地目录。如果不存在,将自动创建。 | **示例:** ``` # 将抓包缩短至 30s,完整数据包抓包,保存到 ~/captures ./nsx-pktcap-multimode.sh --mode uplink --host 10.1.1.203 --uplink vmnic2 \ --ethtype 0x8892 --duration 30 --snaplen 0 --out ~/captures # 将最大数据包计数增加到 5000,保存到 /tmp ./nsx-pktcap-multimode.sh --mode direct --ethtype 0x8892 \ --amount 5000 --out /tmp ievd-vlan-107 00:50:56:a7:31:43 ``` `CAP_DIRECTION` 只能通过编辑脚本顶部的变量来更改 —— 它控制 NSX API 抓包方向,并且不作为标志公开,因为它仅适用于 `api` 模式。 ## 注意事项 - 抓包期间,文件会存储在 ESXi 主机上的 VMFS 数据存储(而不是 `/tmp`)中,并在下载后删除([KB 341568](https://knowledge.broadcom.com/external/article/341568))。对于 SSH 模式,输出文件使用 `.pcapng`;对于 api 模式,使用 `.pcap`。 - `--vlan` 在 trunk uplink 上非常重要 —— 如果不指定,你将抓取该 vmnic 上的所有 VLAN。 - 过滤器可以组合使用:`--ethtype 0x8892 --dstmac 00:50:56:a7:31:43 --vlan 107`。 - `--ip ` 是双向 IP 过滤器(匹配源**或**目的)。使用它可以将广泛的抓包范围缩小到涉及特定主机的流量。 - `--rcf ''` 将原始 tcpdump 风格的过滤器传递给 `pktcap-uw`。适用于 NSX Geneve overlay:`--rcf 'geneve and host 10.1.1.5'`。请始终为表达式加上引号。 - `vmk` 模式始终捕获双向数据(`--dir 2`)。不使用 `--points` 标志。 - `--srcmac` 和 `--dstmac` 可在所有 SSH 模式(`direct`、`uplink`、`vmk`)下工作。 ## 许可证 MIT License Copyright (c) 2026 NSX Packet Capture Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
标签:ESXi, NSX, VMware, 应用安全, 系统分析, 网络分析, 运维工具, 逆向工具, 防御绕过