GREトンネルを使ってマルチキャストを流す
・GREトンネルを使って,マルチキャスト非対応ネットワーク上にマルチキャスト・データを流す
・マルチキャスト・データが,マルチキャスト非対応ルーターを経由して,端末まで配信されていることを確認する
ネットワーク構成(画像を別ウインドウで表示)
RouterAのコンフィグ
!
version 12.2
service timestamps debug uptime
service timestamps log uptime
no service password-encryption
!
hostname RouterA
!
ip multicast-routing ←マルチキャスト・ルーティングを有効にする
!
interface Loopback0
 ip address 172.16.255.1 255.255.255.255
 ip pim sparse-dense-mode
!
interface Tunnel0 ←GREトンネルを作成する
 ip unnumbered Loopback0 ←GREトンネルのアドレスはLoopback0のものを借用する
 ip pim sparse-dense-mode ←このインタフェースでPIM-SDMを有効にする
 tunnel source FastEthernet0/1 ←GREトンネルの始点
 tunnel destination 192.168.3.2 ←GREトンネルの終点(RouterC)
!
interface FastEthernet0/0
 ip address 192.168.1.2 255.255.255.0
 ip pim sparse-dense-mode ←このインタフェースでPIM-SDMを有効にする
 duplex auto
 speed auto
!
interface FastEthernet0/1
 ip address 192.168.2.1 255.255.255.0
 duplex auto
 speed auto
!
router ospf 1
 log-adjacency-changes
 network 0.0.0.0 255.255.255.255 area 0
!
ip pim send-rp-announce Loopback0 scope 9 ←Loopback0をRP候補にする
ip pim send-rp-discovery Loopback0 scope 9 ←Loopback0をRPマッピング・エージェントにする
!
line con 0
line aux 0
line vty 0 4
!
end

RouterBのコンフィグ
!
version 12.2
service timestamps debug uptime
service timestamps log uptime
no service password-encryption
!
hostname RouterB
!
interface Loopback0
 ip address 172.16.255.2 255.255.255.255
!
interface FastEthernet0/0
 ip address 192.168.2.2 255.255.255.0
 duplex auto
 speed auto
!
interface FastEthernet0/1
 ip address 192.168.3.1 255.255.255.0
 duplex auto
 speed auto
!
router ospf 1
 log-adjacency-changes
 network 0.0.0.0 255.255.255.255 area 0
!
line con 0
line aux 0
line vty 0 4
!
end

RouterCのコンフィグ
!
version 12.2
service timestamps debug uptime
service timestamps log uptime
no service password-encryption
!
hostname RouterC
!
ip multicast-routing ←マルチキャスト・ルーティングを有効にする
!
interface Loopback0
 ip address 172.16.255.3 255.255.255.255
 ip pim sparse-dense-mode
!
interface Tunnel0 ←GREトンネルを作成する
 ip unnumbered Loopback0 ←GREトンネルのアドレスはLoopback0のものを借用する
 ip pim sparse-dense-mode ←このインタフェースでPIM-SDMを有効にする
 tunnel source FastEthernet0/0 ←GREトンネルの始点
 tunnel destination 192.168.2.1 ←GREトンネルの終点(RouterA)
!
interface FastEthernet0/0
 ip address 192.168.3.2 255.255.255.0
 duplex auto
 speed auto
!
interface FastEthernet0/1
 ip address 192.168.4.1 255.255.255.0
 ip pim sparse-dense-mode ←このインタフェースでPIM-SDMを有効にする
 duplex auto
 speed auto
!
router ospf 1
 log-adjacency-changes
 network 0.0.0.0 255.255.255.255 area 0
!
ip mroute 192.168.1.0 255.255.255.0 Tunnel0 ←RPFチェック用のルートを作成
ip mroute 172.16.255.1 255.255.255.255 Tunnel0 ←RPFチェック用のルートを作成
!
line con 0
line aux 0
line vty 0 4
!
end
確認
IPマルチキャスト・ネットワークは,IPマルチキャスト対応ルーターをつないで実現します。
しかし,IPマルチキャスト・ネットワークに,非対応ネットワークが挟まっている場合などがあります。
そうした場合,GREトンネルを使って,IPマルチキャスト非対応ルーターに,マルチキャスト・パケットを通します。


●設定の確認
GREトンネル用の論理インタフェースを作ります。
GREトンネルを張るのは,RouterAとRouterCの間です。

RouterAのGREの設定は以下です。
RouterA(config)#interface tunnel 0 ←(1)
RouterA(config-if)#ip unnumbered loopback 0 ←(2)
RouterA(config-if)#ip pim sparse-dense-mode ←(3)
RouterA(config-if)#tunnel source fastEthernet 0/1 ←(4)
RouterA(config-if)#tunnel destination 192.168.3.2 ←(5)
(1) 「Tunnel0」というインタフェースを指定し,GREインタフェースを作成
(2) GREトンネルのアドレスはアンナンバードとし,Loopback0のアドレスを借用
(3) このインタフェースでPIM-SDMを有効
(4) トンネルの始点をFE0/1に指定
(5) トンネルの終点を192.168.3.2(RouterC)に指定
ポイントは,このGREインタフェースでPIMを有効にするところです。

RouterCの設定は以下です。
RouterC(config)#interface tunnel 0
RouterC(config-if)#ip unnumbered loopback 0
RouterC(config-if)#ip pim sparse-dense-mode
RouterC(config-if)#tunnel source fastEthernet 0/0
RouterC(config-if)#tunnel destination 192.168.2.1
RouterC(config-if)#exit
RouterC(config)#ip mroute 192.168.1.0 255.255.255.0 Tunnel0
RouterC(config)#ip mroute 172.16.255.1 255.255.255.255 Tunnel0
上の赤字の設定がGREに関する設定です。
加えてRouterCでは,上の青字の設定が必要です。
ip mrouteコマンドは,RPFチェック用のインタフェースを設定するためのコマンドで,GREトンネル経由でマルチキャスト・パケットを受信する際には欠かせません

<<RPFチェックとは?>>
RPF(Reverse Path Forwarding)チェックとは,マルチキャスト通信で使われる,パケットのループ防止機能です。
マルチキャスト通信においてルーターは,複数のインタフェースから同一のパケットを受信したとき,そのパケットはループしている可能性があると判断します(自分が一度出したパケットが再び自分に戻ってきた)。
そこでルーターは,マルチキャスト・パケットを受信するインタフェースを「配信地点に最も近いインタフェース」の一つに絞ります。
方法は,ユニキャスト・ルーティングテーブルを見て,配信地点にパケットを転送するための出力インタフェースを調べます。
これが,マルチキャスト・パケットを受信したインタフェースと一致するなら,そのパケットは転送します。
逆に,マルチキャスト・パケットを受信したインタフェースと一致しないなら,そのパケットは廃棄します。
つまりRPFチェックとは,「最短経路で来たパケットしか受信しない」というルールというわけです。

今回のケースでは,RouterCは,マルチキャスト・パケットをすべてTunnel0インタフェースから受信します。
しかし,ユニキャスト・ルーティングテーブルを見ると,配信サーバー(192.168.1.1)あての「192.168.1.0/24」と,RPのマッピング・エージェントであるRouterA(172.16.255.1)あての「172.16.1.1」の出力インタフェースは,いずれもFastEthernet0/0です(下の赤字)。
RouterC#show ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       * - candidate default, U - per-user static route, o - ODR
       P - periodic downloaded static route

Gateway of last resort is not set

     172.16.0.0/32 is subnetted, 3 subnets
C       172.16.255.3 is directly connected, Loopback0
O       172.16.255.2 [110/2] via 192.168.3.1, 1d00h, FastEthernet0/0
O       172.16.255.1 [110/3] via 192.168.3.1, 08:50:19, FastEthernet0/0
C    192.168.4.0/24 is directly connected, FastEthernet0/1
O    192.168.1.0/24 [110/12] via 192.168.3.1, 1d00h, FastEthernet0/0
O    192.168.2.0/24 [110/2] via 192.168.3.1, 1d00h, FastEthernet0/0
C    192.168.3.0/24 is directly connected, FastEthernet0/0
ということはつまり,Tunnel0インタフェースでマルチキャスト・パケットを受信しても,RPFチェックをクリアできないため,パケットを廃棄してしまうことになります。
そこで,ip mrouteコマンドを使って,RPFチェック用のインタフェースをTunnel0に指定するわけです。

また,単にデフォルトルートをTunnel0に向けてもOKです。
RouterC(config)#ip mroute 0.0.0.0 0.0.0.0 tunnel 0
ちなみに,以下のように,ユニキャスト・ルーティングテーブルに,ルートを追加してもOKです。
RouterC(config)#ip route 172.16.255.1 255.255.255.255 Tunnel0
RouterC(config)#ip route 192.168.1.1 255.255.255.255 Tunnel0
ちなみに,今回のRouterAのように,Auto-RPを使うにあたって,RP候補とマッピング・エージェントの両方の役割を1台のルーターに担わせることも可能です。


●動作の確認
まずは,PIMのネイバーを確認してみましょう。

RouterAのネイバーは172.16.255.3(RouterC)で,インタフェースは「Tunnel0」になっています。
RouterA#show ip pim neighbor
PIM Neighbor Table
Neighbor          Interface                Uptime/Expires    Ver   DR
Address                                                            Prio/Mode
172.16.255.3      Tunnel0                  01:47:03/00:01:42 v2    1 / S
RouterCのネイバーは172.16.255.1(RouterA)で,インタフェースは「Tunnel0」です。
RouterC#show ip pim neighbor
PIM Neighbor Table
Neighbor          Interface                Uptime/Expires    Ver   DR
Address                                                            Prio/Mode
172.16.255.1      Tunnel0                  01:46:57/00:01:20 v2    1 / S
RouterAとRouterCのお互いが,Tunnel0経由でネイバーになっているのが確認できました。

RouterCでTunnel0インタフェースを確認してみると,GREでIPを運んでいるのがわかります。
RouterC#show interfaces tunnel 0
Tunnel0 is up, line protocol is up
  Hardware is Tunnel
  Interface is unnumbered. Using address of Loopback0 (172.16.255.3)
  MTU 1514 bytes, BW 9 Kbit, DLY 500000 usec,
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation TUNNEL, loopback not set
  Keepalive not set
  Tunnel source 192.168.3.2 (FastEthernet0/0), destination 192.168.2.1
  Tunnel protocol/transport GRE/IP, key disabled, sequencing disabled
  Checksumming of packets disabled,  fast tunneling enabled
  Last input 00:00:02, output 00:00:00, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/0 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     91852 packets input, 125041124 bytes, 0 no buffer
     Received 0 broadcasts, 0 runts, 0 giants, 0 throttles
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
     1089 packets output, 93464 bytes, 0 underruns
     0 output errors, 0 collisions, 0 interface resets
     0 output buffer failures, 0 output buffers swapped out
RouterCで,配信サーバーである192.168.1.1のRPFインタフェースを確認してみましょう。
show ip rpfコマンドを使って調べられます。
RouterC#show ip rpf 192.168.1.1
RPF information for ? (192.168.1.1)
  RPF interface: Tunnel0
  RPF neighbor: ? (172.16.255.1)
  RPF route/mask: 192.168.1.1/0
  RPF type: static
  RPF recursion count: 0
  Doing distance-preferred lookups across tables
RPFインタフェースは「Tunnel0」と表示されました。
ip mrouteコマンドが効いていますね。

では,実際に配信サーバー(192.168.1.1)からマルチキャスト・パケット(239.255.1.1あて)を送信して,受信端末で受信させてみます。
そのときのRouterCのマルチキャスト・ルーティングテーブルを見てみましょう。
RouterC#show ip mroute
IP Multicast Routing Table
Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected,
       L - Local, P - Pruned, R - RP-bit set, F - Register flag,
       T - SPT-bit set, J - Join SPT, M - MSDP created entry,
       X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement,
       U - URD, I - Received Source Specific Host Report
Outgoing interface flags: H - Hardware switched
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode

(*, 239.255.1.1), 00:00:17/00:02:59, RP 172.16.255.1, flags: SJC
  Incoming interface: Tunnel0, RPF nbr 172.16.255.1, Mroute
  Outgoing interface list:
    FastEthernet0/1, Forward/Sparse-Dense, 00:00:17/00:02:46

(192.168.1.1, 239.255.1.1), 00:00:16/00:02:59, flags: CJT
  Incoming interface: Tunnel0, RPF nbr 172.16.255.1, Mroute
  Outgoing interface list:
    FastEthernet0/1, Forward/Sparse-Dense, 00:00:16/00:02:46

(*, 224.0.1.39), 09:38:30/00:02:59, RP 0.0.0.0, flags: D
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Tunnel0, Forward/Sparse-Dense, 09:38:31/00:00:00

(172.16.255.1, 224.0.1.39), 00:02:32/00:00:27, flags: PT
  Incoming interface: Tunnel0, RPF nbr 172.16.255.1, Mroute
  Outgoing interface list: Null

(*, 224.0.1.40), 09:39:09/00:00:00, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Tunnel0, Forward/Sparse-Dense, 09:39:09/00:00:00
    Loopback0, Forward/Sparse-Dense, 09:39:09/00:00:00

(172.16.255.1, 224.0.1.40), 09:38:21/00:02:23, flags: CLT
  Incoming interface: Tunnel0, RPF nbr 172.16.255.1, Mroute
  Outgoing interface list:
    Loopback0, Forward/Sparse-Dense, 09:38:21/00:00:00
マルチキャスト・パケット転送用の(192.168.1.1, 239.255.1.1)エントリと,Auto-RP用の(172.16.255.1, 224.0.1.40)ができています(上の赤字)。
いずれも「Incoming interface」(入力インタフェース)が「Tunnel0」になっており,パケットをGREトンネルで受信しているのがわかります。
ちなみに,ip mrouteコマンドを使うと,「Mroute」という表示が出ます。


●ip mrouteコマンドを設定していない状態を見てみる
では,ip mrouteコマンドを使ってRPFインタフェースを指定していないときのRouterCの様子も見てみましょう。
つまり,下の2行を入れていない状態です。
RouterC(config)#ip mroute 192.168.1.0 255.255.255.0 Tunnel0
RouterC(config)#ip mroute 172.16.255.1 255.255.255.255 Tunnel0
RouterCにおける,配信サーバー(192.168.1.1)のRPFインタフェースを調べてみます。
すると,RP認識していません(下の赤字)。
RouterC#show ip rpf 192.168.1.1
RPF information for ? (192.168.1.1) failed, no route exists
show ip mroute countコマンドを使うと,マルチキャスト・パケットのエラーがわかります。
見ると,Auto-RPで使う224.0.1.39と224.0.1.40の二つで,「RPF failed」(RPF失敗)のカウンタが上がっています(下の赤字)。
RPFエラーがカウントされている
RouterC#show ip mroute count
IP Multicast Statistics
4 routes using 1880 bytes of memory
2 groups, 1.00 average sources per group
Forwarding Counts: Pkt Count/Pkts per second/Avg Pkt Size/Kilobits per second
Other counts: Total/RPF failed/Other drops(OIF-null, rate-limit etc)

Group: 224.0.1.39, Source count: 1, Packets forwarded: 0, Packets received: 6
  Source: 172.16.255.1/32, Forwarding: 0/0/0/0, Other: 6/6/0

Group: 224.0.1.40, Source count: 1, Packets forwarded: 0, Packets received: 4
  Source: 172.16.255.1/32, Forwarding: 0/0/0/0, Other: 4/4/0
debugコマンドを使って細かく調べてみましょう。
すると,224.0.1.39と224.0.1.40の二つで,「not RPF interface」とあり,RPFチェックが失敗していることがわかります(下の赤字)。
RouterC#debug ip mpacket
IP multicast packets debugging is on
RouterC#
16:51:58: IP: s=172.16.255.1 (Tunnel0) d=224.0.1.39 len 48, RPF lookup failed for source
16:51:58: IP: s=172.16.255.1 (Tunnel0) d=224.0.1.39 len 48, not RPF interface
16:54:40: IP: s=172.16.255.1 (Tunnel0) d=224.0.1.40 len 48, RPF lookup failed for source
16:54:40: IP: s=172.16.255.1 (Tunnel0) d=224.0.1.40 len 48, not RPF interface
そこで,まずは以下の1行のコマンドを入れてみます。
Auto-RPで使う224.0.1.39と224.0.1.40の送信元である172.16.1.1(RouterA)のRPFインタフェースをTunnel0にするコマンドです。
RouterC(config)#ip mroute 172.16.255.1 255.255.255.255 Tunnel0
すると上のエラーは止まって,今度は,以下のエラーが怒涛のように出てきました。
16:56:40: IP: s=192.168.1.1 (Tunnel0) d=239.255.1.1 len 1356, RPF lookup failed for source or RP
16:56:40: IP: s=192.168.1.1 (Tunnel0) d=239.255.1.1 len 1356, RPF lookup failed for source or RP
16:56:40: IP: s=192.168.1.1 (Tunnel0) d=239.255.1.1 len 1356, RPF lookup failed for source or RP
16:56:40: IP: s=192.168.1.1 (Tunnel0) d=239.255.1.1 len 1356, RPF lookup failed for source or RP
16:56:40: IP: s=192.168.1.1 (Tunnel0) d=239.255.1.1 len 1356, RPF lookup failed for source or RP
16:56:40: IP: s=192.168.1.1 (Tunnel0) d=239.255.1.1 len 1356, RPF lookup failed for source or RP
これは,配信サーバー(192.168.1.1)が出したマルチキャスト・パケットをRouterCが受信したときに,RPFチェックが失敗していることを表すエラーです。
RouteCは,受信したマルチキャスト・パケット一つひとつに対してRPFチェックをするので,怒涛のようにエラーが出たわけです。

上のip mrouteコマンドを入れたため,RPはきちんと認識できています。
Auto-RPを使って,RPが172.16.255.1(RouterA)であることを認識しています(下の赤字
RouterC#show ip pim rp mapping
PIM Group-to-RP Mappings

Group(s) 224.0.0.0/4
  RP 172.16.255.1 (?), v2v1
    Info source: 172.16.255.1 (?), elected via Auto-RP
         Uptime: 00:04:08, expires: 00:02:49
しかし,配信サーバーから流れてきたパケットはRouterCで廃棄されるため,現在,受信端末で動画は見れない状態というわけです。
試しに,RouterCのマルチキャスト・ルーティングテーブルを見てみると,やはりマルチキャスト・パケット転送用の(192.168.1.1, 239.255.1.1)エントリはできていません。
RouterC#show ip mroute
IP Multicast Routing Table
Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected,
       L - Local, P - Pruned, R - RP-bit set, F - Register flag,
       T - SPT-bit set, J - Join SPT, M - MSDP created entry,
       X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement,
       U - URD, I - Received Source Specific Host Report
Outgoing interface flags: H - Hardware switched
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode

(*, 239.255.1.1), 00:21:10/00:02:53, RP 172.16.255.1, flags: SJC
  Incoming interface: Tunnel0, RPF nbr 172.16.255.1, Mroute
  Outgoing interface list:
    FastEthernet0/1, Forward/Sparse-Dense, 00:01:31/00:02:53

(*, 224.0.1.39), 00:23:35/00:02:23, RP 0.0.0.0, flags: D
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Tunnel0, Forward/Sparse-Dense, 00:23:35/00:00:00

(*, 224.0.1.40), 00:23:59/00:00:00, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Tunnel0, Forward/Sparse-Dense, 00:24:01/00:00:00
    Loopback0, Forward/Sparse-Dense, 00:24:02/00:00:00

(172.16.255.1, 224.0.1.40), 00:08:56/00:02:00, flags: CLT
  Incoming interface: Tunnel0, RPF nbr 172.16.255.1, Mroute
  Outgoing interface list:
    Loopback0, Forward/Sparse-Dense, 00:08:56/00:00:00
そこでさらに,以下の1行のコマンドを追加します。
配信サーバーのアドレスである192.168.1.1のRPFインタフェースをTunnel0にするコマンドです。
RouterA(config)#ip mroute 192.168.1.0 255.255.255.0 Tunnel0
すると,受信端末で動画が再生されるはずです。
GREトンネルを使ったIPマルチキャストでは,RPFインタフェースの設定が欠かせないことが確認できました。


●GRE トンネル経由でのマルチキャスト
http://www.cisco.com/japanese/warp/public/3/jp/service/tac/105/mcast_over_gre-j.shtml

マルチキャスト・ラボ
PIM-DM(デンス・モード)
PIM-SM(スパース・モード)
スイッチオーバー
Auto-RP
Bootstrap Router

GREトンネルを使ってマルチキャストを流す