【DMVPN】フェーズ1をわかりやすく解説

DMVPN には、フェーズ1〜3の3つの動作モードがあります。この記事ではフェーズ1を取り上げ、Cisco ルータ4台の検証構成で設定と動作を確かめます。

フェーズ1では、スポークが NHRP を使って自分のアドレスをハブに登録し、ハブはマルチポイント GRE(mGRE)の1つのトンネルインターフェースで全スポークとつながります。スポーク側のトンネルはハブ宛ての固定のトンネルなので、スポーク同士が直接トンネルを張ることはありません。スポーク間の通信はすべてハブで折り返すため、スポークが増えるほどハブの処理負荷が高くなります。

この記事でわかること
  1. アンダーレイ(R2・R3・R5・R6)を設定し、ハブからスポークまで届くことを確かめる
  2. ハブ(R2)に mGRE のトンネルを作る
  3. スポーク(R5)にハブ宛てのトンネルを作り、NHRP でハブに登録する
  4. 2台目のスポーク(R6)を同じ形で追加する
  5. スポーク間の通信がハブを折り返すことをキャプチャで確かめる

DMVPN フェーズ1の仕組み

DMVPN は、mGRE と NHRP を組み合わせて、多数の拠点を1つのオーバーレイネットワークにまとめる仕組みです。mGRE と NHRP そのものの説明は 【DMVPN】mGRE、NHRPの概要をわかりやすく解説 にまとめています。

アンダーレイ GRE トンネルGRE トンネル ハブNHS スポーク1NHC スポーク2NHC
図1 DMVPN フェーズ1の構成(トンネルはハブと各スポークの間だけ)

NHRP で扱うアドレスは2種類あります。トンネルを運ぶ外側のアドレスを NBMA アドレス、トンネルインターフェースに付けたアドレスをトンネルアドレスと呼びます。ハブは NHS(ネクストホップサーバ)として、各スポークから登録された「トンネルアドレスと NBMA アドレスの対応」を NHRP テーブルに持ちます。

用語この記事の構成での例意味
NBMA アドレス169.254.35.5(R5)トンネルの送信元になる、アンダーレイ側のアドレス
トンネルアドレス192.168.0.5(R5)トンネルインターフェースに設定したオーバーレイ側のアドレス
NHSR2(ハブ)スポークの登録を受け付け、アドレスの対応を管理するサーバ
NHCR5、R6(スポーク)NHS に自分のアドレスを登録する NHRP クライアント

3つのフェーズの違いは、スポーク間の通信をどう扱うかです。

フェーズスポークのトンネルスポーク間の通信
フェーズ1ハブ宛ての GRE(tunnel destination を指定)常にハブを経由する
フェーズ2mGRENHRP で相手を解決し、スポーク間に動的なトンネルを張る
フェーズ3mGREフェーズ2の仕組みに、ハブからのリダイレクトとショートカットを加えて拡張性を高めたもの

検証構成

R2 がハブ、R5 と R6 がスポークです。R3 はアンダーレイ(インターネットの代わり)のルータで、DMVPN の設定はしません。トンネルアドレスは 192.168.0.0/24 で、末尾をルータ番号にそろえています。

アンダーレイ 169.254.23.0/24 .2.3 169.254.35.0/24 169.254.36.0/24 .3.3 .5.6 Tu0 .2Tu0 .5Tu0 .6 オーバーレイ 192.168.0.0/24 R2ハブ R3 R5スポーク1 R6スポーク2
図2 検証構成(灰色の線がアンダーレイ、紺の破線がトンネル)
補足

この検証では、トンネルの動きを見やすくするため IPsec を使わず、GRE だけで構成しています。実際の DMVPN ではトンネルを IPsec で保護(tunnel protection ipsec profile)し、あわせて ip mtu 1400 と ip tcp adjust-mss 1360 を設定する構成が Cisco の設定ガイドで案内されています。

アンダーレイの設定

アンダーレイのアドレスとルートを設定する

まず、トンネルを運ぶアンダーレイネットワークを作ります。アンダーレイは 169.254.0.0/16 の範囲のサブネットで構成し、各ルータの間で疎通できれば準備完了です。R2・R5・R6 は、アンダーレイ全体(169.254.0.0/16)への経路を R3 に向けています。

R2

R2(config)#interface FastEthernet0/0.23
R2(config-subif)# encapsulation dot1Q 23
R2(config-subif)# ip address 169.254.23.2 255.255.255.0
R2(config-subif)#exit
R2(config)#ip route 169.254.0.0 255.255.0.0 169.254.23.3

R3

R3(config)#interface FastEthernet0/0.23
R3(config-subif)# encapsulation dot1Q 23
R3(config-subif)# ip address 169.254.23.3 255.255.255.0
R3(config)#interface FastEthernet0/0.35
R3(config-subif)# encapsulation dot1Q 35
R3(config-subif)# ip address 169.254.35.3 255.255.255.0
R3(config)#interface FastEthernet0/0.36
R3(config-subif)# encapsulation dot1Q 36
R3(config-subif)# ip address 169.254.36.3 255.255.255.0

R5

R5(config)#interface FastEthernet0/0.35
R5(config-subif)# encapsulation dot1Q 35
R5(config-subif)# ip address 169.254.35.5 255.255.255.0
R5(config-subif)#exit
R5(config)#ip route 169.254.0.0 255.255.0.0 169.254.35.3

R6

R6(config)#interface FastEthernet0/0.36
R6(config-subif)# encapsulation dot1Q 36
R6(config-subif)# ip address 169.254.36.6 255.255.255.0
R6(config-subif)#exit
R6(config)#ip route 169.254.0.0 255.255.0.0 169.254.36.3

ping:ハブからスポークのアンダーレイに届くか

ハブの R2 から、R5 と R6 のアンダーレイ側のアドレスへ ping します。ここが通らないと、トンネルも NHRP の登録も成り立ちません。

R2

R2#ping 169.254.35.5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 169.254.35.5, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/36/48 ms
R2#ping 169.254.36.6
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 169.254.36.6, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/24/44 ms

ハブルータ(R2)の設定

ハブに mGRE のトンネルを作る

ハブのトンネルインターフェースを設定します。ポイントは、tunnel destination を書かずに tunnel mode gre multipoint(mGRE)にしていることです。これで1つのトンネルインターフェースで複数のスポークを受け入れられます。宛先の NBMA アドレスは、スポークから届く NHRP の登録で分かります。

R2

R2(config)#interface Tunnel0
R2(config-if)# ip address 192.168.0.2 255.255.255.0
R2(config-if)# ip nhrp authentication DMVPNPWD
R2(config-if)# ip nhrp map multicast dynamic
R2(config-if)# ip nhrp network-id 1
R2(config-if)# tunnel source 169.254.23.2
R2(config-if)# tunnel mode gre multipoint

通常の GRE トンネルの設定(アドレス、tunnel source)に加えて、ハブで使っている DMVPN の設定は次のとおりです。

コマンド説明
tunnel mode gre multipointトンネルを mGRE にします。宛先を固定しないので、登録してきたスポークすべてとこのインターフェースで通信できます。
ip nhrp map multicast dynamic登録してきたスポークを、マルチキャストの送り先に自動で加えます。スポークの NBMA アドレスを1台ずつ静的に書かなくても、OSPF や EIGRP などのマルチキャストを使うルーティングプロトコルのパケットを各スポークへ送れます。
ip nhrp network-id 1インターフェースで NHRP を有効にし、どの NHRP ネットワークに属するかを示す ID を付けます。ID はそのルータの中だけで意味を持つ値で、対向と違っていても動作します。この記事では全ルータで 1 にそろえています。
ip nhrp authentication DMVPNPWDNHRP の認証文字列を設定します(任意)。設定する場合は、同じ DMVPN に参加するハブとスポークのすべてで同じ文字列にします。
現在のバージョンでは

Cisco IOS XE Denali 16.3 以降では、ip nhrp map multicast dynamic は既定で有効になっています。この記事の検証環境では明示的に設定しています。

スポーク1(R5)の設定

スポークにハブ宛てのトンネルを作る

スポークの R5 を設定します。フェーズ1のスポークは、tunnel destination でハブの NBMA アドレスを指定した、ふつうの GRE トンネルです(tunnel mode は既定の GRE のまま)。トンネルの行き先がハブに固定されるので、スポーク間の通信もすべてハブへ送られます。

R5

R5(config)#interface Tunnel0
R5(config-if)# ip address 192.168.0.5 255.255.255.0
R5(config-if)# ip nhrp authentication DMVPNPWD
R5(config-if)# ip nhrp map 192.168.0.2 169.254.23.2
R5(config-if)# ip nhrp map multicast 169.254.23.2
R5(config-if)# ip nhrp network-id 1
R5(config-if)# ip nhrp nhs 192.168.0.2
R5(config-if)# tunnel source 169.254.35.5
R5(config-if)# tunnel destination 169.254.23.2

通常の GRE トンネルの設定に加えて、スポークで使っている DMVPN の設定は次のとおりです(ip nhrp authentication と ip nhrp network-id はハブと同じ意味です)。

コマンド説明
ip nhrp map 192.168.0.2 169.254.23.2ハブのトンネルアドレス(192.168.0.2)とハブの NBMA アドレス(169.254.23.2)の対応を静的に登録します。
ip nhrp map multicast 169.254.23.2このトンネルから送るマルチキャストの送り先を、ハブの NBMA アドレスにします。指定するのはトンネルアドレスではなく NBMA アドレスです。OSPF などのルーティングプロトコルをハブと動かすときに必要です。
ip nhrp nhs 192.168.0.2NHS(ハブ)をトンネルアドレスで指定します。R5 はこの宛先へ NHRP の登録を送ります。
tunnel destination 169.254.23.2トンネルの宛先をハブの NBMA アドレスに固定します。フェーズ1のスポークの形です。

トンネルのアップと show dmvpn:ハブに登録されたか

R2 と R5 の設定が終わると、R5 のトンネルインターフェースがアップします。

R5

%LINEPROTO-5-UPDOWN: Line protocol on Interface Tunnel0, changed state to up

R2 で show dmvpn を実行し、R5 が登録されているかを確認します。

R2

R2#show dmvpn
Legend: Attrb --> S - Static, D - Dynamic, I - Incomplete
        N - NATed, L - Local, X - No Socket
        # Ent --> Number of NHRP entries with same NBMA peer
        NHS Status: E --> Expecting Replies, R --> Responding, W --> Waiting
        UpDn Time --> Up or Down Time for a Tunnel
==============================================================


Interface: Tunnel0, IPv4 NHRP Details
Type:Hub, NHRP Peers:2,


# Ent  Peer NBMA Addr Peer Tunnel Add State  UpDn Tm Attrb
----- --------------- --------------- ----- -------- -----
     1 169.254.35.5        192.168.0.5    UP 00:12:30     D
表示意味
Type:Hubこのルータがハブとして動いていることを示します。
Peer NBMA Addrスポークの NBMA アドレス(169.254.35.5)です。
Peer Tunnel Addスポークのトンネルアドレス(192.168.0.5)です。NBMA アドレスとの対応がとれています。
State UPこのスポークとの NHRP のやり取りができている状態です。
Attrb DDynamic、つまりスポークからの登録で動的に作られたエントリです。

パケットキャプチャ:NHRP の登録の中身

R5 が送った NHRP Registration Request をキャプチャで見てみます。キャプチャは R5 と R3 の間(VLAN 35)で取ったものです。NHRP は GRE でカプセル化され、外側の IP ヘッダはアンダーレイのアドレス(R5 → R2)になっています。

R5スポーク(NHC) R2ハブ(NHS) ① NHRP Registration Request NBMA 169.254.35.5 とトンネル 192.168.0.5 の対応を登録 ② NHRP Registration Reply R2 の NHRP テーブルに R5 が入る(show dmvpn の Attrb が D)
図3 スポークからハブへの NHRP 登録の流れ
画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

パケットキャプチャ(Wireshark):R5 → R2画面イメージ
▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 351▸ Internet Protocol Version 4, Src: 169.254.35.5, Dst: 169.254.23.2▸ Generic Routing Encapsulation (NHRP)2▾ Next Hop Resolution Protocol (NHRP Registration Request)  ▸ NHRP Fixed Header  ▾ NHRP Mandatory Part      Source Protocol Len: 4      Destination Protocol Len: 43    ▸ Flags: 0x8002, Uniqueness Bit, Cisco NAT Supported      Request ID: 0x00010004 (65540)4      Source NBMA Address: 169.254.35.5      Source Protocol Address: 192.168.0.5      Destination Protocol Address: 192.168.0.2    ▸ Client Information Entry  ▸ Responder Address Extension  ▸ Forward Transit NHS Record Extension  ▸ Reverse Transit NHS Record Extension  ▸ NHRP Authentication Extension  ▸ Cisco NAT Address Extension  ▸ End of Extension
図4 NHRP Registration Request の中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Src: 169.254.35.5, Dst: 169.254.23.2外側の IP ヘッダです。R5 の NBMA アドレスから、ハブの NBMA アドレス(ip nhrp map で登録した値)へ送っています。
2NHRP Registration Requestスポークからハブへの登録要求です。
3Uniqueness Bitこのトンネルアドレスの登録が一意であることを示すフラグです。Cisco ルータでは既定で付きます。
4Source NBMA Address ほか自分の NBMA アドレス(169.254.35.5)とトンネルアドレス(192.168.0.5)を、NHS のトンネルアドレス(192.168.0.2)に知らせています。

これに対して、R2 は NHRP Registration Reply を返します。Reply は Request をもとに作られるため、NHRP の中のアドレス(Source NBMA Address など)は Request と同じ値のままで、外側の IP ヘッダだけが R2 → R5 の向きになります。

パケットキャプチャ(Wireshark):R2 → R5画面イメージ
▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 351▸ Internet Protocol Version 4, Src: 169.254.23.2, Dst: 169.254.35.5▸ Generic Routing Encapsulation (NHRP)2▾ Next Hop Resolution Protocol (NHRP Registration Reply)  ▸ NHRP Fixed Header  ▾ NHRP Mandatory Part      Source Protocol Len: 4      Destination Protocol Len: 4    ▸ Flags: 0x8002, Uniqueness Bit, Cisco NAT Supported      Request ID: 0x00010005 (65541)3      Source NBMA Address: 169.254.35.5      Source Protocol Address: 192.168.0.5      Destination Protocol Address: 192.168.0.2    ▸ Client Information Entry  ▸ Responder Address Extension  ▸ Forward Transit NHS Record Extension  ▸ Reverse Transit NHS Record Extension  ▸ NHRP Authentication Extension  ▸ Cisco NAT Address Extension  ▸ End of Extension
図5 NHRP Registration Reply の中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Src: 169.254.23.2, Dst: 169.254.35.5外側の IP ヘッダは、ハブからスポークへの向きです。
2NHRP Registration Replyハブからの登録応答です。
3Source NBMA Address ほかRequest と同じ値です。どのスポークの登録に対する応答かを表しています。

スポーク2(R6)の設定

2台目のスポークを追加する

スポーク2の設定は、スポーク1の設定のうち、トンネルインターフェースの IP アドレスと tunnel source のアドレスを変えるだけです。ハブ側の設定は変える必要がありません。

R6

R6(config)#interface Tunnel0
R6(config-if)# ip address 192.168.0.6 255.255.255.0
R6(config-if)# ip nhrp authentication DMVPNPWD
R6(config-if)# ip nhrp map 192.168.0.2 169.254.23.2
R6(config-if)# ip nhrp map multicast 169.254.23.2
R6(config-if)# ip nhrp network-id 1
R6(config-if)# ip nhrp nhs 192.168.0.2
R6(config-if)# tunnel source 169.254.36.6
R6(config-if)# tunnel destination 169.254.23.2

R2 で show dmvpn を実行し、R6 も登録されたことを確認します。

R2

R2#show dmvpn
Legend: Attrb --> S - Static, D - Dynamic, I - Incomplete
        N - NATed, L - Local, X - No Socket
        # Ent --> Number of NHRP entries with same NBMA peer
        NHS Status: E --> Expecting Replies, R --> Responding, W --> Waiting
        UpDn Time --> Up or Down Time for a Tunnel
=========================================================


Interface: Tunnel0, IPv4 NHRP Details
Type:Hub, NHRP Peers:2,


# Ent  Peer NBMA Addr Peer Tunnel Add State  UpDn Tm Attrb
----- --------------- --------------- ----- -------- -----
     1 169.254.35.5        192.168.0.5    UP 00:12:30     D
     1 169.254.36.6        192.168.0.6    UP 00:00:18     D

R5 に加えて R6 のエントリ(NBMA アドレス 169.254.36.6、トンネルアドレス 192.168.0.6)が、State UP、Attrb D で並んでいます。

疎通試験

オーバーレイで疎通を確かめる

これで DMVPN によるオーバーレイネットワーク(192.168.0.0/24)ができました。R2(ハブ)から R5、R6(スポーク)のトンネルアドレスへ ping します。

R2

R2#ping 192.168.0.5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.5, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/33/40 ms
R2#ping 192.168.0.6
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.6, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 40/43/48 ms

次に、スポーク間の通信として R6 から R5 へ ping します。

R6

R6#ping 192.168.0.5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.5, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 52/67/92 ms

パケットキャプチャ:スポーク間の通信はハブを折り返す

R6 から R5 への ping を R2(ハブ)でキャプチャすると、ping 1往復で4つのパケットが見えます。同じ Echo request が2回出ているのは、R6 から届いたパケットと、R2 が R5 へ転送したパケットの両方を見ているからです。2回目は R2 がルーティングした分だけ TTL が1つ減っています。

パケットキャプチャ(Wireshark):R2 で取得画面イメージ
No.SourceDestinationProtocolInfo
1192.168.0.6192.168.0.5ICMPEcho (ping) request id=0x0009, seq=0/0, ttl=255
2192.168.0.6192.168.0.5ICMPEcho (ping) request id=0x0009, seq=0/0, ttl=254
3192.168.0.5192.168.0.6ICMPEcho (ping) reply id=0x0009, seq=0/0, ttl=255
4192.168.0.5192.168.0.6ICMPEcho (ping) reply id=0x0009, seq=0/0, ttl=254
192.168.0.6192.168.0.5ICMPEcho (ping) request id=0x0009, seq=1/256, ttl=255
192.168.0.6192.168.0.5ICMPEcho (ping) request id=0x0009, seq=1/256, ttl=254
192.168.0.5192.168.0.6ICMPEcho (ping) reply id=0x0009, seq=1/256, ttl=255
192.168.0.5192.168.0.6ICMPEcho (ping) reply id=0x0009, seq=1/256, ttl=254
図6 R6 → R5 の ping を R2 で見たところ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1request ttl=255R6 が送った Echo request が R2 に届いたところです。
2request ttl=254R2 が R5 へ転送した同じパケットです。R2 を1ホップ通ったので TTL が1減っています。
3reply ttl=255R5 が返した Echo reply が R2 に届いたところです。
4reply ttl=254R2 が R6 へ転送した Echo reply です。
スポーク間の直接のトンネルはない ① Echo requestTTL 255 ② ハブが転送TTL 254 R2ハブ R6192.168.0.6 R5192.168.0.5
図7 スポーク間の通信はハブ(R2)を経由する(Echo reply も同じ道を逆にたどる)

このように、フェーズ1ではスポーク同士が同じ 192.168.0.0/24 にいても、通信は必ずハブを通ります。スポーク間で直接トンネルを張れるようにしたのがフェーズ2です。

うまくいかないときの切り分け

状態よくある原因確認すること
スポークのトンネルがアップしないアンダーレイでハブの NBMA アドレスに届かないスポークから tunnel destination のアドレスへ ping する。経路(STEP 1 のスタティックルート)を確認する
ハブの show dmvpn にスポークが出ないip nhrp map や ip nhrp nhs のアドレスの誤り、NHRP 認証文字列の不一致スポークの show running-config interface Tunnel0 と、ハブとの認証文字列を見比べる
ハブからスポークのトンネルアドレスに ping が通らないハブにそのスポークの NHRP エントリがないハブで show dmvpn や show ip nhrp を実行し、対象のトンネルアドレスのエントリがあるか見る
OSPF などのネイバーがスポークと張れないマルチキャストの送り先がないハブの ip nhrp map multicast dynamic、スポークの ip nhrp map multicast(NBMA アドレスを指定しているか)を確認する

まとめ

フェーズ1では、ハブだけが mGRE で、スポークはハブ宛ての GRE トンネルを持ちます。スポークは NHRP でハブに登録し、スポーク間の通信はハブを折り返します。

設定ハブ(R2)スポーク(R5・R6)
トンネルの形tunnel mode gre multipointtunnel destination(ハブの NBMA アドレス)
NHRP の有効化ip nhrp network-idip nhrp network-id
NHS の指定―ip nhrp nhs(ハブのトンネルアドレス)
アドレスの対応スポークからの登録で動的に作るip nhrp map(ハブの分を静的に書く)
マルチキャストip nhrp map multicast dynamicip nhrp map multicast(ハブの NBMA アドレス)
認証(任意)ip nhrp authenticationip nhrp authentication(ハブと同じ文字列)

コメント