vMotion時のRARPフレームを ESXiのpktcap-uwで観測する
概要
vSphereクラスタ環境で仮想マシンをvMotionで移行した際に発行されるRARP(Reverse Address Resolution Protocol)フレームを、ESXi標準のパケットキャプチャコマンド pktcap-uw を使って観測する。移行先ESXiの物理アップリンク(vmnic0 / vmnic1)でキャプチャを取得し、実際に流れるRARPフレームの中身を確認する
RARPが発行される意味
vMotionによってVMがホストを移行すると、物理スイッチから見れば「あるMACアドレスが接続されているポート」が突然変わることになる。スイッチのMACアドレステーブル(CAM / TCAM)はこの変化をすぐには認識できないため、テーブルが更新されるまでの間はVM宛のフレームが旧ホスト側のポートへ送られ、フレームがロストしてしまう。
これを防ぐため、vMotionの際には移行先ESXiが、VMが使用しているMACアドレスの接続先が変わったことをスイッチへ知らせる仕組みを持っている。その通知に使われるのがRARPフレームだ。スイッチはこのフレームを受け取ることで、該当MACアドレスのポートマッピングを即座に更新できる。
0x8035 のRARPパケットを送出する。これはARPリクエストの一種で、ESXiが上流スイッチに対してMAC-to-switchportマッピングの更新を「アナウンス」するために用いられる。ESXiがRARPを発行する主なケース
参考KBによれば、「Notify Switch」オプションが「yes」に設定されている前提で、ESXiホストは次のような場面でRARPを送出する。
- リンクのダウン/アップ時 — VMが別のアップリンク経由で接続し直す必要がある場合、稼働中のリンクからRARPが送られる。VMごとに約5個(最大8個)。リンクフラップ時は状態変化ごとに最大8個。短時間に多数のイベントが起きると、ホストが送出数を制限したり一部を送らない場合もある(LAGには適用されない)。
- vMotion後 — 移行先ESXiが、移行先で接続されたVMのためにRARPを送出する(通常1秒未満)。もしvMotion後にVMが接続を失う場合、上流スイッチがそのMACを学習できていないか、接続先ネットワークアダプタのVLAN構成を確認する。
- vCenterがESXiを再接続したとき — vCenterやvpxdの手動再起動などで、ポートグループ・分散スイッチ(vDS)・ポートが以前接続していたシステムに再適用される際。※標準仮想スイッチ(vSS)はESXiが管理するため対象外。
- 分散スイッチのポートグループ/チーミング変更時 — 変更が以前接続していたシステム向けにESXiへ再適用される際。※IPv6使用VMの場合、「Notify Switch」がyesでもIPv6 Neighbor Solicitationは送出されない。
- アップリンク単位への最適化 — 不要なフラッディングを避けるため、ブロードキャストドメイン内の全vNICポートではなくアップリンクからのみRARPを送出する最適化が導入された。vSphere 8.0では
com.vmware.port.extraConfig.forward.rarpオプションで特定のswitchportにもRARPを受信させる挙動変更が可能。
検証環境
検証には3ノード構成のvSphereクラスタを使用する。移行する仮想マシンは3つのvNICを持ち、それぞれ別のポートグループに接続されている。3つのvNICは物理アップリンク vmnic0 / vmnic1 のいずれかに紐づく。
| vNIC | MACアドレス | 接続先アップリンク |
|---|---|---|
| vNIC1 | 00:50:56:b3:31:b3 | vmnic1 |
| vNIC2 | 00:50:56:b3:7e:9d | vmnic1 |
| vNIC3 | 00:50:56:b3:75:98 | vmnic0 |
図1:移行対象VMのvNICと物理アップリンクの対応。vNIC1・vNIC2は vmnic1 に、vNIC3 は vmnic0 に接続される。
この構成のため、移行先ESXiの vmnic0 と vmnic1 の両方でキャプチャを取れば、3つすべてのvNICから発行されるRARPを観測できる。
キャプチャコマンド(物理ポートでキャプチャする)
アップリンクを流れる送信フレームをキャプチャするため、キャプチャポイントに UplinkSndKernel を指定し、EtherTypeフィルタで 0x8035(RARP)に絞り込む。
# vmnic0 でキャプチャ
pktcap-uw \
--uplink vmnic0 \
--capture UplinkSndKernel \
--ethtype 0x8035
# vmnic1 でキャプチャ
pktcap-uw \
--uplink vmnic1 \
--capture UplinkSndKernel \
--ethtype 0x8035キャプチャ例(移行先ESXiで実施)
移行先ホスト sb-e560f-esxi3 でvMotion実行時にキャプチャを取得すると、各vNICのMACアドレスを送信元とするRARPフレームが観測できる。
※下記に記載のキャプチャは全体の一部であり、実際には複数のRARPフレームが確認できる
vmnic 0 側(vNIC3 / 00:50:56:b3:75:98)
[root@sb-e560f-esxi3:~] pktcap-uw \
--uplink vmnic0 --capture UplinkSndKernel --ethtype 0x8035
The name of the uplink is vmnic0.
The session capture point is UplinkSndKernel.
The session filter Ethernet type is 0x8035.
...
15:37:18.739084[1] Captured at UplinkSndKernel point, ... VLAN tag 83, ... length 60.
Segment[0] ---- 60 bytes:
0x0000:ffff ffff ffff 0050 56b3 7598 8035 0001
0x0010:0800 0604 0003 0050 56b3 7598 0000 0000
0x0020:0050 56b3 7598 0000 0000 0000 0000 0000
0x0030:0000 0000 0000 0000 0000 0000vmnic 1 側(vNIC1 / 00:50:56:b3:31:b3)
[root@sb-e560f-esxi3:~] pktcap-uw \
--uplink vmnic1 --capture UplinkSndKernel --ethtype 0x8035
...
15:37:18.734345[1] Captured at UplinkSndKernel point, ... VLAN tag 81, ... length 60.
Segment[0] ---- 60 bytes:
0x0000:ffff ffff ffff 0050 56b3 31b3 8035 0001
0x0010:0800 0604 0003 0050 56b3 31b3 0000 0000
0x0020:0050 56b3 31b3 0000 0000 0000 0000 0000
0x0030:0000 0000 0000 0000 0000 0000
~~中略~~
15:37:18.736696[5] Captured at UplinkSndKernel point, ... VLAN tag 82, ... length 60.
Segment[0] ---- 60 bytes:
0x0000:ffff ffff ffff 0050 56b3 7e9d 8035 0001
0x0010:0800 0604 0003 0050 56b3 7e9d 0000 0000
0x0020:0050 56b3 7e9d 0000 0000 0000 0000 0000
0x0030:0000 0000 0000 0000 0000 00003つのvNIC(...75:98 / ...31:b3 / ...7e:9d)それぞれについて、それぞれのVLAN(tag 83 / 81 / 82)でRARPが送出されているのが確認できる。タイムスタンプもほぼ同時(15:37:18台)で、vMotion完了直後にまとめて発行されていることが分かる。
RARPフレームの中身をデコードする
vNIC3(00:50:56:b3:75:98)のフレームを例に、60バイトのペイロードを分解してみる。
■ 宛先(ブロードキャスト) ■ 送信元MAC ■ EtherType 0x8035
ポイントは、宛先がブロードキャスト、送信元がVMのMACアドレスであること。ESXiはVMになりすまして「このMACはこのポートから来る」とブロードキャストすることで、上流スイッチにポートの再学習を促している。IPアドレスは埋められていない(0.0.0.0)ため、これはあくまでL2レベルの通知である。
参考:ネスト環境で仮想マシン(ハイパーバイザー)が発行するRARPを観測する
ネスト構成でゲスト側のハイパーバイザーが発行するRARPを、仮想スイッチのポート側でキャプチャしたい場合の手順。まず対象VMが使用するポートIDを取得する(esxtop の n オプションでも確認可能)。
esxcli network vm list
esxcli network vm port list -w <World-ID>
# → 出力から PortID を確認する取得したPortIDを指定し、vNICの送受信(VnicTx,VnicRx)でRARPをキャプチャする。
pktcap-uw \
--switchport <PortID> \
--capture VnicTx,VnicRx \
--ethtype 0x8035参考KB
IP to MAC mapping, GARP, RARP and Notify Switches — Broadcom Knowledge Base (Article 343401)
コメント
コメントを投稿