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 |