今回はNSX-TのL2オーバレイネットワーク経由の仮想マシン間の通信が失敗する際に、どこまでパケットが届いているかを調査する手順をまとめました。
検証結果
検証内容、構成
ESXi1とESXi2をTransport Zoneに参加させ、ESXi1とESXi2に跨るL2オーバレイネットワークを構築し、仮想マシンのR1とR2間で通信できるようにします。
アンダーレイの物理スイッチではGeneveの通信をVLAN 100に収容します。
R1からR2へICMP Echoパケットを転送している状況で、以下の①~⑥においてパケットキャプチャを実施します。
ネットワーク機器のCLIの設定
vlan 100
!
interface GigabitEthernet1/0/1
switchport access vlan 100
switchport mode access
!
interface GigabitEthernet1/0/2
switchport access vlan 100
switchport mode access
interface GigabitEthernet2
ip address 10.1.1.1 255.255.255.0
interface GigabitEthernet2
ip address 10.1.1.2 255.255.255.0
キャプチャポイント①
NSX-Tでは、vDSやN-VDSと仮想マシンのvNICの間に分散FWと呼ばれるインスタンスが存在します。(詳しくは別の記事で説明します)
まずは、R1が送信したトラフィックがR1のvNICとvDSの間に存在する分散FWに届いているか確認します。
最初にnsxdp-cli vswitch insntace listコマンドを使用して、R1のvNICの名前を取得します。
[root@esxi1:~] nsxdp-cli vswitch instance list
DvsPortset-0 (NSX-vDS1) 50 39 f6 94 fd 3c 10 e9-a4 8c d1 52 de bd b4 2e
Total Ports:8836 Available:8802
Client PortID DVPortID MAC Uplink
Management 100663401 00:00:00:00:00:00 n/a
vmnic0 2248147050 1 00:00:00:00:00:00
Shadow of vmnic0 100663403 00:50:56:50:98:d7 n/a
vmk10 100663404 d452743c-7a3f-423e-b8ac-ebd4b019d6c4 00:50:56:6e:11:02 vmnic0
vmk50 100663405 8e7abf1f-f706-4c70-9311-db8a49eb0028 00:50:56:68:41:6d void
vdr-vdrPort 100663406 vdrPort 02:50:56:56:44:52 vmnic0
R1.eth1 100663444 942286b1-b2f0-4d5c-b3b9-181b20cb7e74 00:50:56:b9:98:2c vmnic0
次に、summarize-dvfilterコマンドを使用して、R1のvNICとvDS間に存在する分散FWのインスタンス名を取得します。
[root@esxi1:~] summarize-dvfilter| grep -A 2 R1
world 2116638 vmm0:R1 vcUuid:'50 39 56 48 7d 8f 78 0b-e7 a0 09 89 e1 fc 1d 13'
port 67108894 R1
vNic slot 2
name: nic-2116638-eth0-vmware-sfw.2
--
port 100663444 R1.eth1
vNic slot 2
name: nic-2116638-eth1-vmware-sfw.2
--
port 67108892 R1
vNic slot 2
name: nic-2116638-eth2-vmware-sfw.2
最後に、nsxcliコマンドを使用してNSX-T専用のCLIに移動します。その後、start capture dvfilter <分散FWのインスタンス名> stage preコマンドを使用して、分散FWに着信したパケットをキャプチャします。
esxi1.local.com> start capture dvfilter nic-2116638-eth1-vmware-sfw.2 stage pre expression ipproto 0x01
01:20:54.161291 00:50:56:b9:98:2c > 00:50:56:b9:b9:8a, ethertype IPv4 (0x0800), length 114: 10.1.1.1 > 10.1.1.2: ICMP echo request, id 105, seq 0, length 80
キャプチャポイント②
分散FWがvDSにパケットを転送しているか確認します。もしパケットが確認できない場合は、分散FWでパケットが破棄されていることになります。
分散FWで処理され、転送されたパケットはstart capture dvfilter <分散FWのインスタンス名> stage postコマンドでキャプチャ可能です。
esxi1.local.com> start capture dvfilter nic-2116638-eth1-vmware-sfw.2 stage post expression ipproto 0x01
01:21:31.787259 00:50:56:b9:98:2c > 00:50:56:b9:b9:8a, ethertype IPv4 (0x0800), length 114: 10.1.1.1 > 10.1.1.2: ICMP echo request, id 106, seq 0, length 80
キャプチャポイント③
ESXi1のvmnic0から物理ネットワーク側にパケットが転送されているか確認します。
vmnic上を流れるパケットはpktcap-uw --uplink <vmnicの名前>コマンドでキャプチャ可能です。--dir=1オプションがvmnicから物理ネットワーク側に転送されるパケットのみをキャプチャするオプションになります。
--dir=1オプションを使用している状況で、--stage=0オプションを指定した場合、Geneveによるカプセル化実施前の状態でパケットをキャプチャ可能です。
[root@esxi1:~] pktcap-uw --uplink vmnic0 --dir=1 --stage=0 -o - | tcpdump-uw -r - -nn
The name of the uplink is vmnic0.
The Stage is Pre.
pktcap: The output file is -.
pktcap: No server port specifed, select 57909 as the port.
pktcap: Local CID 2.
pktcap: Listen on port 57909.
reading from file -, link-type EN10MB (Ethernet)
pktcap: Accept...
pktcap: Vsock connection from port 1081 cid 2.
06:22:10.760587 IP 10.1.1.1 > 10.1.1.2: ICMP echo request, id 145, seq 0, length 80
--dir=1オプションを使用している状況で、--stage=1オプションを指定した場合、Geneveによるカプセル化実施後の状態でパケットをキャプチャ可能です。
[root@esxi1:~] pktcap-uw --uplink vmnic0 --dir=1 --stage=1 -o - | tcpdump-uw -r - -nn
The name of the uplink is vmnic0.
The Stage is Post.
pktcap: The output file is -.
pktcap: No server port specifed, select 57957 as the port.
pktcap: Local CID 2.
pktcap: Listen on port 57957.
reading from file -, link-type EN10MB (Ethernet)
pktcap: Accept...
pktcap: Vsock connection from port 1082 cid 2.
06:22:51.470767 IP 172.16.1.101.54957 > 172.16.1.102.6081: Geneve, Flags [C], vni 0x10000, options [8 bytes]: IP 10.1.1.1 > 10.1.1.2: ICMP echo request, id 146, seq 0, length 80
キャプチャポイント④
ESXi2が物理ネットワーク側からGeneveパケットを受信しているか確認します。
物理ネットワーク側からvmnicに着信したパケットのみをキャプチャするために--dir=0オプションを指定してpktcap-uw --uplink <vmnicの名前>コマンドを実行します。
--dir=0オプションを使用している状況で、--stage=0オプションを指定した場合、Geneveのカプセル化解除前の状態でパケットをキャプチャ可能です。
[root@esxi2:~] pktcap-uw --uplink vmnic0 --dir=0 --stage=0 -o - | tcpdump-uw -r - -nn
The name of the uplink is vmnic0.
The Stage is Pre.
pktcap: The output file is -.
pktcap: No server port specifed, select 25724 as the port.
pktcap: Local CID 2.
pktcap: Listen on port 25724.
pktcap: Accept...
pktcap: Vsock connection from port 1059 cid 2.
reading from file -, link-type EN10MB (Ethernet)
14:26:51.367543 IP 172.16.1.101.54957 > 172.16.1.102.6081: Geneve, Flags [C], vni 0x10000, options [8 bytes]: IP 10.1.1.1 > 10.1.1.2: ICMP echo request, id 148, seq 0, length 80
--dir=0オプションを使用している状況で、--stage=1オプションを指定した場合、Geneveのカプセル化解除後の状態でパケットをキャプチャ可能です。
[root@esxi2:~] pktcap-uw --uplink vmnic0 --dir=0 --stage=1 -o - | tcpdump-uw -r - -nn
The name of the uplink is vmnic0.
The Stage is Post.
pktcap: The output file is -.
pktcap: No server port specifed, select 25831 as the port.
pktcap: Local CID 2.
pktcap: Listen on port 25831.
pktcap: Accept...
pktcap: Vsock connection from port 1061 cid 2.
reading from file -, link-type EN10MB (Ethernet)
14:28:18.286676 IP 10.1.1.1 > 10.1.1.2: ICMP echo request, id 150, seq 0, length 80
キャプチャポイント⑤
ESXi2において、vDSからR2に転送されたパケットが分散FWに着信しているか確認します。
最初にnsxdp-cli vswitch insntace listコマンドを使用して、R2のvNICの名前を取得します。
[root@esxi2:~] nsxdp-cli vswitch instance list
DvsPortset-0 (NSX-vDS1) 50 39 f6 94 fd 3c 10 e9-a4 8c d1 52 de bd b4 2e
Total Ports:5376 Available:5356
Client PortID DVPortID MAC Uplink
Management 100663381 00:00:00:00:00:00 n/a
vmnic0 2248147030 0 00:00:00:00:00:00
Shadow of vmnic0 100663383 00:50:56:58:c8:a2 n/a
vmk10 100663384 a36770bd-02ef-4be8-8679-5c0f253ad471 00:50:56:6c:8a:44 vmnic0
vmk50 100663385 29c1d51e-3283-4ce7-b46e-7012719c3121 00:50:56:62:66:56 void
vdr-vdrPort 100663386 vdrPort 02:50:56:56:44:52 vmnic0
R2.eth1 100663403 aac550db-74e3-4214-ab11-09ddba707111 00:50:56:b9:b9:8a vmnic0
次に、summarize-dvfilterコマンドを使用して、R2のvNICとvDS間に存在する分散FWのインスタンス名を取得します。
[root@esxi2:~] summarize-dvfilter | grep -A 2 R2
world 2105811 vmm0:R2 vcUuid:'50 39 77 51 9b 82 81 00-87 cb da 3a a9 f3 1a 18'
port 67108878 R2
vNic slot 2
name: nic-2105811-eth0-vmware-sfw.2
--
port 100663403 R2.eth1
vNic slot 2
name: nic-2105811-eth1-vmware-sfw.2
--
port 67108876 R2
vNic slot 2
name: nic-2105811-eth2-vmware-sfw.2
最後に、start capture dvfilter <分散FWのインスタンス名> stage preコマンドを使用して、分散FWに着信したパケットをキャプチャします。
esxi2.local.com> start capture dvfilter nic-2105811-eth1-vmware-sfw.2 stage pre
10:03:08.004653 00:50:56:b9:98:2c > 00:50:56:b9:b9:8a, ethertype IPv4 (0x0800), length 114: 10.1.1.1 > 10.1.1.2: ICMP echo request, id 137, seq 0, length 80
キャプチャポイント⑥
分散FWがR2にパケットを転送しているか確認します。もしパケットが確認できない場合は、分散FWでパケットが破棄されていることになります。
start capture dvfilter <分散FWのインスタンス名> stage postコマンドで分散FWが転送したパケットをキャプチャします。
esxi2.local.com> start capture dvfilter nic-2105811-eth1-vmware-sfw.2 stage post
10:03:33.748373 00:50:56:b9:98:2c > 00:50:56:b9:b9:8a, ethertype IPv4 (0x0800), length 114: 10.1.1.1 > 10.1.1.2: ICMP echo request, id 138, seq 0, length 80
コメント