Dynamic Multipoint VPN (DMVPN) + Certificats

Voici un petit article pour la configuration de vpn dynamiques en utilisant des certificats.

Topologie

Topologie

Fichier dynagen:

ghostios   = True
sparsemem  = True
#workingdir = c:temp

[localhost]
	[[3660]]
	        image = ../images/C3660-JK.BIN
	        ram = 128
		idlepc = 0x604eb02c
	[[2621XM]]
		image = ../images/C2600-AD.BIN
		ram = 96
		idlepc = 0x81691494
    [[ROUTER IAR]]
        model = 3660
        F0/0=NIO_gen_eth:vmnet1 #serveur CA
	F1/0=HUB F0/0
	F2/0=SPOKE2 F0/0
	F3/0=SPOKE3 F0/0
    [[ROUTER HUB]]
        model = 2621XM
    [[ROUTER SPOKE2]]
      model = 2621XM
    [[ROUTER SPOKE3]]
        model = 2621XM

Pour l’installation SCEP sous windows, c’est par ici: http://micronetsolution.net/Microsoft_CA_Cisco_setup.pdf edit: Lien HS. Si quelqu’un à DL le fichier, qu’il me l’envoi par mail postmaster ar0base bmigette.Fr merci.

Introduction:

Dynamic multipoint VPN (DMVPN pour les intimes), qu’est-ce que c’est ? Les DMVPN utilisent mGRE (Multipoint GRE), et NHRP (Next Hop Resolution Protocol), pour former des tunnels à la volée, c’est à dire qu’on a pas besoin de connaitre les IP des peers distants, mais l’on va dynamiquement créer des liaisons point à point vers tous les routeurs dans le même groupe mGRE que nous. On pourrait comparer NHRP à l’ARP pour les tunnels multipoints, sauf que cela permet de passer d’une ip privée vers une ip publique. Cela à pour avantage de simplifier la configuration des routeurs, et permettre l’extensibilité, notemment en cas d’ajout d’un noeud. Du fait que les peers ne sont pas connu à l’avance, nous pouvons créer une clef isakmp par défaut (http://bmigette.fr/2009/02/01/isakmp-pre-shared-key-par-defaut/), ou, comme c’est le cas ici, utiliser une infrastucture PKI qui est plus sécurisée.

Il y a deux approches pour le DMVPN:

Hub and spoke, topologie dans laquelle le hub utilise une interface tunnel mGRE, et il n’y aura pas de tunnel direct entre les différents sites, le hub fera le routage entre les tunnels.
Spoke To Spoke, les différents noeud distant établissent des tunnels entre eux de manière dynamiques, de manière à formé un réseau full mesh. C’est ce que nous allons voir ici.

Note: La notion HUB ici désignera simplement le routeur qui servira pour la résolution du Next Hop (ce sera le Next Hop Server, NHS), mais les tunnels se feront bien entre tous les routeurs

Etape 1: Configuration du serveur SCEP:

Le protocole SCEP permets simplement à un équipement de demander un certificat auprès d’un CA. Nous allons installer le support SCEP sur un serveur Windows 2003 Server.

Dans le panneau de configuration, sélectionnez Add or remove windows component.Selectionnez ensuite Certificate services, et dans applications services cochez IIS. Téléchargez ensuite le support SCEP pour le service de certificat microsoft (cepsetup.exe):
http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=9f306763-d036-41d8-8860-1636411b2d01&displaylang=en

Installez l’outil en laissant les paramètres par défaut.
Allez dans le gestionnaire IIS (start/administrative tools/Internet Information Services (IIS) Manager), puis déroullez « Application pools », puis click droit sur SCEP,properties, et vérifiez que dans l’onglet properties, Predefined est coché, et que Local system est sélectionné.

Note: IIS est le serveur web microsoft, il est utilisé par SCEP. Attention à sa configuration (ne pas laisser de site par défaut…).

Etape 2: Configuration de l’adressage :

N’oubliez pas l’ip du serveur de certificat. Dans la réalité, le serveur de certificat serait relié par un adressage privé sur un des routeur et on utiliserait du nat, mais ce n’est pas le but ici.

Hub:

Router(config)#hostname IAR
IAR(config)#int f0/0
IAR(config-if)#ip add 80.0.0.1 255.255.255.0
IAR(config-if)#no shut
IAR(config-if)#int f1/0
IAR(config-if)#ip add 80.0.1.1 255.255.255.0
IAR(config-if)#no shut
IAR(config-if)#int f2/0
IAR(config-if)#ip address 80.0.2.1 255.255.255.0
IAR(config-if)#no shut
IAR(config-if)#int f3/0
IAR(config-if)#ip add 80.0.3.1 255.255.255.0
IAR(config-if)#no shut

Hub:

Router>en
Router#conf t
HUB(config)#int f0/0
HUB(config-if)#ip add 80.0.1.2 255.255.255.0
HUB(config-if)#no sh
HUB(config)#int loop1
HUB(config-if)#ip add 1.1.1.1 255.255.255.0

Spoke2:

Router>en
Router#conf t
SPOKE2(config)#int f0/0
SPOKE2(config-if)#ip add 80.0.2.2 255.255.255.0
SPOKE2(config-if)#no sh
SPOKE2(config)#int loop1
SPOKE2(config-if)#ip add 2.2.2.2 255.255.255.0

Spoke3:

Router>en
Router#conf t
SPOKE3(config)#int f0/0
SPOKE3(config-if)#ip add 80.0.3.2 255.255.255.0
SPOKE3(config-if)#no sh
SPOKE3(config)#int loop1
SPOKE3(config-if)#ip add 3.3.3.3 255.255.255.0

Sur chaque routeur (sauf IAR):

ip route 0.0.0.0 0.0.0.0 A.B.C.D

Etape 3: Enrollment des spoke et du hub sur le serveur de certificat.

Pour cela, il faut sur les Spoke (inutile sur le Hub, il n’utilisera pas de certificats), tapez les commande suivantes:
Note: Pensez aussi à vérifier la synchronisation de l’heure entre les équipements et le serveur, le meiux est d’utiliser un serveur NTP.

Dans l’ordre:

  • Définir un nom d’hôtes
  • Définir un nom de domaine
  • Mapper le nom d’hôtes du serveur de certificat si le service DNS n’est pas utilisé
  • Supprimer les anciennes clé RSA
  • Générer des clés RSA 1024 Bits
  • Définir un CA (Certificate authority) de confiance
  • Ajouter le CA comme étant une Registration Authority (RA)
  • Spécifier l’url du serveur (vous avez du l’avoir lors de l’installation)
  • Obtenir la clé du serveur
  • Obtenir un certificat

Pour la commnade crypto ca enroll, il faut le mot de passe SCEP du serveur. Ce mot de passe s’obtiens en se connecant ici:
http://ca-server/certsrv/mscep/ (si votre serveur s’appelle ca-server). Pour vous logguer, utilisez un compte local (vu que vous avez mis local system à l’étape 1). Ce mot de passe est utilisable qu’une seule fois, il suffit de rafraîchir la page pour en obtenir un nouveau.

hostname device_name
ip domain-name yourdomain.com
ip host CA-Server A.B.C.D
crypto key zeroize rsa
crypto key generate rsa general-keys modulus 1024
crypto ca trustpoint your_trustpoint_name
  enrollment mode ra
  enrollment url http://CA-Server/certsrv/mscep/mscep.dll
  exit
crypto ca authenticate your_trustpoint_name
crypto ca enroll your_trustpoint_name

Exemple pour SPOKE2:

SPOKE2(config)#ip domain-name mynetwork.lan
SPOKE2(config)#ip host CA-Server 80.0.0.10
SPOKE2(config)#crypto key zeroize rsa
% No Signature RSA Keys found in configuration.

SPOKE2(config)#crypto key generate rsa general-keys modulus 1024
The name for the keys will be: SPOKE2.mynetwork.lan

% The key modulus size is 1024 bits
% Generating 1024 bit RSA keys, keys will be non-exportable...[OK]

SPOKE2(config)#crypto ca trustpoint myCaServer
SPOKE2(ca-trustpoint)#  enrollment mode ra
SPOKE2(ca-trustpoint)#$enrollment url http://CA-Server/certsrv/mscep/mscep.dll
SPOKE2(ca-trustpoint)#  exit
SPOKE2(config)#crypto ca authenticate myCaServer
Feb   16:47:54.363: %SSH-5-ENABLED: SSH 1.99 has been enabled
Certificate has the following attributes:
       Fingerprint MD5: 591609E4 D5171FFF 1A068C5C F5E4A507
      Fingerprint SHA1: 387CAF66 99B55B8A 4719C3FB 5174B6E0 56768896 

% Do you accept this certificate? [yes/no]: y
Trustpoint CA certificate accepted.
SPOKE2(config)#crypto ca enroll myCaServer
%
% Start certificate enrollment ..
% Create a challenge password. You will need to verbally provide this
   password to the CA Administrator in order to revoke your certificate.
   For security reasons your password will not be saved in the configuration.
   Please make a note of it.

Password: <=Password from http://ca-server/certsrv/mscep/ 
Re-enter password: <=Password from http://ca-server/certsrv/mscep/ 

% The subject name in the certificate will include: SPOKE2.mynetwork.lan
% Include the router serial number in the subject name? [yes/no]: yes
% The serial number in the certificate will be: 00000000000
% Include an IP address in the subject name? [no]: no
Request certificate from CA? [yes/no]: yes
% Certificate request sent to Certificate Authority
% The 'show crypto ca certificate myCaServer verbose' commandwill show the fingerprint.

SPOKE2(config)#
Feb  8 16:49:12.996: CRYPTO_PKI:  Certificate Request Fingerprint MD5: 17E8E0CC B33A4ED1 C5B2D917 3A1EBE6C
Feb  8 16:49:12.996: CRYPTO_PKI:  Certificate Request Fingerprint SHA1: 0BE3A8F3 6C28152D 38C8F0A5 B02C6FDF 8AED29A4
!Après avoir "issue" le certificate (voir la ligne en rouge ;))
Feb  8 20:45:22.767: %PKI-6-CERTRET: Certificate received from Certificate Authority

Faire la même chose pour les autres routeurs.

Allez ensuite dans start/Administrative tools/Certification Authority, et sélectionnez pending request. Vous devriez avoir la liste des certificats de vos routers. Sélectionnez les, clique droit, all task, et cliquez sur issue !

Etape 3: Configuration ISAKMP avec Certificats et du profil IPSEC:

Voici les commandes pour configurer ISAKMP:

HUB(config)#crypto isakmp policy 1
HUB(config-isakmp)#hash sha
HUB(config-isakmp)#encryp aes
HUB(config-isakmp)#authen rsa-sig
HUB(config-isakmp)#group 5
HUB(config-isakmp)#exit

A faire sur tous les spoke.

Il faut aussi créer un profile IPSEC qui sera utilisé pour sécuriser le tunnel:

HUB(config)#crypto ipsec transform-set DMVPN_TSet esp-aes
HUB(cfg-crypto-trans)#exit
HUB(config)#crypto ipsec profile DMVPN_IPSEC_Profile
HUB(ipsec-profile)#set transform-set DMVPN_TSet
HUB(ipsec-profile)#exit

A faire sur tous les spoke.

Etape4: Configuration des interfaces mGRE:

Note: attention au MTU! Les entêtes GRE utilisent 4octets, mGRE, 4 autres supplémentaires, et l’entête IP du tunnel 20octets.
Pour le routage, il faut considérer que tous les routeurs vont être dans le même sous réseau. Au niveau des interfaces tunnel, cela va donner ceci:

HUB: 192.168.1.1/24
SPOKE2: 192.168.1.2/24
SPOKE3: 192.168.1.3/24

Ces adresses seront mappées à leur adresses publiques par le HUB qui utilisera NHRP. Il faudra donc dire à EIGRP (ou autre protocole de routage IGP), de ne pas avertir de routes pour le réseau du VPN avec son IP local (no ip next-hop-self eigrp {AS}), car sinon cela crééré des incohérences dans la table de routage. On désactivera aussi le split-horizon, sans quoi une mise à jour reçue par le tunnel ne serait pas réémise.

Configuration pour le hub:

  • Création d’une interface tunnel
  • Attribution de l’ip privée du tunnel
  • Changement du MTU (mettre un MTU bas afin de s’assurer que les paquets ne seront pas fragmenter sur le chemin, mais qu’ils seront fragmentés avant d’êtres envoyés).
  • Créer un mot de passe NHRP
  • Indiquer que le mappage se fera de manière dynamique par NHRP
  • Indiquer le réseau NHRP (doit être le même sur les spoke)
  • Désactiver le split horizon (nous utiliseront EIGRP 65000 Plus tard)
  • Tunnel source et tunnel key (la clé doit être la même sur les spoke, ceci est optionnel, et peut être vu comme une sécurité assez basique: on ne pourra pas établir de tunnel sans deviner la clé).
  • Tunnel mGRE
  • Application du profile IPSEC
HUB(config)#interface Tunnel 0
HUB(config-if)#ip address 192.168.1.1 255.255.255.0
HUB(config-if)#ip mtu 1416
HUB(config-if)#no ip next-hop-self eigrp 65000
HUB(config-if)#ip nhrp authentication cisco123
HUB(config-if)#ip nhrp map multicast dynamic
HUB(config-if)#ip nhrp network-id 99
HUB(config-if)#no ip split-horizon eigrp 65000
HUB(config-if)#tunnel source FastEthernet 0/0
HUB(config-if)#tunnel key 999
HUB(config-if)#tunnel mode gre multipoint
HUB(config-if)#tunnel protection ipsec profile DMVPN_IPSEC_Profile

Pour les spoke:

  • Création d’une interface tunnel
  • Attribution de l’ip privée du tunnel
  • Changement du MTU (mettre un MTU bas afin de s’assurer que les paquets ne seront pas fragmenter sur le chemin, mais qu’ils seront fragmentés avant d’êtres envoyés).
  • Créer un mot de passe NHRP
  • Faire un mappage dynamique NHRP pointant sur l’adresse du HUB.
  • Rediriger le multicast vers une adresse unicast (l’adresse publique du HUB). Cela permettras l’utilisation de protocole de routage dynamiques utilisant du multicast (EIGRP, OSPF…)
  • Indiquer l’adresse du NHS (Next Hop Server), qui indique le serveur qui contient le mapping IP publique/IP Tunnel.
  • Indiquer le réseau NHRP (doit être le même sur les spoke)
  • Désactiver le split horizon (nous utiliseront EIGRP 65000 Plus tard)
  • Tunnel source et tunnel key (la clé doit être la même sur les spoke, ceci est optionnel, et peut être vu comme une sécurité assez basique: on ne pourra pas établir de tunnel sans deviner la clé).
  • Tunnel mGRE
  • Application du profile IPSEC
SPOKE2(config)#interface Tunnel 0
SPOKE2(config-if)#ip address 192.168.1.2 255.255.255.0
SPOKE2(config-if)#ip mtu 1416
SPOKE2(config-if)#no ip next-hop-self eigrp 65000
SPOKE2(config-if)#ip nhrp authentication cisco123
SPOKE2(config-if)#ip nhrp map 192.168.1.1 80.0.1.2
SPOKE2(config-if)#ip nhrp map multicast 80.0.1.2
SPOKE2(config-if)#ip nhrp nhs 192.168.1.1
SPOKE2(config-if)#ip nhrp network-id 99
SPOKE2(config-if)#no ip split-horizon eigrp 65000
SPOKE2(config-if)#tunnel source FastEthernet 0/0
SPOKE2(config-if)#tunnel key 999
SPOKE2(config-if)#tunnel mode gre multipoint
SPOKE2(config-if)#tunnel protection ipsec profile DMVPN_IPSEC_Profile

Etape 5: Configuration du routage:

Sur le hub:

HUB(config)#router eigrp 65000
HUB(config-router)#net 1.1.1.0 0.0.0.255
HUB(config-router)#net 192.168.1.0 0.0.0.255
HUB(config-router)#no auto-summary
HUB(config-router)#exit

Sur les spoke:

SPOKE2(config)#router eigrp 65000
SPOKE2(config-router)#net 192.168.1.0 0.0.0.255
SPOKE2(config-router)#net 2.2.2.0 0.0.0.255
SPOKE2(config-router)#eigrp stub connected
SPOKE2(config-router)#exit
SPOKE3(config)#router eigrp 65000
SPOKE3(config-router)#net 192.168.1.0 0.0.0.255
SPOKE3(config-router)#net 3.3.3.3 0.0.0.255
SPOKE3(config-router)#eigrp stub connected
SPOKE3(config-router)#exit

La fonction stub permet à EIGRP de ne pas apprendre toutes les routes du réseau, étant donné qu’il n’aura qu’un seul chemin possible. Le mot clef stub connected lui permet toutefois d’avertir ses routes connectées.

Voila tout doit marcher !!! Quelques commandes de vérifications:

Sur le hub

HUB#sh crypto isakmp peers
Peer: 80.0.2.2 Port: 500 Local: 80.0.1.2
 Phase1 id: SPOKE2.mynetwork.lan
Peer: 80.0.3.2 Port: 500 Local: 80.0.1.2
 Phase1 id: SPOKE3.mynetwork.lan
HUB#sh ip nhrp dynamic
192.168.1.2/32 via 192.168.1.2, Tunnel0 created 00:06:47, expire 01:53:12
  Type: dynamic, Flags: unique nat registered
  NBMA address: 80.0.2.2
192.168.1.3/32 via 192.168.1.3, Tunnel0 created 00:06:44, expire 01:54:04
  Type: dynamic, Flags: unique nat registered
  NBMA address: 80.0.3.2

Sur tout les routeurs:

HUB#sh crypto ca certificates
Certificate ! votre certificat
  Status: Available
  Certificate Serial Number: 61DEC674000000000008
  Certificate Usage: General Purpose
  Issuer:
    cn=ca-server
  Subject:
    Name: HUB.mynetwork.lan
    Serial Number: 00000000000
    hostname=HUB.mynetwork.lan
    serialNumber=00000000000
  CRL Distribution Points:
    http://ca-server/CertEnroll/ca-server.crl
  Validity Date:
    start date: 18:51:17 UTC Feb 8 2009
    end   date: 19:01:17 UTC Feb 8 2010
  Associated Trustpoints: myCaServer 

CA Certificate ! Certificat du server
  Status: Available
  Certificate Serial Number: 4ED821D7E08FC8B74BC4E55A9500A3EA
  Certificate Usage: Signature
  Issuer:
    cn=ca-server
  Subject:
    cn=ca-server
  CRL Distribution Points:
    http://labo-cisco/CertEnroll/ca-server.crl
  Validity Date:
    start date: 14:17:08 UTC Feb 8 2009
    end   date: 14:17:08 UTC Feb 8 2014
  Associated Trustpoints: myCaServer

Les crypto map qui sont créées (une par peer distant, et ce automatiquement… C’est pas beau ?):

HUB#sh crypto map
Crypto Map "Tunnel0-head-0" 65536 ipsec-isakmp
	Profile name: DMVPN_IPSEC_Profile
	Security association lifetime: 4608000 kilobytes/3600 seconds
	PFS (Y/N): N
	Transform sets={
		DMVPN_TSet,
	}

Crypto Map "Tunnel0-head-0" 65539 ipsec-isakmp
	Map is a PROFILE INSTANCE.
	Peer = 80.0.2.2
	Extended IP access list
	    access-list  permit gre host 80.0.1.2 host 80.0.2.2
	Current peer: 80.0.2.2
	Security association lifetime: 4608000 kilobytes/3600 seconds
	PFS (Y/N): N
	Transform sets={
		DMVPN_TSet,
	}

Crypto Map "Tunnel0-head-0" 65540 ipsec-isakmp
	Map is a PROFILE INSTANCE.
	Peer = 80.0.3.2
        Extended IP access list
	    access-list  permit gre host 80.0.1.2 host 80.0.3.2
	Current peer: 80.0.3.2
	Security association lifetime: 4608000 kilobytes/3600 seconds
	PFS (Y/N): N
	Transform sets={
		DMVPN_TSet,
	}
	Interfaces using crypto map Tunnel0-head-0:
		Tunnel0
HUB#sh crypto map
Crypto Map "Tunnel0-head-0" 65536 ipsec-isakmp
	Profile name: DMVPN_IPSEC_Profile
	Security association lifetime: 4608000 kilobytes/3600 seconds
	PFS (Y/N): N
	Transform sets={
		DMVPN_TSet,
	}

Crypto Map "Tunnel0-head-0" 65539 ipsec-isakmp
	Map is a PROFILE INSTANCE.
	Peer = 80.0.2.2
	Extended IP access list
	    access-list  permit gre host 80.0.1.2 host 80.0.2.2
	Current peer: 80.0.2.2
	Security association lifetime: 4608000 kilobytes/3600 seconds
	PFS (Y/N): N
	Transform sets={
		DMVPN_TSet,
	}

Crypto Map "Tunnel0-head-0" 65540 ipsec-isakmp
	Map is a PROFILE INSTANCE.
	Peer = 80.0.3.2
        Extended IP access list
	    access-list  permit gre host 80.0.1.2 host 80.0.3.2
	Current peer: 80.0.3.2
	Security association lifetime: 4608000 kilobytes/3600 seconds
	PFS (Y/N): N
	Transform sets={
		DMVPN_TSet,
	}
	Interfaces using crypto map Tunnel0-head-0:
		Tunnel0

Et la table de routage:

HUB#sh ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is 80.0.1.1 to network 0.0.0.0

     1.0.0.0/24 is subnetted, 1 subnets
C       1.1.1.0 is directly connected, Loopback1
     2.0.0.0/24 is subnetted, 1 subnets
D       2.2.2.0 [90/297372416] via 192.168.1.2, 00:07:06, Tunnel0
     3.0.0.0/24 is subnetted, 1 subnets
D       3.3.3.0 [90/297372416] via 192.168.1.3, 00:07:25, Tunnel0
     80.0.0.0/24 is subnetted, 1 subnets
C       80.0.1.0 is directly connected, FastEthernet0/0
C    192.168.1.0/24 is directly connected, Tunnel0
S*   0.0.0.0/0 [1/0] via 80.0.1.1

Voila! Un petit lab qui m’a pris l’après midi (surotut l’histoire du issue certificate !!! Bref si vous avez des questions, direction les comments. Je vous mets les conf finales à télécharger: Configurations

Recent Entries

Leave a Reply

Le temps imparti est dépassé. Merci de recharger le CAPTCHA.