前回の記事で、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