вторник, 17 июня 2014 г.

DMVPN Basic Example


Дано:
Классическая схема DMVPN -- HUB and SPOKE
R1 -- центральный офис и логический HUB
R3, R4 -- региональные офисы логические SPOKE
R2 -- имитация интернет, с маршрутизацией типа OSPF 77
Loopback интерфейсы прописываются для упрощённой настройки OSPF (RouterID)

Схема упрощена до базового концепта DMVPN типа HUB-SPOKE,
т.е. у филиалов присутствуют белые IP и отсутствует NAT
каждая логическая единица схемы имеет только одного провайдера
вместо BGP используется OSPF ( как вариант можно было бы ещё упростить до default-gateway )

Задача:
Настроить DMVPN типа point-to-multipoint с поддержкой логических mGRE тоннелей с поддержкой шифрования IPSec
Настроить днамическую маршрутизацию между ними объединяя их в одну логическую сеть
Создать эту систему таким образом чтобы добавление нового SPOKE узла требовало настройки только с его стороны





Решение:

Теоретический базис


В основе DMVPN лежат несколько технологий:

    mGRE-туннели - (m – сокращение от multipoint);
    Протокол NHRP (Next Hop Resolution Protocol) http://tools.ietf.org/html/rfc2332;
    Протоколы динамической маршрутизации;
    Профили IPsec (IPsec profiles).


Технология DMVPN позволяет решить задачу масштабируемым методом,
чем создание связей точка-точка между всеми офисами и объединения их в полносвязную топологию:

При добавлении новых маршрутизаторов в существующую сеть DMVPN, необходимо настроить только новый маршрутизатор,
изменений на уже существующих маршрутизаторах не требуется. DMVPN позволяет использовать динамически назначенные
IP-адреса на spoke-маршрутизаторах.
Если двум spoke-маршрутизаторам необходимо установить туннель напрямую, то он устанавливается динамически.

В отличие от классического point-to-point GRE  – Виртуальный интерфейс mGRE работает аналогично интерфейсу point-to-multipoint Frame Relay.
Тем самым позволяя в рамках одной L2 сети объединить много устройств. 

NHRP в свою очередь является сопутствующим механизмом,
позволяющим установить соответствие между реальными физическими IP адресами маршрутизаторов, и их виртуальными туннельными адресами.
Маршрутизаторы могут выступать в роли NHRP серверов,  и NHRP клиентов.
Первыми являются Hub-маршрутизаторы.  Они выстраивают динамическую таблицу соответствия реальных и виртуальных адресов по мере регистрации Spoke-маршрутизаторов. 
И распространяют эту информацию по всем Spoke-м.


Практический концепт

1) настраиваем базовые параметры интерфейсов и OSPF маршрутизации

R1(config)#interface loopback 1
R1(config-if)#ip add 10.0.0.1 255.255.255.255
R1(config-if)#no sh
R1(config-if)#exit

R1(config)#int fa 0/0
R1(config-if)#ip add 100.0.0.2 255.255.255.0
R1(config-if)#no sh

---

R2(config)#int fa 0/0
R2(config-if)#ip add 100.0.0.1 255.255.255.0
R2(config-if)#no sh

R2(config)#int loopback 1
R2(config-if)#ip add 10.0.0.4 255.255.255.255
R2(config-if)#no sh
R2(config-if)#exit

R2(config)#int fa 0/1
R2(config-if)#ip add 200.1.1.1 255.255.255.0
R2(config-if)#no sh
R2(config-if)#exit

R2(config)#int fa 1/0
R2(config-if)#ip add 200.2.2.1 255.255.255.0
R2(config-if)#no sh

---

R3(config)#int fa 0/0
R3(config-if)#ip add 200.1.1.2 255.255.255.0
R3(config-if)#no sh
R3(config-if)#exit

R3(config)#int fa 0/1
R3(config-if)#ip add 10.0.2.1 255.255.255.0
R3(config-if)#no sh


R3(config)#int loopback 1
R3(config-if)#ip add 10.0.0.2 255.255.255.255
R3(config-if)#no sh
R3(config-if)#exit

---

R4(config)#int fa 0/0
R4(config-if)#ip add 200.2.2.2 255.255.255.0
R4(config-if)#no sh

R4(config)#int fa 0/1
R4(config-if)#ip add 10.0.3.0 255.255.255.0
R4(config-if)#ip add 10.0.3.1 255.255.255.0
R4(config-if)#no sh


R4(config)#int loopback 1
R4(config-if)#ip add 10.0.0.3 255.255.255.255
R4(config-if)#no sh
R4(config-if)#exit

--------------------------------------------------------------

2) настраиваем параметры OSPF маршрутизации в сторону имитации интернета

R1(config)#router ospf 77
R1(config-router)#network 100.0.0.0 0.0.0.255 area 0
R1(config-router)#exit

R2(config)#router ospf 77
R2(config-router)#network 100.0.0.0 0.0.0.255 area 0
R2(config-router)#network 200.1.1.0 0.0.0.255 area 0
R2(config-router)#network 200.2.2.0 0.0.0.255 area 0
R2(config-router)#

R3(config)#router ospf 77
R3(config-router)#network 200.1.1.0 0.0.0.255 area 0
R3(config-router)#exit

R4(config)#router ospf 77
R4(config-router)#network 200.2.2.0 0.0.0.255 area 0
R4(config-router)#exit

--------------------------------------------------------------


--------------------------------------------------------------

3) Настраиваем mGRE интерфейсы
Для поднятия логического пространства mGRE будем использовать подсеть 192.168.0.0/24

R1(config)#interface Tunnel1
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip mtu 1400

Задаём динамический вид MAP muliticast на HUB

R1(config-if)#ip nhrp map multicast dynamic

Задаём DMVPN облаку номер 1 ( если облаков несколько )

R1(config-if)#ip nhrp network-id 1

Указываем время до обновления динамической записи в базе

R1(config-if)#ip nhrp holdtime 400

R1(config-if)#ip tcp adjust-mss 1360

R1(config-if)#tunnel source fa 0/0
R1(config-if)#tunnel mode gre multipoint
R1(config-if)#tunnel path-mtu-discovery

уменьшаем MTU – т.к. GRE и ESP инкапсуляции увеличивают размер пакета
команды: ip mtu 1400,  ip tcp adjust-mss 1360, tunnel path-mtu-discovery

--------------------------------------------------------------

R3(config)#interface Tunnel1
R3(config-if)#ip add 192.168.0.101 255.255.255.0
R3(config-if)#ip mtu 1400

Прямо указываем статический map до хаба и назначаем его сервером
что указывает, что именно SPOKE будет инициатором изначального соединения

R3(config-if)#ip nhrp map 192.168.0.1 100.0.0.2
R3(config-if)#ip nhrp map multicast 100.0.0.2
R3(config-if)#ip nhrp network-id 1
R3(config-if)#ip nhrp holdtime 400
R3(config-if)#ip nhrp nhs 192.168.0.1

R3(config-if)#ip tcp adjust-mss 1360

R3(config-if)#tunnel source fa 0/0
R3(config-if)#tunnel mode gre multipoint
R3(config-if)#tunnel path-mtu-discovery

Сразу проверяем

R3(config-if)#do sh ip nhrp
192.168.0.1/32 via 192.168.0.1, Tunnel1 created 00:02:06, never expire
  Type: static, Flags: authoritative used
  NBMA address: 100.0.0.2


--------------------------------------------------------------

R4(config)#interface Tunnel1
R4(config-if)#ip add 192.168.0.102 255.255.255.0
R4(config-if)#ip mtu 1400

R4(config-if)#ip nhrp map 192.168.0.1 100.0.0.2
R4(config-if)#ip nhrp map multicast 100.0.0.2
R4(config-if)#ip nhrp network-id 1
R4(config-if)#ip nhrp holdtime 400
R4(config-if)#ip nhrp nhs 192.168.0.1

R4(config-if)#ip tcp adjust-mss 1360

R4(config-if)#tunnel source fa 0/0
R4(config-if)#tunnel mode gre multipoint
R4(config-if)#tunnel path-mtu-discovery

R4(config-if)#do sh ip nhrp
192.168.0.1/32 via 192.168.0.1, Tunnel1 created 00:01:17, never expire
  Type: static, Flags: authoritative used
  NBMA address: 100.0.0.2

---------------------------------------------------------------

4) настраиваем IPSec профили

Важно понимать, что ipsec profile – это завуалированный crypto dynamic-map.
Это отчетливо видно, если ввести: show crypto map.
При желании/необходимости данную конструкцию можно поменять на классический crypto dynamic-map,
c указанием в сопутствующем ACL интересующего трафика GRE.

Создаём ключницу DMVPN1

R1(config)#crypto keyring DMVPN1

В ключнице pre-shared ключ для всех хостов

R1(conf-keyring)#pre-shared-key address 0.0.0.0 0.0.0.0 key dmvpncisco

Настраиваем политику служебного туннеля

R1(config)#crypto isakmp policy 10
R1(config-isakmp)#encryption 3des
R1(config-isakmp)#authentication pre-share
R1(config-isakmp)#group 2

Добавляем фичи для стабильности (гугл в помощь)
When an invalid security parameter index error (shown as "Invalid SPI")
occurs in IP Security (IPSec) packet processing,
the Invalid Security Parameter Index Recovery feature allows for
an Internet Key Exchange (IKE) security association (SA) to be established.
The "IKE" module sends notification of the "Invalid SPI" error
to the originating IPSec peer so that Security Association Databases (SADBs)
can be resynchronized and successful packet processing can be resumed.

R1(config)#crypto isakmp invalid-spi-recovery
R1(config)#crypto isakmp keepalive 10 periodic

Создаём isakmp профиль DMVPN1

R1(config)#crypto isakmp profile DMVPN1
% A profile is deemed incomplete until it has match identity statements

Указываем что нужно использовать ключницу DMPN1

R1(conf-isa-prof)#keyring DMVPN1

Хост совпадения любой

R1(conf-isa-prof)#match identity address 0.0.0.0

Локальный интерфейс применения fa 0/0

R1(conf-isa-prof)#local-address fa 0/0
R1(conf-isa-prof)#exit

Задаём трансформу ( Шифрование основного туннеля )

R1(config)#crypto ipsec transform-set ESP-3DES-SHA-HMAC esp-3des esp-sha-hmac

указываем что нужно использовать профиль DMVPN1

R1(cfg-crypto-trans)#crypto ipsec profile DMVPN1

Задаём в профиле тип трансформы и профиль isakmp

R1(ipsec-profile)#set transform-set ESP-3DES-SHA-HMAC
R1(ipsec-profile)#set isakmp-profile DMVPN1

Применяем профиль ipsec DMVPN1 к туннелю

R1(config)#int Tunnel1
R1(config-if)#tunnel protection ipsec profile DMVPN1
R1(config-if)#exit

Смотрим глобально на то же в конфиге

Ключница для служебного тоннеля
crypto keyring DMVPN1
  pre-shared-key address 0.0.0.0 0.0.0.0 key dmvpncisco

!
Политика служебного туннеля
crypto isakmp policy 10
 encr 3des
 authentication pre-share
 group 2
crypto isakmp invalid-spi-recovery
crypto isakmp keepalive 10 periodic


Ключница и политика для служебного тоннеля объединяются в профиль ISAKMP
crypto isakmp profile DMVPN1
   keyring DMVPN1
   match identity address 0.0.0.0
   local-address FastEthernet0/0

!
Далее задаётся трансформа-шифрование для основного туннеля
crypto ipsec transform-set ESP-3DES-SHA-HMAC esp-3des esp-sha-hmac
!
Далее трансформа и профиль служебного тоннеля обьединяются в профиль ipsec для установления основного туннеля
crypto ipsec profile DMVPN1
 set transform-set ESP-3DES-SHA-HMAC
 isakmp-profile DMVPN1

!
И профиль ipsec променяется к интерфейсу
interface Tunnel1
 tunnel protection ipsec profile DMVPN1


Всё достаточно просто и прозрачно

Проверяем:

Настраиваем на R1, R3, R4 и смотрим лог  и пинг

R4#ping 192.168.0.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 84/104/148 ms

R4#ping 192.168.0.101
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.101, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 188/280/384 ms

R4#ping 192.168.0.102
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.102, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 132/158/184 ms

R1#sh crypto isakmp sa
dst             src             state          conn-id slot status
100.0.0.2       200.1.1.2       QM_IDLE              1    0 ACTIVE
100.0.0.2       200.2.2.2       QM_IDLE              2    0 ACTIVE

R3#sh crypto isakmp sa
dst             src             state          conn-id slot status
100.0.0.2       200.1.1.2       QM_IDLE              1    0 ACTIVE

R4#sh crypto isakmp sa
dst             src             state          conn-id slot status
100.0.0.2       200.2.2.2       QM_IDLE              1    0 ACTIVE



---------------------------------------------------------------

5) Поднимаем EIGRP на логической подсети

R1(config)#router eigrp 22
R1(config-router)#no auto-summary
R1(config-router)#network 10.0.0.0
R1(config-router)#network 192.168.0.0 0.0.255.255


R1(config)#int Tun1
R1(config-if)#no ip next-hop-self eigrp 22
R1(config-if)#no ip split-horizon eigrp 22
Добавляются в силу особенностей функционирования типа frame-relay  point-to-multipoint, для нормального функционирования маршрутизации
R3(config)#router eigrp 22
R3(config-router)#no auto-summary
R3(config-router)#network 10.0.0.0
R3(config-router)#net 192.168.0.0 0.0.255.255
R3(config-router)#
R3(config-router)#
*Mar  1 03:44:22.071: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 22: Neighbor 192.168.0.1 (Tunnel1) is up: new adjacency
R3(config-router)#
R3(config-router)#exit

R3(config)#int Tunnel 1
R3(config-if)#no ip next-hop-self eigrp 22
*Mar  1 03:45:20.987: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 22: Neighbor 192.168.0.1 (Tunnel1) is down: next_hop_self value changed
*Mar  1 03:45:23.343: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 22: Neighbor 192.168.0.1 (Tunnel1) is up: new adjacency
R3(config-if)#no ip split
R3(config-if)#no ip split-horizon eigrp 22
R3(config-if)#
*Mar  1 03:45:32.259: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 22: Neighbor 192.168.0.1 (Tunnel1) is resync: split horizon changed


R4(config)#router eigrp 22
R4(config-router)#no auto-summary
R4(config-router)#network 10.0.0.0
R4(config-router)#network 192.168.0.0 0.0.255.255

R4(config)#int Tun1
R4(config-if)#no ip next-hop-self eigrp 22
R4(config-if)#no ip split-horizon eigrp 22
R4(config-if)#

---------------------------------------------------------------

6) Далее проверяем таблицы маршрутизации и хождение трафика

R1# show ip route
     100.0.0.0/24 is subnetted, 1 subnets
C       100.0.0.0 is directly connected, FastEthernet0/0
O    200.1.1.0/24 [110/2] via 100.0.0.1, 00:01:25, FastEthernet0/0
O    200.2.2.0/24 [110/2] via 100.0.0.1, 00:01:25, FastEthernet0/0
     10.0.0.0/8 is variably subnetted, 5 subnets, 2 masks
D       10.0.2.0/24 [90/297246976] via 192.168.0.101, 00:01:19, Tunnel1
D       10.0.0.2/32 [90/297372416] via 192.168.0.101, 00:01:19, Tunnel1
D       10.0.3.0/24 [90/297246976] via 192.168.0.102, 00:01:19, Tunnel1
D       10.0.0.3/32 [90/297372416] via 192.168.0.102, 00:01:20, Tunnel1
C       10.0.0.1/32 is directly connected, Loopback1
C    192.168.0.0/24 is directly connected, Tunnel1

R3#sh ip ro
     100.0.0.0/24 is subnetted, 1 subnets
O       100.0.0.0 [110/2] via 200.1.1.1, 00:03:05, FastEthernet0/0
C    200.1.1.0/24 is directly connected, FastEthernet0/0
O    200.2.2.0/24 [110/2] via 200.1.1.1, 00:03:05, FastEthernet0/0
     10.0.0.0/8 is variably subnetted, 5 subnets, 2 masks
C       10.0.2.0/24 is directly connected, FastEthernet0/1
C       10.0.0.2/32 is directly connected, Loopback1
D       10.0.3.0/24 [90/310046976] via 192.168.0.102, 00:02:53, Tunnel1
D       10.0.0.3/32 [90/310172416] via 192.168.0.102, 00:02:54, Tunnel1
D       10.0.0.1/32 [90/297372416] via 192.168.0.1, 00:02:57, Tunnel1
C    192.168.0.0/24 is directly connected, Tunnel1

R4#sh ip ro
     100.0.0.0/24 is subnetted, 1 subnets
O       100.0.0.0 [110/2] via 200.2.2.1, 00:04:36, FastEthernet0/0
O    200.1.1.0/24 [110/2] via 200.2.2.1, 00:04:36, FastEthernet0/0
C    200.2.2.0/24 is directly connected, FastEthernet0/0
     10.0.0.0/8 is variably subnetted, 5 subnets, 2 masks
D       10.0.2.0/24 [90/310046976] via 192.168.0.101, 00:04:28, Tunnel1
D       10.0.0.2/32 [90/310172416] via 192.168.0.101, 00:04:28, Tunnel1
C       10.0.3.0/24 is directly connected, FastEthernet0/1
C       10.0.0.3/32 is directly connected, Loopback1
D       10.0.0.1/32 [90/297372416] via 192.168.0.1, 00:04:29, Tunnel1
C    192.168.0.0/24 is directly connected, Tunnel1


Трафик из Регионального офиса 1 идёт в Региональный офис 2 минуя центральный офис, а значит динамические туннели функционируют правильно.
 



7) Хорошие маны на которых строилось первое изучение, это было давно :)

http://www.cisco.com/en/US/docs/solutions/Enterprise/WAN_and_MAN/DMVPDG.html
http://www.cisco.com/en/US/docs/ios/security/configuration/guide/sec_per_tunnel_qos.pdf
http://www.cisco.com/en/US/docs/ios/12_4t/12_4t11/ht_trsel.html


Дальше я разберу несколько более сложных топологий.

Комментариев нет:

Отправить комментарий