Keep learning, keep living...

0%

NSX-T逻辑交换机VLAN和Transport VLAN

VMware NSX-T网络构建中,有两个地方需要配置VLAN, 分别是:

  • 逻辑交换机/分段中的VLAN, 如图:

  • Uplink Profile中的传输VLAN(Transport VLAN), 如图:

逻辑交换机VLAN决定了逻辑交换机上的端口类型,表示access或者trunk类型的端口。逻辑交换机又分为基于VLAN类型和Overlay类型两种。
对于VLAN类型的逻辑交换机, 如果配置的VLAN为单一VLAN时,表示端口为access类型。这时逻辑交换机与所连接的虚拟接口间的数据是不携带VLAN tag的,但发送到ESXi主机外部的物理网络的报文会携带有所配置的VLAN tagVLAN 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 ProfileTransport VLAN未设置时,默认值为0, 这种情况下,underlay报文不携带VLAN tag。如果设置为其他的VLAN tag, 则underlay报文则会携带该VLAN tag

如果NSX虚拟交换机的承载为vCenterVDS, 则在vCenterNetwork标签中看到逻辑交换机/分段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/246.6.6.12/24, 并将虚拟机网卡接入创建的逻辑交换机.从6.6.6.11通过ping访问6.6.6.12.

从观察机CentOS上抓包可以看到物理网络报文的VLAN tag200:

1
2
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
10:49:04.188456 00:50:56:82:a6:ae > 00:50:56:82:70:f0, ethertype 802.1Q (0x8100), length 102: vlan 200, p 0, ethertype IPv4, 6.6.6.12 > 6.6.6.11: ICMP echo reply, id 4244, seq 7, length 64

逻辑交换机VLAN修改为0之后再次测试, 从抓包数据可以看到物理网络报文不再携带VLAN tag:

1
2
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
10:52:09.802735 00:50:56:82:a6:ae > 00:50:56:82:70:f0, ethertype IPv4 (0x0800), length 98: 6.6.6.12 > 6.6.6.11: ICMP echo reply, id 4245, seq 10, length 64

再将逻辑交换机VLAN修改为1600-1700, 此时无法ping通了.

接着,在两台虚拟机上分别配置VLAN子接口,VLAN tag设置为1601, IP分别设置为1.1.1.1/241.1.1.2/24:

1
2
3
ip link add link ens192 ens192.1601 type vlan id 1601
ip link set up ens192.1601
ip addr add 1.1.1.1/24 dev ens192.1601

此时, 从1.1.1.1访问1.1.1.2, 抓包结果为:

1
2
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
10:58:42.206575 00:50:56:82:a6:ae > 00:50:56:82:70:f0, ethertype 802.1Q (0x8100), length 102: vlan 1601, p 0, ethertype IPv4, 1.1.1.2 > 1.1.1.1: ICMP echo reply, id 4246, seq 9, length 64

可以看到物理网络报文的VLAN tag1601.

再创建overlay类型的逻辑交换机, 不设置VLAN, 此时VLAN显示为N/A:

将两台测试机迁移到overlay类型逻辑交换机,再次从6.6.6.11访问6.6.6.12, 访问能够成功.

此时, Uplink ProfileTransport VLAN0:

从抓包可以看到内层报文和外层报文都没有VLAN tag:

1
2
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
11:10:30.479848 00:50:56:65:8c:86 > 00:50:56:69:15:41, ethertype IPv4 (0x0800), length 156: 10.10.10.100.57901 > 10.10.10.101.6081: Geneve, Flags [C], vni 0x10000, proto TEB (0x6558), options [8 bytes]: 00:50:56:82:a6:ae > 00:50:56:82:70:f0, ethertype IPv4 (0x0800), length 98: 6.6.6.12 > 6.6.6.11: ICMP echo reply, id 4266, seq 9, length 64

修改overlay逻辑交换机配置VLAN1600-1700, 从6.6.6.11访问6.6.6.12失败. 这时使用VLAN子接口ens192.16011.1.1.1访问1.1.1.2, 访问成功.

从抓包结果看, 内部报文已携带VLAN tag: 1601:

1
2
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
11:17:55.137196 00:50:56:65:8c:86 > 00:50:56:69:15:41, ethertype IPv4 (0x0800), length 160: 10.10.10.100.57683 > 10.10.10.101.6081: Geneve, Flags [C], vni 0x10000, proto TEB (0x6558), options [8 bytes]: 00:50:56:82:a6:ae > 00:50:56:82:70:f0, ethertype 802.1Q (0x8100), length 102: vlan 1601, p 0, ethertype IPv4, 1.1.1.2 > 1.1.1.1: ICMP echo reply, id 4269, seq 8, length 64

现在修改所使用的Uplink Profile, 将Transport VLAN修改为300:

此时,再次抓包:

1
2
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
11:22:19.473096 00:50:56:65:8c:86 > 00:50:56:69:15:41, ethertype 802.1Q (0x8100), length 164: vlan 300, p 0, ethertype IPv4, 10.10.10.100.57683 > 10.10.10.101.6081: Geneve, Flags [C], vni 0x10000, proto TEB (0x6558), options [8 bytes]: 00:50:56:82:a6:ae > 00:50:56:82:70:f0, ethertype 802.1Q (0x8100), length 102: vlan 1601, p 0, ethertype IPv4, 1.1.1.2 > 1.1.1.1: ICMP echo reply, id 4269, seq 272, length 64

可以看到,外层报文的VLAN tag300, 内层VLAN tag1601.

因为实验环境是采用的嵌套虚拟化环境, 可以在旁路抓包分析. 如果是在物理环境中, 可能只能在ESXi主机上进行抓包.
可以使用pktcap-uwtcpdump-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.
Segment[0] ---- 54 bytes:
0x0000: ffff ffff ffff 0050 5669 1541 0806 0001
0x0010: 0800 0604 0001 0050 5669 1541 0a0a 0a65
0x0020: 0000 0000 0000 0a0a 0a01 0000 0000 0000
0x0030: 0000 0000 0000
Segment[1] ---- 6 bytes:
0x0030: 0000 0000 0000
05:52:34.282899[10] Captured at UplinkRcvKernel point, TSO not enabled, Checksum not offloaded and verified, VLAN tag 300, length 116.
Segment[0] ---- 1622 bytes:
0x0000: 0050 5669 1541 0050 5665 8c86 0800 4500
0x0010: 0066 0000 4000 4011 11ab 0a0a 0a64 0a0a
0x0020: 0a65 f9e1 17c1 0052 c407 0080 6558 0000
0x0030: 0000 0050 5669 1541 0050 5665 8c86 0800
0x0040: 4500 0034 0000 0000 ff11 92dc 0a0a 0a64
0x0050: 0a0a 0a65 c000 0ec8 0020 0000 20c0 0318
0x0060: dd75 e441 036f c2db 0001 86a0 000f 4240
0x0070: 0000 0000

在通过-o选项生成pcap文件时,可以使用--ng选项写入注释信息, 其中会包含VLAN tag:

1
2
-P, --ng   (only working with '-o')
Using the pcapng format to dump into the file.

这样生成的pcap文件使用wireshark打开时,可以看到Packet comments部分:

参考: