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를 사용하면 각 라우터에 하나의 터널 인터페이스만 있으면 되며, 필요시 자동으로 새로운 터널을 생성할 수 있다.
| 구분 | 일반 GRE | mGRE |
|---|---|---|
| 터널 방식 | Point-to-Point | Multipoint |
| 인터페이스 수 | 피어당 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 1 | Phase 2 | Phase 3 |
|---|---|---|---|
| 스포크 터널 방식 | Point-to-Point GRE | mGRE | mGRE |
| 스포크 간 직접 통신 | 불가 (허브 경유 필수) | 가능 | 가능 |
| 요약/디폴트 라우트 | 가능 | 불가 (구체적 라우트 필요) | 가능 |
| NHRP 특수 명령 | - | - | ip nhrp redirect (허브), ip nhrp shortcut (스포크) |
| 사용 권장도 | 제한적 (보안 목적 등) | 중간 | 권장 |
참고: Phase 1은 모든 트래픽이 허브를 경유해야 하므로 보안 검사(Inspection) 목적 외에는 잘 사용하지 않는다. Phase 3가 가장 유연하고 확장성이 좋아 실무에서 가장 많이 사용된다.
DMVPN Phase 1 기본 설정
토폴로지
- 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 DMVPN | NHRP 트래픽 인증용 사전 공유 키를 설정한다 (선택이지만 권장) |
ip nhrp map multicast dynamic | 스포크 등록 시 자동으로 멀티캐스트 목적지 목록에 추가한다. 라우팅 프로토콜(RIP, EIGRP, OSPF 등)이 멀티캐스트를 필요로 하므로 중요하다 |
ip nhrp network-id 1 | DMVPN 네트워크를 구분하는 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.1 | NHRP 서버(허브)를 지정한다 |
tunnel destination 192.168.123.1 | Phase 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.2Phase 1 EIGRP 라우팅
각 라우터에 루프백(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-summarySpoke1(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-summarySpoke2(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-summarySplit 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, Tunnel0Phase 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 0OSPF 설정:
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 0Spoke1(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 Tunnel0Phase 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 라우팅
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.255Spoke1(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.255Spoke2(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.255Phase 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 65023Spoke1(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.255Spoke2(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-clientbgp listen range: 지정된 서브넷에서 BGP 연결 요청을 자동 수락한다route-reflector-client: iBGP는 기본적으로 iBGP 네이버로부터 받은 경로를 다른 iBGP 네이버에게 전달하지 않으므로(Split Horizon), 허브를 Route Reflector로 설정하여 스포크 간 경로를 전달한다
Phase 1 라우팅 프로토콜 비교 요약
| 항목 | EIGRP | OSPF | BGP |
|---|---|---|---|
| 주요 이슈 | 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