コンテンツにスキップ

Cisco機器でDMVPN Phase 3を設定する

Cisco IOS / IOS XE ルータ 3 台で、IKEv2 PSK により保護された DMVPN Phase 3 を構成する。

DMVPN の mGRE、NHRP、redirect / shortcut の動作は DMVPNの仕組みとPhase 1・2・3、IKEv2 / IPsec の各設定要素は Cisco IOSのIPsec設定要素 を参照する。


  • Hub 1 台と Spoke 2 台で DMVPN cloud を作る。
  • Hub-Spoke の NHRP 登録を確立する。
  • Spoke 間の最初の通信を Hub 経由で転送する。
  • NHRP redirect / shortcut により、以降の通信を Spoke 間の直接経路へ切り替える。
  • EIGRP または OSPF で各拠点 LAN を広告する。

DMVPN Phase 3のoverlay経路とrouted underlayの関係

上段は Tunnel0 のアドレスを使う DMVPN overlay、下段は mGRE の外側 IP packet を運ぶ routed underlay である。NBMA は Non-Broadcast Multi-Access の略で、この構成では各 GigabitEthernet0/0 のアドレスを NBMA アドレスとして使う。Hub、Spoke1、Spoke2 は異なる WAN access subnet に属し、underlay の IP routing により相互到達する。詳しい意味は UnderlayとNBMAアドレス を参照する。

Hub / NHS の NHS は Next Hop Server である。Spoke は自分の Tunnel / NBMA 対応をこの Hub へ登録し、remote Spoke の NBMA アドレスを解決するときの問い合わせ先として使う。NHS は LAN 経路を配る routing protocol の server ではない。

上段の青い実線は shortcut がない時点の Hub 経由の論理経路、緑の点線は通信開始後に動的に形成される Spoke1 から Spoke2 への shortcut を表す。逆方向の通信にも直接経路が必要なら、Spoke2 側でも対応する NHRP 解決が行われる。どちらの論理経路でも、外側 packet は下段の routed underlay を通り、Tunnel protection により peer ごとの IPsec SA で保護される。


項目 Hub Spoke1 Spoke2
機器 Cisco IOS / IOS XE ルータ Cisco IOS / IOS XE ルータ Cisco IOS / IOS XE ルータ
WANインターフェース GigabitEthernet0/0 GigabitEthernet0/0 GigabitEthernet0/0
NBMAアドレス 203.0.113.2/30 198.51.100.2/30 192.0.2.2/30
Underlay next hop 203.0.113.1 198.51.100.1 192.0.2.1
LANインターフェース GigabitEthernet0/1 GigabitEthernet0/1 GigabitEthernet0/1
LAN側アドレス 192.168.0.1/24 192.168.1.1/24 192.168.2.1/24
Tunnelインターフェース Tunnel0 Tunnel0 Tunnel0
Tunnelアドレス 10.255.0.1/24 10.255.0.11/24 10.255.0.12/24
Router ID 1.1.1.1 2.2.2.2 3.3.3.3
IKEバージョン IKEv2 IKEv2 IKEv2
認証方式 PSK PSK PSK
PSK ChangeMe-StrongKey ChangeMe-StrongKey ChangeMe-StrongKey

WAN / LAN インターフェースの IP アドレスと underlay route は設定済みで、3 台の NBMA アドレスが相互到達可能であることを前提とする。各ルータには、上表の underlay next hop を向く default route または remote NBMA アドレスへの経路が必要である。

DMVPN Tunnel を使わずに、各ルータから他の NBMA アドレスへ ping できることを先に確認する。

Hub で確認する。

ping 198.51.100.2 source GigabitEthernet0/0
ping 192.0.2.2 source GigabitEthernet0/0

Spoke1 で確認する。

ping 203.0.113.2 source GigabitEthernet0/0
ping 192.0.2.2 source GigabitEthernet0/0

Spoke2 で確認する。

ping 203.0.113.2 source GigabitEthernet0/0
ping 198.51.100.2 source GigabitEthernet0/0

以下のコマンドは Cisco IOS / IOS XE の構文に基づく。利用する IOS image により使える暗号方式や細部のキーワードが異なるため、投入前に ? で確認する。



DMVPN の設定は、単独のコマンドではなく次の順序で連携する。

段階 担当 この構成で必要な理由
1. LAN経路を選ぶ EIGRP または OSPF 192.168.2.0/24 への経路と Tunnel 上の next hop を得る
2. peerを解決する NHRP Tunnel / NBMA mapping を解決し、Phase 3 では remote Spoke への next-hop override を作る
3. packetを運ぶ mGRE 1 個の Tunnel0 から、NHRP が決めた複数の peer へ GRE packet を送る
4. packetを保護する IKEv2 / IPsec mGRE packet の peer ごとに SA を作り、暗号化・完全性保護する

たとえば routing protocol だけ動いても、NHRP mapping がなければ mGRE の外側宛先を決められない。NHRP 登録だけ動いても、remote LAN の経路がなければその peer を使う判断ができない。この依存関係を意識して、動作確認も underlay、IPsec、NHRP、routing、shortcut の順で行う。


1. IKEv2とIPsecの共通設定を作成する

Section titled “1. IKEv2とIPsecの共通設定を作成する”

Hub、Spoke1、Spoke2 のすべてに同じ設定を入れる。

固定peer型との違い:remote addressを限定しない

Section titled “固定peer型との違い:remote addressを限定しない”

通常の site-to-site VPN や point-to-point GRE over IPsec では、対向 peer が設定時点で決まっている。固定GRE over IPsecの手順では、Keyring と IKEv2 Profile に対向ルータのアドレスを明示している。

Keyring: address 198.51.100.2
IKEv2 Profile: match identity remote address 198.51.100.2 255.255.255.255

DMVPN では remote peer をすべて事前に列挙できない。

  • Hub は、NHRP Registration を送ってくる複数の Spoke と動的に SA を作る。
  • Spoke は Hub のアドレスを知っているが、Phase 3 shortcut の相手となる remote Spoke の NBMA アドレスは NHRP Resolution 後に初めて分かる。

そのため、この構成では Keyring と IKEv2 Profile の remote address を次のように wildcard にする。

Keyring: address 0.0.0.0 0.0.0.0
IKEv2 Profile: match identity remote address 0.0.0.0 0.0.0.0

Keyring の address は、remote peer に使用する Keyring entry と PSK を選ぶ条件である。IKEv2 Profile の match identity remote address は、remote の IKE identity がアドレスである場合に、その相手へ適用する IKEv2 Profile を選ぶ条件である。選択対象が異なるため、この構成では両方を wildcard にする。

wildcard にしても、すべての宛先トラフィックを無条件に暗号化するわけではない。どの Tunnel traffic を保護するかは tunnel protection ipsec profile が決め、実際の peer は mGRE と NHRP の解決結果から決まる。wildcard が広げるのは、この Keyring entry と IKEv2 Profile に一致できる remote address の範囲である。

ただし、PSK を知る任意の remote address が同じ Keyring entry と Profile に一致できるため、固定 peer 型より認証対象が広い。この構成では全 peer が共通 PSK を使う。通常構成では、証明書認証や peer ごとの認証・認可を検討する。

この wildcard は DMVPN 専用の構文ではなく、remote peer を事前に固定できない VPN でも使われる。

conf t
crypto ikev2 proposal DMVPN-IKEV2-PROPOSAL
encryption aes-cbc-256
integrity sha256
group 14
exit
crypto ikev2 policy DMVPN-IKEV2-POLICY
proposal DMVPN-IKEV2-PROPOSAL
exit
crypto ikev2 keyring DMVPN-IKEV2-KEYRING
peer DMVPN-PEERS
address 0.0.0.0 0.0.0.0
pre-shared-key ChangeMe-StrongKey
exit
exit
crypto ikev2 profile DMVPN-IKEV2-PROFILE
match identity remote address 0.0.0.0 0.0.0.0
authentication remote pre-share
authentication local pre-share
keyring local DMVPN-IKEV2-KEYRING
dpd 10 3 on-demand
exit
crypto ipsec transform-set DMVPN-IPSEC-TS esp-aes 256 esp-sha256-hmac
mode transport
exit
crypto ipsec profile DMVPN-IPSEC-PROFILE
set transform-set DMVPN-IPSEC-TS
set ikev2-profile DMVPN-IKEV2-PROFILE
set pfs group14
exit

pre-shared-key ChangeMe-StrongKey は、自分の認証情報の生成と、相手から受け取った認証情報の検証に同じ PSK を使う設定である。方向ごとに異なる PSK を使う場合は、pre-shared-key local と pre-shared-key remote を分けて設定する。

dpd 10 3 on-demand は任意である。peer から 10 秒間 IKEv2 / IPsec traffic を受信していない状態で送信が必要になると生存確認を行い、応答がなければ 3 秒間隔で再送する。省略しても SA は確立するが、応答しない peer の検出と SA の削除が遅れる場合がある。

DMVPN では mGRE が外側 IP ヘッダーを作るため、IPsec は transport mode で GRE ヘッダー以降を保護する。IPsec 自身による外側 IP ヘッダーをもう一つ追加しない。


全ルータで network-id 100、tunnel key 100、NHRP authentication の文字列 DMVPN100 を使用する。それぞれの値は別の層で機能するため、役割は 三つの識別設定 を参照する。

bandwidth 1000 は EIGRP などが参照する論理帯域幅であり、通信速度を制限しない。ip mtu 1400 と ip tcp adjust-mss 1360 は、この構成における開始値であり、実際の path MTU に合わせて調整する。packet size の考え方は MTUとMSS を参照する。

全ルータの Tunnel0 で no ip redirects を設定し、通常の IPv4 ICMP Redirect 送信を止める。Hub の ip nhrp redirect とは別の機能であり、違いは ICMP RedirectとNHRP Redirectは別物 を参照する。

tunnel protection ipsec profile DMVPN-IPSEC-PROFILE により、NHRP で動的に判明した Hub-Spoke と Spoke-Spoke の peer に IPsec Profile を適用する。


Hub で設定する。

interface Tunnel0
bandwidth 1000
ip address 10.255.0.1 255.255.255.0
no ip redirects
ip mtu 1400
ip nhrp authentication DMVPN100
ip nhrp map multicast dynamic
ip nhrp network-id 100
ip nhrp redirect
ip tcp adjust-mss 1360
tunnel source GigabitEthernet0/0
tunnel mode gre multipoint
tunnel key 100
tunnel protection ipsec profile DMVPN-IPSEC-PROFILE
no shutdown
exit

Hub は NHS として Spoke の NHRP Registration を受け取り、Tunnel / NBMA mapping を動的に学習する。ip nhrp map multicast dynamic は登録済み Spoke を routing protocol の multicast / broadcast 配送先にし、ip nhrp redirect は Phase 3 shortcut の解決を開始させる。登録と shortcut の流れは NHRPの登録と解決 と Phase 3のredirectとshortcut を参照する。


Spoke1 で設定する。

interface Tunnel0
bandwidth 1000
ip address 10.255.0.11 255.255.255.0
no ip redirects
ip mtu 1400
ip nhrp authentication DMVPN100
ip nhrp map 10.255.0.1 203.0.113.2
ip nhrp map multicast 203.0.113.2
ip nhrp nhs 10.255.0.1
ip nhrp network-id 100
ip nhrp shortcut
ip tcp adjust-mss 1360
tunnel source GigabitEthernet0/0
tunnel mode gre multipoint
tunnel key 100
tunnel protection ipsec profile DMVPN-IPSEC-PROFILE
no shutdown
exit

Spoke は起動時から知る Hub の情報だけを静的に設定する。ip nhrp map、ip nhrp map multicast、ip nhrp nhs により Hub への登録・問い合わせを開始し、remote Spoke の mapping は通信開始後に動的に学習する。ip nhrp shortcut は、その解決結果を転送に使用する。各コマンドの関係は SpokeからHubへのマッピング と Phase 3のredirectとshortcut を参照する。


Spoke2 で設定する。

interface Tunnel0
bandwidth 1000
ip address 10.255.0.12 255.255.255.0
no ip redirects
ip mtu 1400
ip nhrp authentication DMVPN100
ip nhrp map 10.255.0.1 203.0.113.2
ip nhrp map multicast 203.0.113.2
ip nhrp nhs 10.255.0.1
ip nhrp network-id 100
ip nhrp shortcut
ip tcp adjust-mss 1360
tunnel source GigabitEthernet0/0
tunnel mode gre multipoint
tunnel key 100
tunnel protection ipsec profile DMVPN-IPSEC-PROFILE
no shutdown
exit

Spoke2 も Spoke1 と同様に、Hub だけを静的に設定する。


5. 動的ルーティングを設定する

Section titled “5. 動的ルーティングを設定する”

EIGRP と OSPF は代替構成である。以下のどちらか一方だけを設定する。

Hub の設定。

interface Tunnel0
no ip split-horizon eigrp 100
exit
router eigrp 100
eigrp router-id 1.1.1.1
passive-interface default
no passive-interface Tunnel0
network 10.255.0.0 0.0.0.255
network 192.168.0.0 0.0.0.255
exit

Spoke1 の設定。

router eigrp 100
eigrp router-id 2.2.2.2
passive-interface default
no passive-interface Tunnel0
network 10.255.0.0 0.0.0.255
network 192.168.1.0 0.0.0.255
exit

Spoke2 の設定。

router eigrp 100
eigrp router-id 3.3.3.3
passive-interface default
no passive-interface Tunnel0
network 10.255.0.0 0.0.0.255
network 192.168.2.0 0.0.0.255
exit

Hub の Tunnel0 だけで split horizon を無効化し、同じ multipoint interface の先にある別 Spoke へ経路を広告できるようにする。Phase 3 では NHRP next-hop override を使うため、Phase 2 向けの no ip next-hop-self eigrp 100 は設定しない。詳しい理由は Hubのsplit horizon と next-hop-selfを残す を参照する。

Hub の設定。

ip prefix-list BLOCK-DMVPN-HOSTS seq 5 deny 10.255.0.0/24 ge 32
ip prefix-list BLOCK-DMVPN-HOSTS seq 10 permit 0.0.0.0/0 le 32
router ospf 10
router-id 1.1.1.1
passive-interface default
no passive-interface Tunnel0
distribute-list prefix BLOCK-DMVPN-HOSTS in
exit
interface Tunnel0
ip ospf network point-to-multipoint
ip ospf 10 area 0
exit
interface GigabitEthernet0/1
ip ospf 10 area 0
exit

Spoke1 の設定。

ip prefix-list BLOCK-DMVPN-HOSTS seq 5 deny 10.255.0.0/24 ge 32
ip prefix-list BLOCK-DMVPN-HOSTS seq 10 permit 0.0.0.0/0 le 32
router ospf 10
router-id 2.2.2.2
passive-interface default
no passive-interface Tunnel0
distribute-list prefix BLOCK-DMVPN-HOSTS in
exit
interface Tunnel0
ip ospf network point-to-multipoint
ip ospf 10 area 0
exit
interface GigabitEthernet0/1
ip ospf 10 area 0
exit

Spoke2 の設定。

ip prefix-list BLOCK-DMVPN-HOSTS seq 5 deny 10.255.0.0/24 ge 32
ip prefix-list BLOCK-DMVPN-HOSTS seq 10 permit 0.0.0.0/0 le 32
router ospf 10
router-id 3.3.3.3
passive-interface default
no passive-interface Tunnel0
distribute-list prefix BLOCK-DMVPN-HOSTS in
exit
interface Tunnel0
ip ospf network point-to-multipoint
ip ospf 10 area 0
exit
interface GigabitEthernet0/1
ip ospf 10 area 0
exit

ip ospf 10 area 0 により、Tunnel0 と LAN 側の GigabitEthernet0/1 を process 10、area 0 へ直接所属させる。ip ospf network point-to-multipoint は Tunnel0 の network type を指定する別の設定である。

passive-interface default と no passive-interface Tunnel0 により、Neighbor を形成するのは Tunnel0 だけになるが、LAN prefix は OSPF へ広告される。各コマンドの一般的な役割は router ospfとip ospfの役割 と OSPF network type を参照する。

全ルータで OSPF network type を point-to-multipoint にそろえる。BLOCK-DMVPN-HOSTS と distribute-list ... in は、OSPF が作る Tunnel subnet 内の /32 host route だけをローカルのルーティングテーブルへ入れないために使用する。prefix-list の各行と in の意味は Tunnel subnetの/32 host routeとdistribute-list を参照する。

in は OSPF が計算した経路をローカルのルーティングテーブルへ入れるときの方向である。out は同じ意味ではなく、この目的の代わりにはならない。

IOS / IOS XE image で使用できる prefix-list のキーワードは、次の CLI help で確認する。

router ospf 10
distribute-list ?

3 台すべてで設定を保存する。

end
write memory

3 台で確認する。

show ip interface brief | include Tunnel0
show interface Tunnel0

Tunnel0 が up/up になることを確認する。mGRE では固定の tunnel destination がないため、Tunnel0 が up/up でも NHRP 登録や remote LAN の到達性まで保証されたわけではない。

Hub で確認する。

show dmvpn
show ip nhrp

Hub が次の動的対応を学習していることを確認する。

10.255.0.11 -> 198.51.100.2
10.255.0.12 -> 192.0.2.2

表示形式や flag 名は IOS image により異なるが、Spoke の entry が dynamic として存在し、NBMA address が正しいことを見る。

Spoke1 と Spoke2 で確認する。

show ip nhrp nhs
show ip nhrp

NHS 10.255.0.1 が応答状態であり、Hub の静的 NHRP entry が 203.0.113.2 を指していることを確認する。

EIGRP を選んだ場合。

show ip eigrp neighbors
show ip route eigrp

OSPF を選んだ場合。

show ip ospf neighbor
show ip route ospf

Hub が両方の Spoke と隣接し、Spoke1 が 192.168.2.0/24、Spoke2 が 192.168.1.0/24 を学習することを確認する。

OSPF では、OSPF 由来の 10.255.0.0/24 内の remote /32 がルーティングテーブルへ入っていないことも確認する。NHRP shortcut を形成した後に H で表示される NHRP route は別物である。

show crypto ikev2 sa
show crypto ipsec sa
show crypto session

Hub-Spoke 通信を流した後、IKEv2 SA が確立し、IPsec の encaps / decaps counter が増えることを確認する。表示項目の読み方は Cisco機器でGRE over IPsecを設定する を参照する。

Spoke1 で、既存の動的 shortcut を消してから状態を確認する場合は次を実行する。

clear ip nhrp shortcut Tunnel0
show ip nhrp shortcut
show ip route next-hop-override

remote Spoke への shortcut がない状態で、Spoke2 LAN 宛の通信を発生させる。

ping 192.168.2.1 source 192.168.1.1 repeat 5
traceroute 192.168.2.1 source 192.168.1.1

続けて確認する。

show dmvpn
show ip nhrp
show ip nhrp shortcut
show ip route next-hop-override
show crypto ipsec sa

期待する変化は次のとおり。

  1. 最初の通信は Hub に向かい、Hub が Spoke2 へ転送する。
  2. Hub が Spoke1 に NHRP Redirect を送る。
  3. Spoke1 が Spoke2 の Tunnel / NBMA 対応を動的に学習する。
  4. Spoke2 LAN に対する next-hop override が作られる。
  5. Spoke1-Spoke2 間の動的 DMVPN peer と IPsec SA が作られる。
  6. 以降の通信は Hub をデータ転送経路にせず、Spoke 間を直接流れる。

shortcut は最初の probe を契機に短時間で作られるため、1 回の traceroute の途中で Hub 経由から直接経路へ変わる場合がある。show ip nhrp shortcut と show ip route next-hop-override を併せて判断する。

古い IOS image で show ip route next-hop-override が使えない場合は、show ip nhrp、show ip nhrp shortcut、show dmvpn を中心に確認する。


症状 確認する場所
Tunnel0 が up/up だが Hub に登録されない NBMA 疎通、IKEv2 / IPsec SA、NHRP authentication、network-id、tunnel key、NHS、Hub mapping
Hub に Spoke が 1 台しか表示されない 各 Spoke の Tunnel / NBMA address 重複、PSK、Hub 到達性
EIGRP neighbor はできるが remote LAN を学習しない Hub Tunnel0 の no ip split-horizon eigrp 100、LAN network statement
OSPF neighbor ができない 全ルータの point-to-multipoint、multicast mapping、passive-interface
OSPFのTunnel /32 が優先される prefix-list と distribute-list、IOS image の構文
remote LANへ到達するが常にHub経由 Hub の ip nhrp redirect、Spoke の ip nhrp shortcut、動的 NHRP entry、next-hop override
NHRP shortcutはあるが暗号化されない Spoke 側を含む wildcard IKEv2 Profile、Tunnel protection、Spoke-Spoke IPsec SA
小さいpingだけ通る Tunnel MTU、TCP MSS、underlay の path MTU、NAT-T
NAT配下のSpoke同士で直接peerを作れない 各NAT装置のPAT動作、UDP 500 / 4500、直接通信を許可できるNAT設計か

トラブルシュートは次の順番で層を分ける。

1. NBMAアドレス間のunderlay疎通
2. IKEv2 / IPsec SA
3. mGRE TunnelとNHRP登録
4. EIGRP / OSPFの隣接関係と経路
5. NHRP redirect / shortcut
6. MTU / MSS

この例は、すべての peer に一致する 1 個の wildcard PSK を使う。Spoke 1 台から PSK が漏れると、DMVPN cloud 全体へ不正参加される可能性がある。管理可能な環境では、IKEv2証明書認証を使うDMVPN Phase 3を検討する。

IKEv1 を使う構成では、Cisco機器でIKEv1 IPsec VPNを設定する の IKEv1 / IPsec 設定要素を mGRE の保護に使用する。NHRP と mGRE の役割は IKEv2 構成と同じである。

Hub を冗長化する場合は、複数 NHS、dual-hub、dual-cloud のどれを使うかを設計し、単一 Hub の Tunnel 設定を単純に複製しない。ルーティング、NHRP priority / cluster、障害検出、return path を含めて確認する。

異なる Spoke が別々の PAT 装置の配下にある場合、Spoke 間の直接 session を確立できないことがある。NAT-T により Hub-Spoke IPsec が成立していても、Phase 3 shortcut の成立は別に確認する。

DMVPN の mGRE では GRE keepalive を使用しない。IKE DPD、NHRP、対応機器の DMVPN tunnel health monitoring などを使って状態を監視する。

暗号方式は機器の対応範囲とポリシーに合わせる。AES-GCM、明示的な PRF、ECDH を使う構成は PRFとAEAD を参照する。