在VMware NSX-T网络构建中,有两个地方需要配置VLAN, 分别是:
逻辑交换机/分段中的VLAN, 如图:
Uplink Profile中的传输VLAN(Transport VLAN), 如图:
逻辑交换机的VLAN决定了逻辑交换机上的端口类型,表示access或者trunk类型的端口。逻辑交换机又分为基于VLAN类型和Overlay类型两种。
对于VLAN类型的逻辑交换机, 如果配置的VLAN为单一VLAN时,表示端口为access类型。这时逻辑交换机与所连接的虚拟接口间的数据是不携带VLAN tag的,但发送到ESXi主机外部的物理网络的报文会携带有所配置的VLAN tag。VLAN 0则比较特殊,在NSX-T以及vSphere体系里都表示不携带VLAN tag。而如果配置多个VLAN后,表示端口为trunk类型。这种情况下,发送到逻辑交换机的报文则必须携带有配置范围内的VLAN tag。而该tag也会透传到外部物理网络。因而使用VLAN类型的逻辑交换机需要底层物理网络做相应的配置允许相应的VLAN通行。
而对于Overlay类型的逻辑交换机, 可以不配置VLAN, 这种情况下,逻辑交换机的端口为access类型。当设置VLAN时,即使设置的是单一VLAN,也会自动修改为trunk类型。这种情况下,逻辑交换机与虚拟接口间的报文则必须携带配置范围内的VLAN tag。
整体逻辑可以梳理为:
上边说到,在Overlay类型的逻辑交换机的报文发送到ESXi外部的物理网络的报文与逻辑交换机VLAN选项无关。而影响这underlay报文VLAN tag的是上文提到的另一个VLAN调置: 传输VLAN(Transport VLAN)。该选项只能设置单一VLAN。当Uplink Profile的Transport VLAN未设置时,默认值为0, 这种情况下,underlay报文不携带VLAN tag。如果设置为其他的VLAN tag, 则underlay报文则会携带该VLAN tag。
如果NSX虚拟交换机的承载为vCenter的VDS, 则在vCenter的Network标签中看到逻辑交换机/分段的VLAN信息,如图:
需要注意的,这里显示的access类型的逻辑交换机/分段的VLAN信息是正确的,而trunk类型的逻辑交换机/分段的信息则没有正确显示。
下面对上述情况进行实验。
我的实验环境为嵌套部署的ESXi主机,ESXi主机的网络接到底层ESXi上用来模拟物理网络的VSS上,并将混杂模式,MAC地址更改, 伪传输三个选项都设置为接受, VLAN设置为4095, 表示允许所有VLAN。在底层ESXi环境上再启动一台CentOS虚拟机接入该VSS。由于VSS的混杂模式开启,因而CentOS虚拟机上可以抓到所有流出嵌套ESXi主机而到达VSS的流量,拓扑如图:
在NSX-T环境中创建VLAN类型逻辑交换机, 并将VLAN设置为200.在两台ESXi主机上各创建一台虚拟机, IP分别配置为6.6.6.11/24和6.6.6.12/24, 并将虚拟机网卡接入创建的逻辑交换机.从6.6.6.11通过ping访问6.6.6.12.
从观察机CentOS上抓包可以看到物理网络报文的VLAN tag为200:
1 | 10:49:04.187978 00:50:56:82:70:f0 > 00:50:56:82:a6:ae, ethertype 802.1Q (0x8100), length 102: vlan 200, p 0, ethertype IPv4, 6.6.6.11 > 6.6.6.12: ICMP echo request, id 4244, seq 7, length 64 |
将逻辑交换机VLAN修改为0之后再次测试, 从抓包数据可以看到物理网络报文不再携带VLAN tag:
1 | 10:52:09.802257 00:50:56:82:70:f0 > 00:50:56:82:a6:ae, ethertype IPv4 (0x0800), length 98: 6.6.6.11 > 6.6.6.12: ICMP echo request, id 4245, seq 10, length 64 |
再将逻辑交换机VLAN修改为1600-1700, 此时无法ping通了.
接着,在两台虚拟机上分别配置VLAN子接口,VLAN tag设置为1601, IP分别设置为1.1.1.1/24和1.1.1.2/24:
1 | ip link add link ens192 ens192.1601 type vlan id 1601 |
此时, 从1.1.1.1访问1.1.1.2, 抓包结果为:
1 | 10:58:42.206065 00:50:56:82:70:f0 > 00:50:56:82:a6:ae, ethertype 802.1Q (0x8100), length 102: vlan 1601, p 0, ethertype IPv4, 1.1.1.1 > 1.1.1.2: ICMP echo request, id 4246, seq 9, length 64 |
可以看到物理网络报文的VLAN tag为1601.
再创建overlay类型的逻辑交换机, 不设置VLAN, 此时VLAN显示为N/A:
将两台测试机迁移到overlay类型逻辑交换机,再次从6.6.6.11访问6.6.6.12, 访问能够成功.
此时, Uplink Profile的Transport VLAN为0:
从抓包可以看到内层报文和外层报文都没有VLAN tag:
1 | 11:10:30.479318 00:50:56:69:15:41 > 00:50:56:65:8c:86, ethertype IPv4 (0x0800), length 156: 10.10.10.101.63181 > 10.10.10.100.6081: Geneve, Flags [C], vni 0x10000, proto TEB (0x6558), options [8 bytes]: 00:50:56:82:70:f0 > 00:50:56:82:a6:ae, ethertype IPv4 (0x0800), length 98: 6.6.6.11 > 6.6.6.12: ICMP echo request, id 4266, seq 9, length 64 |
修改overlay逻辑交换机配置VLAN为1600-1700, 从6.6.6.11访问6.6.6.12失败. 这时使用VLAN子接口ens192.1601从1.1.1.1访问1.1.1.2, 访问成功.
从抓包结果看, 内部报文已携带VLAN tag: 1601:
1 | 11:17:55.136613 00:50:56:69:15:41 > 00:50:56:65:8c:86, ethertype IPv4 (0x0800), length 160: 10.10.10.101.54392 > 10.10.10.100.6081: Geneve, Flags [C], vni 0x10000, proto TEB (0x6558), options [8 bytes]: 00:50:56:82:70:f0 > 00:50:56:82:a6:ae, ethertype 802.1Q (0x8100), length 102: vlan 1601, p 0, ethertype IPv4, 1.1.1.1 > 1.1.1.2: ICMP echo request, id 4269, seq 8, length 64 |
现在修改所使用的Uplink Profile, 将Transport VLAN修改为300:
此时,再次抓包:
1 | 11:22:19.472658 00:50:56:69:15:41 > 00:50:56:65:8c:86, ethertype 802.1Q (0x8100), length 164: vlan 300, p 0, ethertype IPv4, 10.10.10.101.54392 > 10.10.10.100.6081: Geneve, Flags [C], vni 0x10000, proto TEB (0x6558), options [8 bytes]: 00:50:56:82:70:f0 > 00:50:56:82:a6:ae, ethertype 802.1Q (0x8100), length 102: vlan 1601, p 0, ethertype IPv4, 1.1.1.1 > 1.1.1.2: ICMP echo request, id 4269, seq 272, length 64 |
可以看到,外层报文的VLAN tag为300, 内层VLAN tag为1601.
因为实验环境是采用的嵌套虚拟化环境, 可以在旁路抓包分析. 如果是在物理环境中, 可能只能在ESXi主机上进行抓包.
可以使用pktcap-uw和tcpdump-uw来抓取uplink数据包:
1 | pktcap-uw --uplink vmnic1 --dir 2 -o - |tcpdump-uw -ner - |
但是pktcap-uw产生的pcap数据包中不包括报文VLAN tag. 直接使用pktcap-uw可以从元信息中看到VLAN tag, 也支持--vlan选项只抓取指定的VLAN.
1 | 05:52:33.944512[9] Captured at UplinkSndKernel point, TSO not enabled, Checksum not offloaded and not verified, SourcePort 67108877, VLAN tag 300, length 60. |
在通过-o选项生成pcap文件时,可以使用--ng选项写入注释信息, 其中会包含VLAN tag:
1 | -P, --ng (only working with '-o') |
这样生成的pcap文件使用wireshark打开时,可以看到Packet comments部分:
参考:
- https://zhuanlan.zhihu.com/p/35616289
- https://support.huawei.com/enterprise/zh/doc/EDOC1100086528
- https://support.huawei.com/enterprise/zh/doc/EDOC1000178049/834147df
- https://www.h3c.com/cn/d_201909/1231231_30005_0.htm
- http://www.p2vlab.com/lets-make-a-vlan-backed-nsx-t-logical-segment/
- https://nuwan.vip/nsx-t-logical-switching/
- https://www.lab2prod.com.au/2022/05/nsx-t-deterministic-traffic-on-vlan-backed-segments.html
- https://www.lab2prod.com.au/2020/11/nsx-t-inter-tep.html
- https://www.reddit.com/r/vmware/comments/t29mqx/capturing_vlan_tags_with_wireshark_in_esxi/
- https://www.virten.net/2015/10/esxi-network-troubleshooting-with-tcpdump-uw-and-pktcap-uw/
- https://blogs.vmware.com/vsphere/2018/12/esxi-network-troubleshooting-tools.html
- https://rutgerblom.com/2019/07/06/nsx-t-data-path-visibility-part-1/
- https://rutgerblom.com/2019/07/14/nsx-t-data-path-visibility-part-2/
- https://rutgerblom.com/2019/07/19/nsx-t-data-path-visibility-part-3/
- https://virtualork.wordpress.com/2021/05/03/nsx-t-east-west-data-path-part-i/
- https://itdeepdive.com/2020/11/nsx-t-packet-capture-east-west-traffic-on-overlay-segment/