Forged Transmits

関連製品の準備ができるまで 7.0 に移行できないので,Lab 使って色々検証をしています. 最近は NUC の Nested ESXi を使うようになったのですが,Nested ならではの設定でハマったポイントを書いておきます.

今回 NUC host から NFS datastore をマウントし,そこに仮想ディスクを複数用意して Nested ESXi で vSAN 環境を作りました.
NUC には pNIC が 1 枚しか無いので,vNIC をフル活用する必要があります.物理 N/W で当たり前に構成している事がサクッと出来ずかなりストレスでしたが,良い勉強になりました(笑).

f:id:tcpninja:20200701143751j:plain

少し整理しないと分かりにくいので図示しますが,NUC の pNIC (vmnic0) に vSS (vSwitch0) を構成し,管理用 (vmk0) と NFS 接続用 (vmk1) の VMkernel NIC を作成します.Nested ESXi 用には VLAN trunk port group を用意します.vSS の場合だと VLAN id を 4095 に設定するだけですね.
f:id:tcpninja:20200701164417p:plain

次に Nested ESXi の方のネットワークを図示します.仮想化の恩恵を受けられるので,ここはあえて複数 NIC で vDS を構成しています.vDS に vid 42, と53 の Port group を作成し,管理用 (vmk0) と vSAN 用 (vmk1) の VMkernel NIC を追加します. f:id:tcpninja:20200701182238p:plain

さあ,これで vSAN 用ネットワークも準備 OK ! とはならないのです.Nested ESXi の場合は,VLAN trunk port group の Security policy を変更して Promiscuous mode と Forged transmits を Accept する必要があります.Promiscuous mode は自分宛以外のトラフィックも受信して処理する mode なので,Packet capture の経験がある方には馴染み深いと思いますが,Forged transmits(日本語メニューだと「偽装転送」)が使われるのは Nested 環境以外だと NLB くらいでしょうか?
VLAN trunk port group で Forged transmits を Accept しないと,Effective address と Source address が異なるトラフィックが転送されません.

それでは,Nested ESXi の MAC address を確認してみましょう.

[root@ariel1:~] esxcfg-nics -l
Name    PCI          Driver      Link Speed      Duplex MAC Address       MTU    Description                   
vmnic0  0000:0b:00.0 nvmxnet3    Up   10000Mbps  Full   00:0c:29:dd:02:87 8900   VMware Inc. vmxnet3 Virtual Ethernet Controller
vmnic1  0000:13:00.0 nvmxnet3    Up   10000Mbps  Full   00:0c:29:dd:02:91 8900   VMware Inc. vmxnet3 Virtual Ethernet Controller
[root@ariel1:~] esxcfg-vmknic -l
Interface  Port Group/DVPort/Opaque Network        IP Family IP Address                              Netmask         Broadcast       MAC Address       MTU     TSO MSS   Enabled Type                NetStack            
vmk0       6                                       IPv4      10.4.2.104                              255.255.255.0   10.4.2.255      00:0c:29:dd:02:87 1500    65535     true    STATIC              defaultTcpipStack   
vmk1       0                                       IPv4      10.53.53.104                            255.255.255.0   10.53.53.255    00:50:56:66:48:5c 8900    65535     true    STATIC              defaultTcpipStack

vmnic1 の MAC address は 00:0c:29:dd:02:91 ですが,対応する vmk1 の MAC address は 00:50:56:66:48:5c になっているのが分かります.
Host 側 vSS の VLAN trunk port group 上では,vmnic1 (00:0c:29:dd:02:91) が見えていますね.

f:id:tcpninja:20200702101025p:plain

つまり,この環境では Effective address と Source address が異なるため,Port group の Security policy で Forged transmits を Accept しないと通信出来なくなってしまうのです.
念のため,Host で pktcap-uw してみましょう.

[root@esxevl01:~] net-stats -l
PortNum          Type SubType SwitchName       MACAddress         ClientName
...
67108879            5       9 vSwitch0         00:0c:29:dd:02:91  ariel1
...
[root@esxevl01:~] pktcap-uw --switchport 67108879 -o test.pcap


Wireshark で開いてみると,vmk1 の MAC address を確認できました. f:id:tcpninja:20200702102754p:plain

Security Policy には MAC address changes もありますが,これは Guest VM の OS 側で MAC address を変更した場合の通信許可なので,Accept しなくても今回の Nested ESXi 環境には直接影響ありません.また,Forged Transmits も,Effective address と Source address が異なるポイントだけで Accept すれば良いので,闇雲に色々 Accept して Security Holes を広げないように注意しましょう.


・おまけ
NUC 側は ESXi 7.0 にしたら,Nested ESXi 上の Guest OS を Power on すると Nested ESXi が (PSOD 画面も出さずに) 落ちるという現象に遭遇していたのですが,SkyLake-based CPU に関連する Bug だったようです.

www.virtuallyghetto.com


これは VMware ESXi 7.0, Patch Release ESXi 7.0b 適用で無事に解決しました!