今回はNSX-Tのバージョン3.0.0からサポートしているMulticastの検証証跡をまとめます。
概要
PIM-SMとIGMPについて
最初にマルチキャストで使われる用語を整理します。
マルチキャストトラフィックの送信元をSender、マルチキャストトラフィックを受信したい端末をReceiverと呼びます。また、Senderと直接接続しているルータをFHR(Fast Hop Router)、Receiverと直接接続しているルータをLHR(Last Hop Router)と呼びます。
マルチキャストではRP(Rendezvous Point)と呼ばれる特殊なルータが存在し、事前に各ルータはRPとして動作するルータのアドレスを認識しておく必要があります。各ルータにRPのアドレスを認識させる方法は2種類存在します。1つ目はStatic RPと呼ばれており、各ルータに手動でRPのアドレスを設定します。2つ目はBSR(Bootstrap Router)と呼ばれており、各ルータ間で動的にRPのアドレスをやり取りします。
ここから、SenderからReceiverにマルチキャストトラフィックが転送されるまでの流れを説明します。
まず、ReceiverはIGMP(Internet Group Management Protocol)を使用して、LHRに対して、受信したいマルチキャストトラフィックのグループアドレスを通知します。この際に送信されるメッセージをIGMP Membership Reportと呼びます。
LHRはIGMP Membershipを受信後、RPの方向に対して、PIM(Protocol Independent Multicast)を使用して、Receiverが受信したいマルチキャストトラフィックのグループアドレスを通知します。この際に送信させるメッセージをPIM Joinと呼びます。(正式な名称はPIM Join/Pruneになります。)
また、PIMにはPIM-DM(PIM Dense Mode)、PIM-SM(Sparse Mode)、Bidir-PIM(Bidirectional PIM)の3種類が存在します。ここでは、NSX-TでサポートしているPIM-SMの動作を説明します。
PIM Joinが転送される過程で、各ルータにはマルチキャストトラフィックを転送するためのルート情報である(*,G)エントリが生成されます。*はマルチキャストトラフィックの送信元のアドレスが不明なことを示します。
この後、Senderがマルチキャストトラフィックを送信したとします。
FHRはマルチキャストパケットを受信後、マルチキャストパケットをPIMでカプセル化して、ユニキャストでRPに転送します。RPはカプセル化されたパケットを受信後、カプセル化を解除し、LHR側にマルチキャストパケットを転送します。また、この時点で、RP~LHR間のルータとFHRに(S,G)エントリが生成されます。
また、RPはマルチキャストパケットの送信元の方向に対して、PIM Joinを送信します。
この結果、FHR~LHR間のルータに(*,G)エントリや(S,G)エントリが生成され、途中でのカプセル化無しで、FHRからLHRに対してマルチキャストパケットが転送可能です。
このFHRからLHRまでのマルチキャストパケットが流れる経路をDistribution Treeと呼びます。
上記の場合、RPとLHRは直接接続されていますが、RPはLHRにマルチキャストパケットを直接転送していないため、通信経路が非効率なことが分かります。この様な状況では、LHRは通信経路の最適化を試みます。この処理をSwitchoverと呼びます。(緑のトラフィックをPIM Pruneと呼びます。)
この結果、FHRからLHRまでのマルチキャストパケットの転送経路が最適化されます。
RPF Checkについて
届いたマルチキャストパケットを、無条件でLHR側に転送してしまうと、Receiverが同じパケットを複数受信してしまう可能性があります。
上記の問題を解決するために、ルータはマルチキャストパケットを受信した際、RPF(Reverse Path Forwarding) Checkと呼ばれる処理を実施します。RPF Checkでは、以下が異なる場合、マルチキャストパケットをLHR側に転送せずに破棄します。
- マルチキャストパケットを受信したインタフェース
- マルチキャストパケットの送信元アドレスへのネクストホップインタフェース
NSX-Tのマルチキャストについて
NSX-Tのマルチキャストの注意点は以下になります。
- プロトコルはPIM-SM、IGMPv2のみサポート(PIM-DM、Bidier-PIM、IGMPv3は未サポート)
- RPの学習方法はStatic RP、BSRのみをサポート(Auto-RPは未サポート)
- Tier-0 GWのみマルチキャストをサポート(Tier-1 GWはマルチキャストを未サポート)
- RPF Checkにはデフォルトルートを使用不可(バージョン3.0.1からは可)
検証結果
検証内容、構成
Tier-0 GWでSegment 1を収容します。
NSX EdgeにTier-0 GWのSRを配置し、物理ネットワークとNSX-Tの仮想ネットワークを接続します。
Tier-0 GWとR2でPIM-SMを動作させます。
R2の20.0.0.2/32をRPとして使用します。
Tier-0 GWとR2ではRPのアドレスを手動で指定します。
Segment 1の仮想マシンを230.1.1.1に参加させます。
R3から230.1.1.1宛のトラフィックを送信します。
ネットワーク機器のCLIの設定
ip multicast-routing distributed
!
interface Loopback0
ip address 20.0.0.2 255.255.255.255
!
interface GigabitEthernet2
ip address 20.1.1.100 255.255.255.0
ip pim sparse-mode
!
interface GigabitEthernet3
ip address 20.2.2.2 255.255.255.0
ip pim sparse-mode
!
ip pim rp-address 20.0.0.2
!
ip route 0.0.0.0 0.0.0.0 20.1.1.1
interface GigabitEthernet2
ip address 20.2.2.3 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 20.2.2.2
Multicastの設定
IGMP Profileの設定
IGMP Profileにおいて、IGMPの各種タイマーを設定します。
PIM Profileの設定
PIM Profileにおいて、RPのアドレスを指定します。
Tier-0 GWの設定
マルチキャストの有効化
最初にTier-0 GWでマルチキャストを有効にします。また、先程定義したIGMP ProfileとPIM Profileを適用します。
(ドキュメントを読みましたが、レプリケーションのマルチキャスト範囲が何のためのパラメータなのか分かりませんでした。使用しないマルチキャストアドレスの範囲を指定すればよいと思います。)
アップリンクでのPIMの有効化
物理ネットワーク側のルータとPIMのメッセージをやり取りするために、アップリンクでPIMを有効にします。
RPF Check用のスタティックルートの設定
受信したマルチキャストパケットに対するRPF Checkを成功させるために、マルチキャストの送信元アドレスにマッチするスタティックルートを設定します。
状態確認1(仮想マシン : グループ参加前 , R3 : トラフィック送信前)
IGMP/PIMの状態確認
IGMPが動作しているインタフェースはget igmp interfacesコマンドで確認可能です。Tier-0 GWのDRやSRのインタフェースでIGMPが動作していることが確認できます。
edge1(tier0_sr)> get igmp interfaces
Interface State Address V Querier Query Timer Uptime
downlink-327 up 169.254.0.2 2 local 00:00:27 01:06:13
downlink-355 up 10.1.1.254 2 local 00:00:27 01:06:13
uplink-325 up 20.1.1.1 2 local 00:00:27 157:37:04
PIMが動作しているインタフェースはget pim interfacesコマンドで確認可能です。Tier-0 GWのDRやSRのインタフェースでPIMが動作していることが確認できます。
edge1(tier0_sr)> get pim interfaces
Interface State Address PIM Nbrs PIM DR FHR IfChannels
downlink-327 up 169.254.0.2 0 local 0 0
downlink-355 up 10.1.1.254 0 local 0 0
uplink-325 up 20.1.1.1 1 20.1.1.100 0 0
PIMのネイバーはget pim neighborsコマンドで確認可能です。Tier-0 GWのSRがR2とPIMネイバーを確立していることが確認できます。
edge1(tier0_sr)> get pim neighbors
Interface Neighbor Uptime Holdtime DR Pri
uplink-325 20.1.1.100 157:36:50 00:01:23 1
状態確認2(仮想マシン : グループ参加後 , R3 : トラフィック送信前)
Segment 1の仮想マシンを230.1.1.1に参加させます。
IGMP/PIMメッセージの確認
以下はSegment 1の仮想マシンが送信したIGMP Membership Reportのキャプチャになります。参加先のマルチキャストアドレスである230.1.1.1が格納されていることが確認できます。
以下はTier-0 GWのDRがSRに転送したIGMP Membership Reportのキャプチャになります。Geneveでカプセル化されていることが確認できます。
以下はTier-0 GWのSRがR2に送信したPIM Joinのキャプチャになります。
マルチキャストアドレスの230.1.1.1と、RPのアドレスの20.0.0.2が格納されていることが確認できます。
IGMP/PIMの状態確認
仮想マシンが参加したマルチキャストアドレスはget igmp membershipコマンドで確認可能です。Tier-0 GWのSRが230.1.1.1を認識していることが確認できます。
edge1(tier0_sr)> get igmp membership
Total IGMP groups: 2
Watermark warn limit(Not Set) : 0
Interface Address Group Mode Timer Srcs V Uptime
downlink-327 169.254.0.2 230.1.1.1 ---- 00:01:06 1 2 00:01:02
uplink-325 20.1.1.1 224.0.1.40 ---- 00:00:45 1 2 157:40:05
マルチキャストトラフィックを転送するためのルート情報はget mroute <マルチキャストアドレス>コマンドで確認可能です。Tier-0 GWのSRに(*,G)エントリが生成されていることが確認出来ます。
edge1(tier0_sr)> get mroute 230.1.1.1
IP Multicast Routing Table
Flags: S- Sparse, C - Connected, P - Pruned
R - RP-bit set, F - Register flag
Source Group Flags Proto Input Output TTL Uptime
* 230.1.1.1 SC IGMP uplink-325 pimreg 1 00:01:30
IGMP downlink-327 1
PIMのネイバーはget pim neighborsコマンドで確認可能です。R2にも(*,G)エントリが生成されていることが確認できます。
R2#show ip mroute 230.1.1.1
(*, 230.1.1.1), 00:01:41/00:02:52, RP 20.0.0.2, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
GigabitEthernet2, Forward/Sparse, 00:01:41/00:02:52
状態確認3(仮想マシン : グループ参加後 , R3 : トラフィック送信後)
R3から230.1.1.1宛にトラフィックを送信します。
IGMP/PIMの状態確認
Tier-0 GWのSRとR2に(S,G)エントリが生成されていることが確認できます。
edge1(tier0_sr)> get mroute 230.1.1.1
IP Multicast Routing Table
Flags: S- Sparse, C - Connected, P - Pruned
R - RP-bit set, F - Register flag
Source Group Flags Proto Input Output TTL Uptime
* 230.1.1.1 SC IGMP uplink-325 pimreg 1 00:04:43
IGMP downlink-327 1
20.2.2.3 230.1.1.1 S STAR uplink-325 downlink-327 1 00:01:35
R2#show ip mroute 230.1.1.1
(*, 230.1.1.1), 00:07:39/00:02:54, RP 20.0.0.2, flags: SF
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
GigabitEthernet2, Forward/Sparse, 00:04:24/00:02:54
(20.2.2.3, 230.1.1.1), 00:01:16/00:01:43, flags: FT
Incoming interface: GigabitEthernet3, RPF nbr 0.0.0.0
Outgoing interface list:
GigabitEthernet2, Forward/Sparse, 00:01:16/00:02:54
疎通確認
以下はTier-0 GWのSRがDRに転送した230.1.1.1宛のマルチキャストトラフィックのキャプチャになります。Geneveでカプセル化されていることが確認できます。
以下はTier-0 GWのDRがSegment 1の仮想マシンに転送した230.1.1.1宛のマルチキャストトラフィックのキャプチャになります。
コメント