Skip to Content

DMVPN 소개 및 Phase 1

핵심 요약

  • DMVPN(Dynamic Multipoint VPN)은 허브-스포크 VPN 네트워크에서 자동으로 터널을 생성하는 Cisco 기술이다.
  • DMVPN은 mGRE(Multipoint GRE) + NHRP + 라우팅 프로토콜 + IPsec(선택)으로 구성된다.
  • Phase 1: 허브-스포크만 지원하며, 스포크 간 직접 통신이 불가능하다. 스포크는 point-to-point GRE를 사용한다.
  • Phase 2: 스포크 간 직접 터널이 가능하다. 스포크도 mGRE를 사용하며, 구체적 라우트(Specific Route)가 필요하다.
  • Phase 3: 스포크 간 직접 터널 + 요약 라우트(Summary Route)를 지원한다. ip nhrp redirect/ip nhrp shortcut을 사용한다.
  • NHRP는 터널 IP와 공인 IP(NBMA) 매핑을 관리하는 프로토콜이다.
  • Underlay = 공인 네트워크(인터넷), Overlay = GRE 터널 사설 네트워크이다.

DMVPN 개요

DMVPN(Dynamic Multipoint VPN)은 허브-스포크(Hub-and-Spoke) VPN 네트워크에서 자동으로 터널을 생성하는 Cisco 기술이다. 수동으로 모든 라우터 간 터널을 설정할 필요 없이, 스포크 간 직접 통신도 가능하다. DMVPN은 GRE를 터널링에, NHRP(Next Hop Resolution Protocol)를 라우터의 IP 주소 검색에 사용한다. IPsec 암호화를 지원하므로 일반 인터넷 연결을 통해 사이트를 연결하는 데 많이 사용되며, MPLS VPN과 같은 사설 네트워크의 백업 또는 대안으로 적합하다.


DMVPN의 4가지 구성 요소

1. Multipoint GRE (mGRE)

일반 GRE 터널은 point-to-point 방식으로, 각 피어(Peer)마다 별도의 터널 인터페이스를 설정해야 한다. 예를 들어 본사(HQ) 1개와 지사(Branch) 4개가 있고, 일부 지사 간 직접 터널이 필요하다면 많은 수의 GRE 터널 인터페이스를 수동으로 구성해야 하며 확장성이 매우 낮다.

Multipoint GRE(mGRE)는 이름 그대로 **여러 목적지(Multiple Destinations)**를 지원한다. mGRE를 사용하면 각 라우터에 하나의 터널 인터페이스만 있으면 되며, 필요시 자동으로 새로운 터널을 생성할 수 있다.

구분일반 GREmGRE
터널 방식Point-to-PointMultipoint
인터페이스 수피어당 1개전체 1개
확장성낮음높음
설정 명령tunnel destination [IP]tunnel mode gre multipoint

그러나 mGRE를 사용할 때 문제가 하나 있다. 두 지사 라우터가 직접 터널링을 하려면 상대방의 공인 IP 주소를 알아야 하는데, 터널 인터페이스의 사설 IP만 알고 있으므로 외부(Outer) IP 헤더를 채울 수 없다. 이 문제를 해결하기 위해 NHRP가 필요하다.

2. NHRP (Next Hop Resolution Protocol)

NHRP는 터널 IP 주소를 공인 IP 주소(NBMA 주소)로 매핑하는 프로토콜이다. 동작 방식은 다음과 같다:

  • 하나의 라우터가 NHRP 서버(Server) 역할을 한다 (= 허브)
  • 나머지 라우터는 모두 NHRP 클라이언트(Client) 역할을 한다 (= 스포크)
  • NHRP 클라이언트는 서버에 자신의 공인 IP를 등록한다 (NHRP Registration Request)
  • NHRP 서버는 모든 공인 IP를 캐시에 보관한다 (터널 IP <-> NBMA IP 매핑)
  • 다른 라우터와 터널링이 필요하면, NHRP 서버에 해당 라우터의 공인 IP를 질의한다 (NHRP Resolution Request/Reply)

NHRP는 서버-클라이언트 모델을 사용하므로 mGRE의 허브-스포크 토폴로지와 잘 맞는다. 허브가 NHRP 서버, 스포크가 NHRP 클라이언트가 된다.

참고: NHRP 용어에서는 “공인 IP 주소” 대신 NBMA 주소라고 한다. NHRP는 원래 Frame-relay나 ATM과 같은 NBMA 네트워크용으로 개발된 프로토콜이다(RFC 2332, 1998년). ARP가 L2 주소를 L3 주소로 매핑하는 것처럼, NHRP는 터널 IP 주소를 NBMA IP 주소로 매핑한다.

Underlay와 Overlay

구분설명
Underlay 네트워크라우터 간 실제 연결에 사용되는 네트워크 (예: 인터넷, 공인 IP)
Overlay 네트워크GRE 터널로 구성되는 사설 네트워크 (터널 인터페이스 IP)

3. 라우팅 프로토콜 (Routing Protocol)

EIGRP, OSPF, RIP, BGP 등 다양한 라우팅 프로토콜을 사용할 수 있다. Phase에 따라 라우팅 설정 방법이 달라지며, 각 프로토콜별 주의사항이 있다.

4. IPsec (선택)

DMVPN 자체는 암호화를 제공하지 않는다. IPsec을 추가하면 인터넷과 같은 공용 네트워크 위에서 안전한 VPN 구성이 가능하다. IPsec은 필수는 아니지만 권장된다.


DMVPN Phase 비교

항목Phase 1Phase 2Phase 3
스포크 터널 방식Point-to-Point GREmGREmGRE
스포크 간 직접 통신불가 (허브 경유 필수)가능가능
요약/디폴트 라우트가능불가 (구체적 라우트 필요)가능
NHRP 특수 명령--ip nhrp redirect (허브), ip nhrp shortcut (스포크)
사용 권장도제한적 (보안 목적 등)중간권장

참고: Phase 1은 모든 트래픽이 허브를 경유해야 하므로 보안 검사(Inspection) 목적 외에는 잘 사용하지 않는다. Phase 3가 가장 유연하고 확장성이 좋아 실무에서 가장 많이 사용된다.


DMVPN Phase 1 기본 설정

토폴로지

08_DMVPN Phase 1 Basic Configuration_img_p02_01
  • Hub: 192.168.123.1 (underlay), 172.16.123.1 (overlay)
  • Spoke1: 192.168.123.2 (underlay), 172.16.123.2 (overlay)
  • Spoke2: 192.168.123.3 (underlay), 172.16.123.3 (overlay)
  • Underlay 서브넷: 192.168.123.0/24
  • Overlay 서브넷: 172.16.123.0/24

참고: 랩 환경에서는 스위치로 라우터의 GigabitEthernet0/1 인터페이스를 서로 연결한다. 실제 네트워크에서는 ISP에 연결되는 인터페이스이며 공인 IP 주소를 사용한다.

Hub 설정

Hub(config)#interface Tunnel 0 Hub(config-if)#ip address 172.16.123.1 255.255.255.0 Hub(config-if)#tunnel mode gre multipoint Hub(config-if)#tunnel source Gigabit0/1 Hub(config-if)#ip nhrp authentication DMVPN Hub(config-if)#ip nhrp map multicast dynamic Hub(config-if)#ip nhrp network-id 1

각 명령 설명:

명령설명
tunnel mode gre multipoint기본값(point-to-point GRE)을 mGRE로 변경한다. 허브는 반드시 multipoint 설정이 필요하다
tunnel source Gigabit0/1터널의 소스 인터페이스를 지정한다. 목적지는 동적으로 결정된다
ip nhrp authentication DMVPNNHRP 트래픽 인증용 사전 공유 키를 설정한다 (선택이지만 권장)
ip nhrp map multicast dynamic스포크 등록 시 자동으로 멀티캐스트 목적지 목록에 추가한다. 라우팅 프로토콜(RIP, EIGRP, OSPF 등)이 멀티캐스트를 필요로 하므로 중요하다
ip nhrp network-id 1DMVPN 네트워크를 구분하는 ID이다. 로컬 의미만 가지지만 모든 라우터에 동일한 값을 사용하는 것이 트러블슈팅에 유리하다

Spoke 설정 (Phase 1: Point-to-Point GRE)

Spoke1(config)#interface tunnel 0 Spoke1(config-if)#ip address 172.16.123.2 255.255.255.0 Spoke1(config-if)#ip nhrp authentication DMVPN Spoke1(config-if)#ip nhrp map 172.16.123.1 192.168.123.1 Spoke1(config-if)#ip nhrp map multicast 192.168.123.1 Spoke1(config-if)#ip nhrp network-id 1 Spoke1(config-if)#ip nhrp nhs 172.16.123.1 Spoke1(config-if)#tunnel source Gigabit0/1 Spoke1(config-if)#tunnel destination 192.168.123.1

허브와 다른 스포크 전용 명령 설명:

명령설명
ip nhrp map 172.16.123.1 192.168.123.1허브의 터널 IP(172.16.123.1)를 허브의 NBMA IP(192.168.123.1)에 정적 매핑한다. 스포크의 NHRP 캐시에 저장된다
ip nhrp map multicast 192.168.123.1멀티캐스트/브로드캐스트 트래픽을 전달할 목적지를 지정한다. NBMA 주소를 입력해야 한다. 라우팅 프로토콜이 멀티캐스트를 필요로 하므로 필수이다
ip nhrp nhs 172.16.123.1NHRP 서버(허브)를 지정한다
tunnel destination 192.168.123.1Phase 1에서 스포크는 point-to-point GRE를 사용하므로 허브의 NBMA 주소를 명시적으로 지정해야 한다

Spoke2도 동일하게 설정하되, IP 주소만 변경한다:

Spoke2(config)#interface Tunnel0 Spoke2(config-if)#ip address 172.16.123.3 255.255.255.0 Spoke2(config-if)#ip nhrp authentication DMVPN Spoke2(config-if)#ip nhrp map 172.16.123.1 192.168.123.1 Spoke2(config-if)#ip nhrp map multicast 192.168.123.1 Spoke2(config-if)#ip nhrp network-id 1 Spoke2(config-if)#ip nhrp nhs 172.16.123.1 Spoke2(config-if)#tunnel source GigabitEthernet0/1 Spoke2(config-if)#tunnel destination 192.168.123.1

확인 명령

NHRP 등록 확인 (허브에서):

Hub#show dmvpn

출력 예시:

Interface: Tunnel0, IPv4 NHRP Details Type:Hub, NHRP Peers:2, # Ent Peer NBMA Addr Peer Tunnel Add State UpDn Tm Attrb ----- --------------- --------------- ----- -------- ----- 1 192.168.123.2 172.16.123.2 UP 00:22:37 D 1 192.168.123.3 172.16.123.3 UP 00:00:32 D
  • D (Dynamic): 스포크가 동적으로 등록한 매핑임을 나타낸다
  • Peer NBMA Addr: 스포크의 공인(NBMA) IP 주소
  • Peer Tunnel Add: 스포크의 터널 IP 주소

NHRP 캐시 확인:

Hub#show ip nhrp 172.16.123.2/32 via 172.16.123.2 Tunnel0 created 00:04:02, expire 01:55:57 Type: dynamic, Flags: unique registered used nhop NBMA address: 192.168.123.2

Phase 1 EIGRP 라우팅

09_DMVPN Phase 1 EIGRP Routing_img_p01_01

각 라우터에 루프백(Loopback) 인터페이스를 추가하여 EIGRP로 광고한다:

  • Hub: Loopback 0 = 1.1.1.1/32
  • Spoke1: Loopback 0 = 2.2.2.2/32
  • Spoke2: Loopback 0 = 3.3.3.3/32

EIGRP 설정

Hub(config)#router eigrp 123 Hub(config-router)#network 1.1.1.1 0.0.0.0 Hub(config-router)#network 172.16.123.0 0.0.0.255 Hub(config-router)#no auto-summary
Spoke1(config)#router eigrp 123 Spoke1(config-router)#network 172.16.123.0 0.0.0.255 Spoke1(config-router)#network 2.2.2.2 0.0.0.0 Spoke1(config-router)#no auto-summary
Spoke2(config)#router eigrp 123 Spoke2(config-router)#network 172.16.123.0 0.0.0.255 Spoke2(config-router)#network 3.3.3.3 0.0.0.0 Spoke2(config-router)#no auto-summary

Split Horizon 문제

EIGRP는 Distance Vector 프로토콜이므로 Split Horizon 규칙이 적용된다. 허브가 Spoke1로부터 받은 라우트를 같은 인터페이스(Tunnel0)로 Spoke2에 전달하지 않는다. 따라서 스포크 라우터들은 서로의 네트워크를 학습하지 못한다.

해결 방법: 허브의 터널 인터페이스에서 Split Horizon을 비활성화한다:

Hub(config)#interface Tunnel 0 Hub(config-if)#no ip split-horizon eigrp 123

이 설정 후 허브의 라우팅 테이블:

Hub#show ip route eigrp 2.0.0.0/32 is subnetted, 1 subnets D 2.2.2.2 [90/27008000] via 172.16.123.2, Tunnel0 3.0.0.0/32 is subnetted, 1 subnets D 3.3.3.3 [90/27008000] via 172.16.123.3, Tunnel0

Phase 1 OSPF 라우팅

OSPF는 Link-State 프로토콜이므로 모든 스포크가 DMVPN 에어리어(Area)의 완전한 LSDB를 가져야 한다. mGRE 인터페이스에 단일 서브넷을 사용하므로 모든 스포크가 같은 에어리어에 있어야 한다. 라우터 수가 많아지면 LSA 플러딩으로 인해 확장성이 떨어진다.

OSPF 네트워크 타입별 호환성

네트워크 타입Phase 1 호환DR/BDR 선출네이버 자동 발견비고
Point-to-Point불가없음자동기본값이지만 multipoint에서 동작 불가. 네이버가 1개만 허용되어 지속적으로 adjacency가 리셋된다
Broadcast가능있음자동스포크의 priority를 0으로 설정하여 DR/BDR 선출에서 제외해야 한다
Non-Broadcast가능있음수동동작하지만 정적 네이버 설정이 필요하여 동적 스포크의 장점이 사라진다
Point-to-Multipoint권장없음자동가장 권장되는 설정이다. /32 호스트 라우트를 생성한다
Point-to-Multipoint NB가능없음수동정적 네이버 설정이 필요하다

Broadcast 타입 설정 예시

Hub, Spoke1, Spoke2 (config)#interface Tunnel 0 (config-if)#ip ospf network broadcast

스포크가 DR/BDR로 선출되면 안 되므로 priority를 0으로 설정한다:

Spoke1, Spoke2 (config)#interface Tunnel 0 (config-if)#ip ospf priority 0

OSPF 설정:

Hub(config)#router ospf 1 Hub(config-router)#network 172.16.123.0 0.0.0.255 area 0 Hub(config-router)#network 1.1.1.1 0.0.0.0 area 0
Spoke1(config)#router ospf 1 Spoke1(config-router)#network 172.16.123.0 0.0.0.255 area 0 Spoke1(config-router)#network 2.2.2.2 0.0.0.0 area 0

확인:

Hub#show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface 2.2.2.2 0 FULL/DROTHER 00:00:37 172.16.123.2 Tunnel0 3.3.3.3 0 FULL/DROTHER 00:00:32 172.16.123.3 Tunnel0

Phase 1에서는 모든 트래픽이 허브를 경유한다:

Spoke1#traceroute 3.3.3.3 source loopback 0 1 172.16.123.1 7 msec 8 msec 6 msec 2 172.16.123.3 8 msec 9 msec *

참고: Stub Area 또는 Totally Stub Area를 사용하면 DMVPN 네트워크 내 프리픽스 수를 줄여 스포크 라우터의 부담을 경감할 수 있다.


Phase 1 BGP 라우팅

11_DMVPN Phase 1 BGP Routing_img_p02_01

BGP를 DMVPN Phase 1에서 사용하는 방법은 크게 3가지가 있다:

방법 1: eBGP - 스포크마다 다른 AS 번호

Hub(config)#router bgp 65001 Hub(config-router)#neighbor 172.16.123.2 remote-as 65002 Hub(config-router)#neighbor 172.16.123.3 remote-as 65003 Hub(config-router)#network 1.1.1.1 mask 255.255.255.255
Spoke1(config)#router bgp 65002 Spoke1(config-router)#neighbor 172.16.123.1 remote-as 65001 Spoke1(config-router)#network 2.2.2.2 mask 255.255.255.255
Spoke2(config)#router bgp 65003 Spoke2(config-router)#neighbor 172.16.123.1 remote-as 65001 Spoke2(config-router)#network 3.3.3.3 mask 255.255.255.255

Phase 1에서는 모든 트래픽이 허브를 경유하므로, 허브에서 스포크에게 디폴트 라우트만 광고하면 충분하다:

Hub(config)#ip route 0.0.0.0 0.0.0.0 null0 Hub(config)#ip prefix-list DEFAULT_ROUTE permit 0.0.0.0/0 Hub(config)#route-map SPOKE_ROUTERS permit 10 Hub(config-route-map)#match ip address prefix-list DEFAULT_ROUTE Hub(config)#router bgp 65001 Hub(config-router)#network 0.0.0.0 mask 0.0.0.0 Hub(config-router)#neighbor 172.16.123.2 route-map SPOKE_ROUTERS out Hub(config-router)#neighbor 172.16.123.3 route-map SPOKE_ROUTERS out

방법 2: eBGP - 모든 스포크 동일 AS 번호

스포크에 동일한 AS 번호를 사용하면 별도의 필터링 없이도 스포크가 다른 스포크의 경로를 자동으로 거부한다 (BGP Loop Prevention: 자신의 AS 번호가 AS Path에 있으면 거부).

Hub(config)#router bgp 65001 Hub(config-router)#neighbor 172.16.123.2 remote-as 65023 Hub(config-router)#neighbor 172.16.123.3 remote-as 65023
Spoke1(config)#router bgp 65023 Spoke1(config-router)#neighbor 172.16.123.1 remote-as 65001 Spoke1(config-router)#network 2.2.2.2 mask 255.255.255.255
Spoke2(config)#router bgp 65023 Spoke2(config-router)#neighbor 172.16.123.1 remote-as 65001 Spoke2(config-router)#network 3.3.3.3 mask 255.255.255.255

스포크의 라우팅 테이블에는 디폴트 라우트와 허브의 로컬 네트워크만 표시된다:

Spoke1#show ip route bgp B* 0.0.0.0/0 [20/0] via 172.16.123.1 1.0.0.0/32 is subnetted, 1 subnets B 1.1.1.1 [20/0] via 172.16.123.1

방법 3: iBGP + 동적 네이버 (Dynamic Peers)

eBGP의 두 방법은 네이버를 수동으로 지정해야 하므로, 동적 스포크의 장점이 반감된다. iBGP에서는 bgp listen range 명령을 사용하여 동적 네이버를 구성할 수 있다:

Hub(config)#router bgp 65001 Hub(config-router)#bgp listen range 172.16.123.0/24 peer-group SPOKES Hub(config-router)#neighbor SPOKES peer-group Hub(config-router)#neighbor SPOKES remote-as 65001 Hub(config-router)#neighbor SPOKES route-reflector-client
  • bgp listen range: 지정된 서브넷에서 BGP 연결 요청을 자동 수락한다
  • route-reflector-client: iBGP는 기본적으로 iBGP 네이버로부터 받은 경로를 다른 iBGP 네이버에게 전달하지 않으므로(Split Horizon), 허브를 Route Reflector로 설정하여 스포크 간 경로를 전달한다

Phase 1 라우팅 프로토콜 비교 요약

항목EIGRPOSPFBGP
주요 이슈Split Horizon네트워크 타입 선택네이버 수동 지정 (eBGP)
해결 방법no ip split-horizon eigrp (허브 터널)ip ospf network broadcast 또는 point-to-multipoint (권장)동일 AS 사용 또는 iBGP + bgp listen range
확장성중간낮음 (LSA 플러딩)높음
동적 스포크 지원자동 (멀티캐스트)자동 (broadcast/p2mp 타입)bgp listen range 필요 (iBGP)
트래픽 경로허브 경유허브 경유허브 경유

참고 자료

  • 원본: 원본/07_Introduction to DMVPN.pdf
  • 원본: 원본/08_DMVPN Phase 1 Basic Configuration.pdf
  • 원본: 원본/09_DMVPN Phase 1 EIGRP Routing.pdf
  • 원본: 원본/10_DMVPN Phase 1 OSPF Routing.pdf
  • 원본: 원본/11_DMVPN Phase 1 BGP Routing.pdf