PIM Sparse modeはRPと呼ばれる待ち合わせ場所が存在します。RPとは共有ツリーと送信元ツリーがぶつかる場所です。ここでは、レシーバ, RP間の通信経路である共有ツリーについて考察します。
概要
shared tree 概要
以下の構成を例に挙げて、shared tree形成の概要を説明します。Host 1がマルチキャストレシーバで、R3がRPです。
RP +--------+ +--------+ +--------+ +--------+ | Host 1 +----------+ R1 +----------+ R2 +----------+ R3 | +--------+ +--------+ +--------+ +--------+ ---------> ---------> ---------> IGMP membership report PIM join PIM join
ラストホップルータであるR1はHost 1からのIGMP membership reportを受信すると、RPに向かってPIM joinを送信し、マルチキャストレシーバの存在をRPに知らせます。また、R1はPIM joinを作成すると同時に、shared tree用の(*, G)エントリを作成します。
同様にR2も、PIM joinの送信と(*, G)エントリの作成を行います。
なお、PIM joinをキャプチャした結果は以下の通りです。
Ethernet II, Src: cc:02:0f:4c:00:01 (cc:02:0f:4c:00:01), Dst: IPv4mcast_00:00:0d (01:00:5e:00:00:0d) Internet Protocol Version 4, Src: 192.168.23.3 (192.168.23.3), Dst: 224.0.0.13 (224.0.0.13) Protocol Independent Multicast 0010 .... = Version: 2 .... 0011 = Type: Join/Prune (3) Reserved byte(s): 00 Checksum: 0xff3b [correct] PIM options Upstream-neighbor: 192.168.23.2 Reserved byte(s): 00 Num Groups: 1 Holdtime: 210s Group 0: 239.1.1.1/32 Num Joins: 1 IP address: 10.1.1.1/32 (SWR) Num Prunes: 0
shared tree
動作確認
以下の構成で、R1をRPとして設定します。なお、検証の都合上、一部のinterfaceのみマルチキャストを有効にしています。
[ip address] e0/0 e0/1 .2+--------+.2 192.168.12.0/24┌----+ R2 +----┐192.168.23.0/24 │ +--------+ │ │ │ .1│e0/0 e0/1│.3 +---+----+ +---+----+ +--------+ | R1 +----------+ R3 +----------+ Host 3| +--------+.1 .3+--------+.3 .103+--------+ e0/2 e0/2 e0/0 e0/0 192.168.13.0/24 192.168.3.0/24 R1 Loopback0 R2 Loopback0 R3 Loopback0 10.1.1.1/32 10.2.2.2/32 10.3.3.3/32 [multicast domain] e0/0 e0/1 .2+--------+.2 192.168.12.0/24┌----+ R2 +----┐192.168.23.0/24 │ +--------+ │ │ │ .1│e0/0 e0/1│.3 +---+----+ +---+----+ +--------+ | R1 | | R3 +----------+ Host 3| +--------+ +--------+.3 .103+--------+ static RP e0/0 e0/0 192.168.3.0/24
[R1] ip multicast-routing ! interface Loopback0 ip pim sparse-mode ! interface Ethernet0/0 ip pim sparse-mode ! ip pim rp-address 10.1.1.1 [R2] no ip domain lookup ! ip multicast-routing ! interface Loopback0 ip pim sparse-mode ! interface Ethernet0/0 ip pim sparse-mode ! interface Ethernet0/1 ip pim sparse-mode ! ip pim rp-address 10.1.1.1 1 access-list 1 permit 239.0.0.0 0.255.255.255 [R3] no ip domain lookup ! ip multicast-routing ! interface Loopback0 ip pim sparse-mode ! interface Ethernet0/1 ip pim sparse-mode ! ip pim rp-address 10.1.1.1 1 access-list 1 permit 239.0.0.0 0.255.255.255 [Host3] interface Ethernet0/0 ip igmp join-group 239.1.1.1 ! ip route 0.0.0.0 0.0.0.0 192.168.3.3
設定全文は下記ファイルです。ルーティングなどの詳細設定は下記を参照ください。
shared tree 確認
Host3からIGMP membership reportを送信し、shared treeが形成される様子を観察します。
interface Ethernet0/0 no ip igmp join-group 239.1.1.1 ip igmp join-group 239.1.1.1
マルチキャストルーティングテーブルを確認すると、R1, R2には、(*, 239.1.1.1)エントリが存在しない事が分かります。また、R3 (*, 239.1.1.1)エントリにIncoming interface: Nullと表記されている事が分かります。
[R1] R1#show ip mroute 239.1.1.1 Group 239.1.1.1 not found R1# [R2] R2#show ip mroute 239.1.1.1 Group 239.1.1.1 not found R2# [R3] R3#show ip mroute 239.1.1.1 <omitted> (*, 239.1.1.1), 00:00:37/00:02:43, RP 10.1.1.1, flags: SJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/0, Forward/Sparse, 00:00:16/00:02:43 R3#
shared treeにおけるIncoming interfaceとは、RPの方向を示します。
ルーティングテーブルを参照すると、RPの方向はe0/2である事が分かります。しかし、e0/2はPIMが有効になっていないので、PIM joinをRPに向かって送信する事ができません。このようにユニキャストルーティング上の不都合によりshared treeが形成できない場合は、static mrouteを用いてPIM joinを送信する方向を制御する必要があります。
R3#show ip route ospf O 192.168.12.0/24 [110/20] via 192.168.23.2, 00:07:57, Ethernet0/1 [110/20] via 192.168.13.1, 00:07:57, Ethernet0/2 10.0.0.0/32 is subnetted, 3 subnets O 10.2.2.2 [110/11] via 192.168.23.2, 00:07:57, Ethernet0/1 O 10.1.1.1 [110/11] via 192.168.13.1, 00:07:57, Ethernet0/2 R3#
static mroute
R3からR2へPIM joinを送信するように、以下のstatic mrouteを送信します。
[R3] ip mroute 10.1.1.1 255.255.255.255 192.168.23.2
R1, R2, R3に(*, G)エントリが作成されている事が確認できます。また、R3 (*, G)エントリのIncomming interfaceがe0/1に変わっている事が読み取れます。
[R1] R1#show ip mroute 239.1.1.1 <omitted> (*, 239.1.1.1), 00:02:37/00:02:51, RP 10.1.1.1, flags: S Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/0, Forward/Sparse, 00:02:37/00:02:51 R1# [R2] R2#show ip mroute 239.1.1.1 <omitted> (*, 239.1.1.1), 00:02:32/00:02:46, RP 10.1.1.1, flags: S Incoming interface: Ethernet0/0, RPF nbr 192.168.12.1 Outgoing interface list: Ethernet0/1, Forward/Sparse, 00:02:32/00:02:46 R2# [R3] R3#show ip mroute 239.1.1.1 <omitted> (*, 239.1.1.1), 00:14:39/00:02:20, RP 10.1.1.1, flags: SJC Incoming interface: Ethernet0/1, RPF nbr 192.168.23.2, Mroute Outgoing interface list: Ethernet0/0, Forward/Sparse, 00:14:18/00:02:20 R3#
RP(R1 Loopback 0)からレシーバ(Host3)まで疎通可能である事を確認します。
R1#ping 239.1.1.1 source Loopback 0 Type escape sequence to abort. Sending 1, 100-byte ICMP Echos to 239.1.1.1, timeout is 2 seconds: Packet sent with a source address of 10.1.1.1 Reply to request 0 from 192.168.3.103, 80 ms Reply to request 0 from 192.168.3.103, 80 ms R1#
Accept RP
基本設定
shared treeにはAccept RPという機能が存在します。Accept RPとは、RPが受け入れるグループアドレスを制限する機能のことです。具体的には、RPに送る(*, G) join messageを取捨選択を行います。
以下のコマンドで、RPに転送する(*, G) joinを制限する事ができます。
Router(config) ip pim accept-rp <rp_addr> <std_acl>
以下のコマンドで、自動的に設定されたRPに対してのみ(*, G) joinを転送します。言い換えると、staticに設定されたRPに対する(*, G) joinを拒否し、自動設定されたRP(Auto RPだけでなくBSRも含みます)に対してのみ(*, G) joinを転送します。また、<std_acl>を指定すると、グループアドレスに基づく(*, G) joinの取捨選択が可能です。
Router(config) ip pim accept-rp auto-rp [ <std_acl> ]
動作確認
動作確認を行う環境は、先ほどと同様です。RPの仕様がやや複雑ですので、RPに関する仕様を以下に抜粋します。
[ip address] e0/0 e0/1 .2+--------+.2 192.168.12.0/24┌----+ R2 +----┐192.168.23.0/24 │ +--------+ │ │ │ .1│e0/0 e0/1│.3 +---+----+ +---+----+ +--------+ | R1 +----------+ R3 +----------+ Host 3 | +--------+.1 .3+--------+.3 .103+--------+ e0/2 e0/2 e0/0 e0/0 192.168.13.0/24 192.168.3.0/24 R1 Loopback0 R2 Loopback0 R3 Loopback0 10.1.1.1/32 10.2.2.2/32 10.3.3.3/32 [multicast domain] e0/0 e0/1 .2+--------+.2 192.168.12.0/24┌----+ R2 +----┐192.168.23.0/24 │ +--------+ │ │ │ .1│e0/0 e0/1│.3 +---+----+ +---+----+ +--------+ | R1 | | R3 +----------+ Host 3 | +--------+ +--------+.3 .103+--------+ static RP : 239.0.0.0/8 e0/0 e0/0 Auto RP : 238.0.0.0/8 192.168.3.0/24 BSR : 237.0.0.0/8
[R1] ip pim rp-address 10.1.1.1 1 ip pim autorp listener ip pim send-rp-announce Loopback0 scope 5 group-list 2 interval 15 ip pim send-rp-discovery Loopback0 scope 5 interval 15 ip pim bsr-candidate Loopback0 0 ip pim rp-candidate Loopback0 group-list 3 interval 15 ! access-list 1 permit 239.0.0.0 0.255.255.255 access-list 2 permit 238.0.0.0 0.255.255.255 access-list 3 permit 237.0.0.0 0.255.255.255 [R2] ip pim rp-address 10.1.1.1 1 ip pim autorp listener ! access-list 1 permit 239.0.0.0 0.255.255.255 [R3] ip pim rp-address 10.1.1.1 1 ! access-list 1 permit 239.0.0.0 0.255.255.255 ip pim autorp listener ! ip mroute 10.1.1.1 255.255.255.255 192.168.23.2
グループアドレスに基づく制限
R2において、第四オクテットが奇数である(*, G) joinのみを許可するように設定します。
[R2] access-list 4 permit 239.0.0.1 0.255.255.254 ip pim accept-rp 10.1.1.1 4
Host3で以下のマルチキャストグループに参加します。
[Host3] interface Ethernet0/0 no ip igmp join-group 239.1.1.1 ip igmp join-group 239.1.1.1 ip igmp join-group 239.2.2.2 ip igmp join-group 239.3.3.3 ip igmp join-group 239.4.4.4
R2のコンソールを開きしばらく待つと、R2において(*, G) joinがフィルタされた旨が出力されます。
R2# *Mar 1 00:13:10.435: %PIM-6-INVALID_RP_JOIN: Received (*, 239.2.2.2) Join from 192.168.23.3 for invalid RP 10.1.1.1 R2#
R2のマルチキャストルーティングテーブルを見ると、第四オクテットが奇数であるグループアドレスのみshared treeが形成されている事が読み取れます。
R2#show ip mroute | include 23[0-9] (*, 239.1.1.1), 00:05:54/00:02:38, RP 10.1.1.1, flags: S (*, 239.3.3.3), 00:00:40/00:02:49, RP 10.1.1.1, flags: S R2#
static RP 拒否
R2において、static RPへの(*, G) joinを拒否するように設定します。
[R2] no ip pim accept-rp 10.1.1.1 4 ip pim accept-rp auto-rp
Host3で以下のマルチキャストグループに参加します。
[Host3] interface Ethernet0/0 no ip igmp join-group 239.1.1.1 no ip igmp join-group 239.2.2.2 no ip igmp join-group 239.3.3.3 no ip igmp join-group 239.4.4.4 ip igmp join-group 239.1.1.1 ip igmp join-group 239.2.2.2 ip igmp join-group 239.3.3.3 ip igmp join-group 239.4.4.4 ip igmp join-group 238.1.1.1 ip igmp join-group 238.2.2.2 ip igmp join-group 237.1.1.1 ip igmp join-group 237.2.2.2
R2のマルチキャストルーティングテーブルを見ると、自動的に設定されたRP(Auto RP, BSR)に対してのみのshared treeが形成された事が読み取れます。
R2#show ip mroute | include 23[0-9] (*, 238.1.1.1), 00:00:08/00:03:21, RP 10.1.1.1, flags: S (*, 237.2.2.2), 00:00:19/00:03:11, RP 10.1.1.1, flags: S (*, 238.2.2.2), 00:00:07/00:03:22, RP 10.1.1.1, flags: S (*, 237.1.1.1), 00:00:21/00:03:09, RP 10.1.1.1, flags: S R2#
Multicast Boundary
基本設定
Multicast BoundaryはPIM join messageやAuto RP messageを制限する事によってマルチキャストに境界を設ける技術です。
(*, G) join messageを制限するには、以下のコマンドを指定します。
Router(config-if) ip multicast boundary <std_acl>
(S, G) join messageを制限するには、以下のコマンドを指定します。なお、in, outはPIM messageが流れる方向ではなく、マルチキャストのデータパケットが流れる方向を指定します。
Router(config-if) ip multicast boundary <ext_acl> { in | out }
Auto RP messageを制限するには、以下のコマンドを指定します。<std_acl>にはグループアドレスを指定してます。
なお、announce, discoveryの両方を制限する事が可能ですが、誤って、224.0.1.39, 224.0.1.40まで制限しないよう注意して下さい。
Router(config-if) ip multicast boundary <std_acl> filter-autorp
グループアドレスに基づく制限
グループアドレスが、238.0.0.0/8, 239.0.0.0/8である(*, G) joinをR2からR1へ転送しないようにする設定を投入します。
[R2] ip access-list standard BOUNDAY 10 deny 238.0.0.0 1.255.255.255 99 permit any ! interface Ethernet0/0 ip multicast boundary BOUNDAY
マルチキャストルーティングテーブルを削除して、しばらく待ちます。238.0.0.0/8, 239.0.0.0/8に対するshared treeが作成されない事を確認します。
[R1, R2, R3] clear ip mroute * [R1] R1#show ip mroute | i 23[0-9] (*, 237.2.2.2), 00:12:48/00:03:28, RP 10.1.1.1, flags: S (*, 237.1.1.1), 00:12:48/00:02:31, RP 10.1.1.1, flags: S R1#