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#
 
  
  
  
  