На работе мне заказчик поставил задачу подключить их сеть филиалов к центральному офису посредством различных интернет провайдеров в разных регионах. В Центральном Офисе крутится OSPF, нужно чтоб, также он работал.
Было принято решение реализовать DMVPN. Ниже предоставлю карту подключения, а также конфигурацию устройств с комментариями. Делая впервые обращался к документам cisco:
Resolve IP Fragmentation, MTU, MSS, and PMTUD Issues with GRE and IPSEC
Configuring Dynamic Multipoint VPN (DMVPN) using GRE over IPsec between Multiple Routers
Cisco IOS IP Addressing Services Command Reference
Для проекта использовалось:
Spoke: CISCO881-SEC-K9 IOS Version 15.2(4)M4 (использовалось 12 штук, но в примере указал только 2, т.к. остальные идентичны по конфигурации)
Hub: CISCO2921/K9 IOS Version 15.2(4)M3
Сеть для туннелей: 10.0.0.0 255.255.255.224
Немного теории:
Каждый spoke маршрутизатор имеет статический IPSec туннель до HUB (центральный маршрутизатор).
Каждый spoke регистрируется на сервере NHRP как клиент.
Если spoke A хочет отправить пакет в сеть, которая находится на spoke B, он запрашивает NHRP о реальном внешнем ИП адресе spoke B. Когда он получает ответ поднимается динамический IPSec туннель между Spoke A и Spoke B.
Spoke-to-Spoke туннели строятся поверх интерфейса mGRE (tunnel 10 в нашем случае)

Конфигурация HUB маршрутизатора
! Создаем политику для согласования 1-ой Фазы
crypto isakmp policy 1
encr 3des
hash md5
authentication pre-share
group 2
!
!
!
! Создаем динамический ключ. 0.0.0.0 = любой VPN сервер. Замените значение presharedkey на ваше. Оно должно быть одинаково на всех маршрутизаторах.
!
crypto isakmp key presharedkey address 0.0.0.0
!
!
!
! Создаем политику шифрования для 2-ой фазы
!
crypto ipsec transform-set dmvpn_ts esp-3des esp-md5-hmac
mode transport
!
!
! Создаем профиль IPsec который будет динамически назначается всем нашим туннелям.
!
crypto ipsec profile dmvpn_profile
set transform-set dmvpn_ts
!
!
!
!
! Создаем туннельный интерфейс.
interface Tunnel1
!
! Назначаем ИП адрес. Все наши туннели сидят внутри сети 10.0.0.0 /27
!
ip address 10.0.0.1 255.255.255.224
!
! Отключаем переадресацию ICMP запросов. Это рекомендуется для увеличение безопасности и производительности.
!
no ip redirects
!
! Из-за того, что IPSEC в режиме(transport) использует MTU1440, а GRE добавляет дополнительно 24 байта к заголовку IP-пакета, то наше MTU будет 1440 - 24 = 1416. Если вы используйте режим туннеля в IPsec то MTU рекомендуется ставить 1400. Более детально касательно какое MTU нужно ставить можете прочесть тут:
!
ip mtu 1416
!
! Включаем процесс NHRP на интерфейсе. Номер можете выбрать любой.
!
ip nhrp network-id 2014
!
! Указываем ключ для аутентификации в NHRP. Замените nhrpkey на ваше значение. Должно быть идентично на всех маршрутизаторах.
!
ip nhrp authentication nhrpkey
!
! Указываем, чтобы автоматически добавлялись соответствия ИП адресов spoke маршрутизаторов.
!
ip nhrp map multicast dynamic
!
! Далее конфигурация касающаяся OSPF. Главное что отмечу, приоритет ставлю высокий, чтобы этот маршрутизатор был всегда DR. На всех других приоритет стоит 0. Тип сети указываем Broadcast чтоб не задавать вручную соседей. Значение ospf_key замените на ваше если используете аутентификацию в OSPF.
!
ip ospf authentication message-digest
ip ospf authentication-key ospf_key
ip ospf network broadcast
ip ospf hello-interval 3
ip ospf priority 100
!
! Указываем адрес отправителя. В нашем случае интерфейс смотрящий в интернет.
!
tunnel source Gig0/0
!
! Указываем что данный туннель является mGRE
tunnel mode gre multipoint
!
! Это нужно для идентификации туннеля, параметр не обязательный.
tunnel key 2014
!
! Вешаем наш IPsec профиль
tunnel protection ipsec profile dmvpn_profile
!
!
!
!
!
! Параметры OSPF описывать не буду, т.к. он использовался только проверить работу.
router ospf 10
router-id 1.1.1.1
auto-cost reference-bandwidth 1000
area 0 authentication message-digest
area 192.168.1.0 authentication message-digest
redistribute static subnets
passive-interface default
no passive-interface Tunnel1
network 10.0.0.0 0.0.0.31 area 0
network 192.168.1.0 0.0.0.255 area 192.168.1.0
!
!
! Настройки интерфейсов, они могут быть как физические, так и саб-интерфейсы, или SVI в зависимости от вашего оборудования и топологии сети.
!
interface GigabitEthernet0/0
description [to:isp]
ip address 100.0.1.2 255.255.255.252
!
interface GigabitEthernet0/1
description [to:lan]
ip address 192.168.1.1 255.255.255.0
!
!
! Шлюз по умолчанию
!
ip route 0.0.0.0 0.0.0.0 100.0.1.1
=================================================
Конфигурация Spoke A маршрутизатора
=================================================
crypto isakmp policy 1
encr 3des
hash md5
authentication pre-share
group 2
!
crypto isakmp key presharedkey address 0.0.0.0
!
crypto ipsec transform-set dmvpn_ts esp-3des esp-md5-hmac
mode transport
!
crypto ipsec profile dmvpn_profile
set transform-set dmvpn_ts
!
!
!
!
interface Tunnel1
ip address 10.0.0.2 255.255.255.224
no ip redirects
ip mtu 1416
ip nhrp authentication nhrpkey
! В отличии от HUB тут мы вручную указываем соответствие где 10.0.0.1 ип тонеля HUB маршрутизатора, а 100.0.1.2 его внешний адрес
ip nhrp map 10.0.0.1 100.0.1.2
ip nhrp map multicast 100.0.1.2
ip nhrp network-id 2014
! Адрес HUB маршрутизатора
ip nhrp nhs 10.0.0.1
! Говорим клиентам NHRP не использовать уникальный флаг в запросах NHRP. Т.е. не привязываться к ИП адресам. Если вдруг сменится внешний ИП адрес на HUB маршрутизаторе то все будет работать. Без этой команды выходила бы ошибка.
ip nhrp registration no-unique
!
ip ospf authentication message-digest
ip ospf authentication-key ospf_key
ip ospf network broadcast
ip ospf hello-interval 3
ip ospf priority 0
tunnel source FastEthernet 4
tunnel mode gre multipoint
tunnel key 2014
tunnel protection ipsec profile dmvpn_profile
!
!
!
!
router ospf 10
router-id 2.2.2.2
auto-cost reference-bandwidth 1000
area 0 authentication message-digest
passive-interface default
no passive-interface Tunnel1
network 10.0.0.0 0.0.0.31 area 0
network 192.168.2.0 0.0.0.255 area 192.168.2.0
!
!
! Настройки интерфейсов, они могут быть как физические, так и саб-интерфейсы, или SVI в зависимости от вашего оборудования и топологии сети.
!
interface FastEthernet4
description [to:isp]
ip address 100.0.2.2 255.255.255.252
!
interface vlan 10
description [to:lan]
ip address 192.168.2.1 255.255.255.0
!
!
! Шлюз по умолчанию
ip route 0.0.0.0 0.0.0.0 100.0.2.1
=================================================
Конфигурация Spoke B маршрутизатора
=================================================
crypto isakmp policy 1
encr 3des
hash md5
authentication pre-share
group 2
!
crypto isakmp key presharedkey address 0.0.0.0
!
crypto ipsec transform-set dmvpn_ts esp-3des esp-md5-hmac
mode transport
!
crypto ipsec profile dmvpn_profile
set transform-set dmvpn_ts
!
interface Tunnel1
ip address 10.0.0.3 255.255.255.224
no ip redirects
ip mtu 1416
ip nhrp authentication nhrpkey
ip nhrp map 10.0.0.1 100.0.1.2
ip nhrp map multicast 100.0.1.2
ip nhrp network-id 2014
ip nhrp nhs 10.0.0.1
ip nhrp registration no-unique
ip ospf authentication message-digest
ip ospf authentication-key ospf_key
ip ospf network broadcast
ip ospf hello-interval 3
ip ospf priority 0
tunnel source FastEthernet 4
tunnel mode gre multipoint
tunnel key 2014
tunnel protection ipsec profile dmvpn_profile
!
router ospf 10
router-id 3.3.3.3
auto-cost reference-bandwidth 1000
area 0 authentication message-digest
passive-interface default
no passive-interface Tunnel1
network 10.0.0.0 0.0.0.31 area 0
network 192.168.3.0 0.0.0.255 area 192.168.3.0
!
interface FastEthernet4
description [to:isp]
ip address 100.0.3.2 255.255.255.252
!
interface vlan 10
description [to:lan]
ip address 192.168.3.1 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 100.0.3.1
Далее копируется конфигурация на все spoke маршрутизаторы.
Для проверки можете использовать следующие команды:
- show dmvpn
- show crypto engine connection active
- show crypto ipsec sa
- show crypto isakmp sa
Ниже скрин проверки с маршрутизатора Spoke_A

Для поиска неисправностей будут полезны следующие команды:
- debug crypto ipsec
- debug crypto isakmp
- debug crypto engine
.
Если вам статья показалась полезной не забывайте оценивать ее.
Внимание. Если вы нашли ошибку в тексте прошу вас сообщить о ней мне.