Nested 環境の構築と MAC Learning の有効化

はじめに

vSphere 6.7 以降のバージョンでは、vSphere API を使用して仮想スイッチで MAC アドレスの学習の有効化が可能となっています。

今回は、ユースケースとして Nested の vSphere 環境で MACラーニングを利用することを例に挙げて、それぞれの設定や確認手順について紹介したいと思います。

Nested ESXi のデプロイ

William Lam さんの Blog で Nested ESXi の OVA が提供されているので、今回はそちらを利用してみます。

この OVA を利用してデプロイするメリットは、本来であればデプロイ後に個別で実施しなければならないホスト名の設定や IP アドレスの設定などをデプロイ時に設定できる点です。便利ですね。

因みに一番最後の Follow Hardware MAC Address という設定ですが、こちらは OVF ファイルを確認してみたところ、おそらくクローン時に vmk0 の MAC アドレスを Nested ESXi の vnic の MAC アドレスに追従させる設定のようです。

<Property ovf:key="guestinfo.followmac" ovf:type="boolean" ovf:userConfigurable="true" ovf:value="false">
          <Label>Follow Hardware MAC Address</Label>
          <Description>Enable to support cloning of Nested ESXi VM</Description>
        </Property>

なんの意味があるの?

デフォルトのままだと、Nested ESXi をクローンする際、vnic の MACアドレスはリセットされますが、vmk の MAC アドレスは変わらない仕組みになっています。

これを有効化にしていれば、仮想マシンのクローンを実行したときも vmk の MAC アドレスが重複せず利用できるようになります。

デプロイ後に確認してみると FollowHardwareMac の設定が有効となっています。

[root@n-esxi01:~] esxcfg-advcfg -g /Net/FollowHardwareMac
Value of FollowHardwareMac is 1

セキュリティ設定の変更

デフォルトのポートグループのセキュリティ設定では「無差別モード」、「MAC アドレス変更」、「偽装転送」の全て「拒否」となっています。

Nested 環境を構築する際の基本的な方針は、無差別モードと、偽装転送を有効化することです。

Nested VM からみて、インバウンドな通信を前者で許可し、アウトバウンドの通信を後者で許可する必要があるためです。

しかし、無差別モードの有効化は、全てのトラフィックを受信することになるためパフォーマンスの低下を招く恐れがあります。

そこで今回は、無差別モードの代わりに vDS の MAC アドレス学習機能を有効化にすることで Nested 環境に対してフレームがフォワーディングされるよう設定を行いたいと思います。

MACラーニングの有効化

SOAP API を直接叩くやり方はよくわからないので、これもWilliam Lam さんが提供してくださっているPowerCLI Function を活用して行ってみます。

ダウンロードはこちらから

Get-MacLearn コマンドでポートグループを指定して構成を取得します。

PS C:\> Get-MacLearn -DVPortgroupName @("pg-trunk")


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

続いてコマンドから MacLearning の有効化やポリシーの変更等を行います。

PS C:\> Set-MacLearn -DVPortgroupName @("pg-trunk") -EnableMacLearn $true -EnablePromiscuous $false -EnableForgedTransmit $true -EnableMacChange $false
Enabling MAC Learning on DVPortgroup: pg-trunk ...

構成を再確認すると MacLearning が有効になっていることがわかります。

PS C:\> Get-MacLearn -DVPortgroupName @("pg-trunk")


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

無差別モードは無効ですが、MACラーニングによってトラフィックが受信可能となり、Nested のESXiと通信ができるようになりました。

PS C:\> ping n-esxi01

n-esxi01.ad.hlab.com [172.16.xxx.xxx]に ping を送信しています 32 バイトのデータ:
172.16.xxx.xxx からの応答: バイト数 =32 時間 =1ms TTL=64
172.16.xxx.xxx からの応答: バイト数 =32 時間 =8ms TTL=64
172.16.xxx.xxx からの応答: バイト数 =32 時間 <1ms TTL=64
172.16.xxx.xxx からの応答: バイト数 =32 時間 =6ms TTL=64

172.16.xxx.xxx の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 8ms、平均 = 3ms

MACテーブルの確認

netdbg コマンドを使用して、特定のポート(Nested ESXi が接続されているポート)に関する MAC アドレス学習状況を確認してみます。

[root@nuc01:~] netdbg vswitch mac-table port get -p 44 -dvs vds01
MAC: 00:50:56:b1:86:b9 vid: 0      vni: 0        type: static    aging: no     elapsed: 0
MAC: 00:50:ac:1f:c8:33 vid: 200    vni: 0        type: learned   aging: yes    elapsed: 8

1つ目が vNIC の MAC アドレスで、2つめが vmk0 の MAC アドレスと一致していたので正しく動作していることがわかりました。

参考

https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.networking.doc/GUID-E0246B3D-9FB1-4976-8217-5C085863EA9A.html
https://williamlam.com/2018/04/native-mac-learning-in-vsphere-6-7-removes-the-need-for-promiscuous-mode-for-nested-esxi.html