hidemium's blog

日々学んだことをアウトプットする。

vDSのMACラーニングを利用してNested ESXiの検証環境を構築する

前回の記事で、Nested ESXiを使った検証環境の構築方法についてを書いてみましたが、今回はvDSを利用したMACラーニングについて書いてみようと思います。

構成

  • vCenter 7.0 U2
  • ESXi 7.0 Update 2
  • ESXi 7.0 Update 3 Virtual Appliance

vDSのMACラーニング機能について

vSphere 6.7から、vDS 6.6にMAC ラーニングが実装され、分散スイッチが仮想マシンMAC アドレスを学習できるようもになりました。 これにより、無差別モードが無効な場合でも、分散スイッチがMACアドレスを学習しているため、vNICのMACアドレスと異なる宛先MACアドレスのフレームを受診しても、正しいvNICにフォワーディングすることができるようになります。ただし、vNICと異なる送信元MACアドレスのフレームが送信を許可する必要があるため、偽装転送については承諾は必要となります。

Native MAC Learning in vSphere 6.7 removes the need for Promiscuous mode for Nested ESXi

事前準備

トランクポートのポートグループの作成

Nested ESXi上の仮想マシンとネットワーク疎通を取るために、トランクポートのポートグループを作成します。

  • vSphere Clientにログインします。
  • vDSを右クリックし、新規ポートグループをクリックします。
  • 新規分散ポート グループにて、VLAN タイプにVLANトランクを選択します。
  • デフォルト ポリシー設定をカスタマイズしますを選択し、次へをクリックします。
  • セキュリティにて、偽装転送を承諾に選択します。
  • 他の設定はすべてデフォルトのままとし、完了をクリックします。

vDSのMACラーニング機能の有効化について

vDSのMACラーニング機能の有効化について、上記の記事にあるPowerCLIスクリプトを利用することで実現できます。

まずは、PowerCLIをインストールします。

> Install-Module VMware.PowerCLI

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): A

モジュールがインストールされているか確認します。

> Get-Module VMware* -ListAvailable

PowerShellの実行ポリシーを確認します。

> Get-ExecutionPolicy
Unrestricted 

vCenterに接続します。

Connect-VIServer -Server 'vcsa-1.home.lab' -User 'Administrator@vsphere.local' -Password 'password' -force

以下のスクリプトをダウンロードします。

vmware-scripts/MacLearn.ps1 at master · lamw/vmware-scripts · GitHub

PowerShellモジュールをインポートします。

> Import-Module .\MacLearn.ps1

現在のvDSのMACラーニングの設定を確認します。

Get-MacLearn -DVPortgroupName @("trunk-maclaearn")


DVPortgroup            : trunk-maclaearn
MacLearning            : False
NewAllowPromiscuous    : False
NewForgedTransmits     : False
NewMacChanges          : False
Limit                  :
LimitPolicy            :
LegacyAllowPromiscuous : False
LegacyForgedTransmits  : False
LegacyMacChanges       : False

vDSのMACラーニングを有効にします。

Set-MacLearn -DVPortgroupName @("trunk-maclaearn") -EnableMacLearn $true -EnablePromiscuous $false -EnableForgedTransmit $true -EnableMacChange $false

変更後のvDSのMACラーニングの設定を確認します。

Get-MacLearn -DVPortgroupName @("trunk-maclaearn")


DVPortgroup            : trunk-maclaearn
MacLearning            : True
NewAllowPromiscuous    : False
NewForgedTransmits     : True
NewMacChanges          : False
Limit                  : 4096
LimitPolicy            : DROP
LegacyAllowPromiscuous : False
LegacyForgedTransmits  : True
LegacyMacChanges       : False

MacLearningがTrueとなり、MACラーニングが有効になったことが分かります。またLimitが4096となり、MACラーニングの上限が4096に設定されたことが分かります。

Nested ESXi内部にゲストOSを作成

Nested ESXi内部にゲストOSを作成し、pingを実行します。

  • Nested ESXiのHost Clientにログインします。
  • ゲストOSが接続するポートグループのVLANIDを検証環境のVLANIDと合わせておきます。
  • ゲストOSは軽量のほうがテストしやすいので、Photon OSのovaイメージを利用しデプロイします。
  • Photon OSの初期パスワードはchangemeなので、パスワードを新しく設定します。
  • ゲストOSが起動後、ゲストOS内でpingの応答ができるように、FWの設定を変更します。
  • ゲストOSに対してpingを実行し、応答があるか確認します。

偽装転送を承諾にするだけで、Nested ESXi内部にゲストOSへ疎通が取れることが確認できました。

ポートグループの動作について確認

セキュリティにて、偽装転送を承諾に選択しましたが、すべて拒否にするとどうなるか確認してみます。 すべて拒否しても、pingの応答が返ってきました。偽装転送を行っても疎通が取れるのは、想定外のため詳細については別途確認してみようと思います。

ESXi上でのコマンド確認

ESXiシェルで現在学習中のMACアドレスについて詳細情報を取得することも可能です。netdebgコマンドを利用します。

[root@esxi-2:~] netdbg vswitch instance list
vSwitch0 ()                                                                     
Total Ports:2560 Available:2548
  Client                         PortID          DVPortID                             MAC                  Uplink         
  Management                     67108868                                             00:00:00:00:00:00    n/a            
  vmnic0                         2214592517                                           00:00:00:00:00:00                   
  Shadow of vmnic0               67108870                                             00:50:56:5d:b8:0f    n/a            
  vmk0                           67108871                                             94:c6:91:1d:a5:8d    vmnic0         
  vmk1                           67108873                                             00:50:56:68:a2:65    vmnic0         
  vmk2                           67108876                                             00:50:56:67:eb:63    vmnic0         

DvsPortset-0 (DSwitch)           50 38 56 06 e8 10 60 77-f9 5e 1b 6b 90 0c 9c e2
Total Ports:2560 Available:2548
  Client                         PortID          DVPortID                             MAC                  Uplink         
  Management                     100663304                                            00:00:00:00:00:00    n/a            
  vusb0                          2248146954      166                                  00:00:00:00:00:00                   
  Shadow of vusb0                100663307                                            00:50:56:54:e2:b6    n/a            
  esxi70u3a-2.eth0               100663311       167                                  00:50:56:b8:b0:ea    vusb0          
  esxi70u3a-2.eth1               100663312       168                                  00:50:56:b8:77:de    vusb0

Nested ESXiのDVPortIDを指定し、以下のコマンドを実行します。

[root@esxi-2:~] netdbg vswitch mac-learning port get -p 167 --dvs-alias DSwitch
MAC Learning:                   True
Unknown Unicast Flooding:       True
MAC Limit:                      4096
MAC Limit Policy:               DROP
[root@esxi-2:~] netdbg vswitch mac-learning port get -p 168 --dvs-alias DSwitch
MAC Learning:                   True
Unknown Unicast Flooding:       True
MAC Limit:                      4096
MAC Limit Policy:               DROP

DVポートで学習したすべてのMACアドレスを取得するには以下のように実行します。

[root@esxi-2:~] netdbg vswitch mac-table port get -p 167 --dvs-alias DSwitch
MAC: 00:0c:29:c6:07:20 vid: 0      vni: 0        type: learned   aging: yes    elapsed: 876   
MAC: 00:50:56:60:e5:ed vid: 0      vni: 0        type: learned   aging: yes    elapsed: 876   
MAC: 00:50:56:60:e5:ed vid: 50     vni: 0        type: learned   aging: yes    elapsed: 1     
MAC: 00:0c:29:c6:07:20 vid: 50     vni: 0        type: learned   aging: yes    elapsed: 118   
MAC: 00:50:56:b8:b0:ea vid: 0      vni: 0        type: static    aging: no     elapsed: 0 

物理スイッチ側の動作について確認

物理スイッチ側でNested ESXiのVMとNested ESXi内部にゲストOSのMACアドレスについて、MACアドレステーブルの確認します。
フレームがNested ESXiと同じポートから送出されていることが分かります。

#show mac address-table
  50    0050.5660.e5ed    DYNAMIC     Gi0/4  #Eested ESXiのvmk0
  50    000c.29c6.0720    DYNAMIC     Gi0/4     #ゲストOSのeth0

vMotionによる動作

vMotionを行った場合に、学習したMACは新しいポートに移動されるかという疑問が生じますが、上記の記事には同一ホスト上にNested ESXiが2台あり、そのNested ESXi上でvMotionを行っても新しいvNICポートに移動するようです。また、別のホスト上にNested ESXiが2台存在し、そのNested ESXi上でvMotionを行っても新しいvNICポートに移動するようです。

また、Nested ESXiのVM自体を別のホストにvMotionを行った場合について、動作確認を行ってみました。 vMotion後に、物理スイッチのMACアドレステーブルを確認したところ、Nested ESXi内のゲストOSについても、フレームがNested ESXiと同じポートから送出されていることが分かります。(Nested ESXiをvCenterに接続していないため、vCenterに接続されていないESXiにより自動割当てされるMACアドレスのベンダーコードは00:0C:29になります。)

#show mac address-table
  50    0050.5660.e5ed    DYNAMIC     Gi0/6  #Eested ESXiのvmk0
  50    000c.29c6.0720    DYNAMIC     Gi0/6     #ゲストOSのeth0

参考情報

Nested ESXi のテンプレート作りに必要な設定と解説 | vSoliloquy