Config d’un VPN de type GRE Tunnel + IPSEC entre deux Sites à travers Internet

 

 

Notions Techniques Importantes  

 

IPSEC : 

L’IPSec est un protocole réseaux qui permet de fournir plusieurs services de sécurité pour les paquets IP tels que le cryptage des données, l’authentification, l’intégrité et la confidentialité.  

Cela a pour objectif de fournir une communication cryptée sécurisée entre deux noeuds dans un réseau. Il est utilisé souvent dans les réseaux privés virtuels (VPN). 

  

IKE : Internet Key Exchange (IKEv1, IKEv2) 

C’est un Protocole IPSEC utilisé pour configurer une Security Association (SA). IKE s'appuie sur ISAKMP, ainsi que des certificats pour l'authentification et les échanges de clés. De plus, une Security Policy est configurée manuellement pour chaque paire de nœuds communicante.   

  

ISAKMP : Internet Security Association and Key Management Protocol.  

C’est le protocole qui livre aux deux neouds communicants les manières et les paramètres de sécurité à configurer afin d’établir un Canal complètement sécurisé entre eux (Authentification, Cryptage, échange des clés, …).  

ISAKMP utilise souvent IKE pour l'échange de clés et fonctionne sur le port UDP 500. 

   

SA : Security association 

Une SA (ISAKMP SA ou IKE SA) est une politique unidirectionnelle (dans un seul sens) qui définit la manière de chiffrement des Flux (Algorithmes et Clés de Cryptage). Donc, chaque Tunnel fonctionnant avec IPSEC aura 2 SAs, une pour chaque direction.  

Il y a plusieurs étapes dans la Politique de SA : Choisir l'algorithme de chiffrement à utiliser (Exp : 3DES), choisir l’algorithme de Cryptage/Intégrité (Exp : MD5), choisir le mode d’authentification des sessions (Exp : Certificat de clé publique), Utilisation de Protocole AH (Authentication Header) ou ESP (Encapsulated Security Payload) avec leurs paramètres correspondants. 

   

Phase 1 et Phase 2 :  

Il existe deux phases de négociation pour un Tunnel IPSEC : Phase 1 et Phase 2.  

Au cours de la phase 1, les deux extrémités d'un tunnel établissent un Canal sécurisé et procèdent à la négociation des paramètres SA (Autentification, Intégrité, …) et échangent les clés / certificats (IKE).  

Une fois la phase 1 terminée, les deux extrémités pourront échanger les données (Data) en toute sécurité, elles doivent donc décider quel trafic traversera le tunnel avec quel cryptage à appliquer. C’est la Phase 2.  

Au cours de la phase 2, les deux extrémités de Tunnel négocient la manière de chiffrement et d’envoie des données en fonction des politiques de sécurité implémentées. Si les politiques de deux côtés sont d’accord, le tunnel sera opérationnel et prêt à être utilisé : Les données sont envoyées à travers le canal sécurisé établi lors de la Phase 1. 

   

AH (Authentication Header) vs ESP (Encapsulating Security Payload)  

AH et ESP sont deux protocoles différents utilisés dans la suite IPSec. L'en-tête d'authentification (AH) assure l'intégrité ainsi que l’authentification des origines de données.  
L’entête ESP assure la confidentialité, l'intégrité des données, l'authentification de l'origine des données ainsi qu’un service anti-relecture.  

En ce qui concerne AH, les informations d'en-tête d'authentification sont ajoutées au paquet généré par l'expéditeur, juste entre la couche 3 Network et la couche 4 Transport.  

AH permet de signer numériquement l'intégralité du contenu de chaque paquet envoyé par l’expéditeur.  Les algorithmes de chiffrement et de hachage souvent utilisés sont DES, MD5, SHA-1, …Cela permet de bien lutter contre la fraude et la modification de données. Mais n’empechera personne de les consulter et voir. Pour cela, IPSec utilise un cryptage avancé que fournit l'ESP. Ce dernier est utilisé pour chiffrer l'intégralité les données de la couche applicative supérieure. Il y parvient en ajoutant 3 composants différents : un en-tête ESP, une bande-annonce ESP et un bloc d'authentification ESP.  

Il est à noter que dans un Paquet, l’ID du protocole IP de AH est 51 et de ESP est 50. 

   

IPSec Modes : Tunnel Mode & Transport Mode 

IPSec peut être configuré pour fonctionner selon deux modes différents : Tunnel et Transport.  

Le mode tunnel est le mode par défaut. Avec ce mode, l'intégralité de paquet IP d'origine est protégée par IPSec : IPSec encapsule donc tout le paquet d'origine dans un nouveau paquet IP avec un nouveau Header (en-tête AH ou ESP), le crypte en totalité et l'envoie de l'autre côté du tunnel VPN.  
Le mode transport assure la protection de données, et se compose d'un Header Classique TCP/UDP (Inchangé, celui du Paquet initial) + Données. Ces dernières sont encapsulées avec une en-tête AH ou ESP. Le mode de transport IPSec est généralement utilisé lorsqu'un autre protocole de tunneling (comme GRE) est utilisé pour encapsuler tout d'abord le paquet de données IP, puis IPSec est utilisé pour protéger les paquets du tunnel GRE.  

   

GRE : Generic Routing Encapsulation  

GRE est un protocole Cisco de création de Tunnel qui permet l'encapsulation (l’enveloppe) d'un Paquet IP Classique dans un nouveau Paquet contentant son propre Header GRE.  
 
Il est à noter que GRE ne fait pas de cryptage, il encapsule juste la Data dans un Paquet avec un Header GRE. Si la protection des données est requise, IPSec doit être ajouté pour assurer la confidentialité et l’Intégrité des données.  

Le tunnel GRE est souvent utilisé quand les Données doivent être envoyés d'un réseau Local à un autre via Internet ou un réseau non sécurisé. Et contrairement aux implémentations des Site-to-Site VPN qui n’acceptent pas les flux Multicast, GRE le fait. Du coup, il est adapté au Routage Dynamique OSPF ou autres et il est plus utilisé ! 

 

 

Présentation du Lab

 

 

 

L'Infra suivante permet de simuler deux Sites distants qui veulent communiquer à travers un Nuage Internet.  

Le premier Site (A Gauche) contient deux Vlans : Vlan 10 (10.10.10.0/24) et Vlan 20 (10.10.20.0/24). Le Routage InterVlan s'effectue au Niveau du Routeur R1 en utilisant les sous-interfaces (Voir Confs dans la suite).  

Le deuxième Site (A Droite) est un Réseau natif par défaut (Vlan 1) : 10.10.30.0/24.  

On note que l’adressage utilisé pour le Nuage Internet Publique. Celui des LANs est Privé.  

L'Objectif de ce Lab est de permettre tout d'abord aux Laptops de différents Vlans d'accéder à Internet (Nuage entre R1, R2, R3 et R4). Cela se fait à travers le NAT à implémenter au niveau R1 et R2. Puis, de permettre aussi aux deux Sites Distants de communiquer entre eux à travers Internet en implémentant un Tunnel GRE + IPSEC entre R1 et R2.   

 

Le Lab peut être réalisé sur Gns3 :  

 

Aux Confs : )  

 

 

Confs à Implémenter  

 
Routage Inter-Vlans entre les Networks 10 et 20 : 

Pour que le PC1 (Vlan 10) communique avec le PC2 (Vlan 20), il suffit d’implémenter au niveau de l’interface physique LAN du R1 (Gi1/0) les sous interfaces et les encapsulations dot1q correspondantes. La conf est la suivante : 

 

R1(config)#int Gi1/0                                                                                                                                                                                             

R1(config)#no shut

R1(config-if)#int Gi1/0.10  

R1(config-subif)#encapsulation dot1q 10 

R1(config-subif)#ip adress 10.10.10.254 255.255.255.0                                                                                                                                           

R1(config-if)#int Gi1/0.20  

R1(config-subif)#encapsulation dot1q 20 

R1(config-subif)#ip adress 10.10.20.254 255.255.255.0 

 

Conf du Routage et du NAT pour accéder à Internet :  

Le Routage à implémenter au niveau R1 et R2 est la Route par défaut vers Internet.  

(Le Nuage Internet est déjà préconfiguré, pour plus de simplicité, il peut être préparé en Statique).  

Le type de NAT à utiliser par suite est le PAT (Port Address Translation) : Tout - à part les flux VPN à voir ultérieurement - sera Natté sur l’interface WAN Publique de sortie.  

Les confs sont les suivantes :  

 

R1(config)#ip route 0.0.0.0 0.0.0.0 1.1.1.3                                                                                                                                                             

R1(config)# 

R1(config)#int Gi1/0.10  

R1(config-subif)#ip nat inside                                                                                                                                                                                     

R1(config-subif)#int Gi1/0.20  

R1(config-subif)# ip nat inside  

R1(config-subif)#exit                                                                                                                                                                                           

R1(config)#int Gi2/0                                                                                                                                                                                                   

R1(config-if)# ip nat outside                                                                                                                                                                                       

R1(config-if)#exit                                                                                                                                                                                                     

R1(config)#                                                                                                                                                                                                             

R1(config)# access-list 120 deny ip 10.10.10.0 0.0.0.255 10.10.30.0 0.0.0.255                                                                                                     

R1(config)# access-list 120 deny ip 10.10.20.0 0.0.0.255 10.10.30.0 0.0.0.255                                                                                                     

R1(config)# access-list 120 permit ip 10.10.10.0 0.0.0.255 any                                                                                                                             

R1(config)# access-list 120 permit ip 10.10.20.0 0.0.0.255 any                                                                                                                             

R1(config)#                                                                                                                                                                                                             

R1(config)# ip nat inside source list 120 interface Gi2/0 overload                                                                                                                           

R1(config)#   

 

R2(config)#ip route 0.0.0.0 0.0.0.0 3.3.3.4                                                                                                                                                             

R2(config)# 

R2(config)#int Gi1/0 

R2(config-if)#ip nat inside                                                                                                                                                                                         

R2(config-if)#exit                                                                                                                                                                                                 

R2(config)#int Gi2/0                                                                                                                                                                                                   

R2(config-if)# ip nat outside                                                                                                                                                                                       

R2(config-if)#exit                                                                                                                                                                                                     

R2(config)#                                                                                                                                                                                                             

R2(config)# access-list 120 deny ip 10.10.30.0 0.0.0.255 10.10.10.0 0.0.0.255                                                                                                     

R2(config)# access-list 120 deny ip 10.10.30.0 0.0.0.255 10.10.20.0 0.0.0.255                                                                                                     

R2(config)# access-list 120 permit ip 10.10.30.0 0.0.0.255 any                                                                                                                             

R2(config)#                                                                                                                                                                                                             

R2(config)# ip nat inside source list 120 interface Gi2/0 overload                                                                                                                           

R2(config)#   

  

Les résultats des Tests sont les suivantes (Access Internet OK, Access Privé Site Distant KO) : 

 

 

Conf d’un Tunnel GRE entre R1 et R2 : 

Dans ce qui suit, on va détailler étape par étape les Confs à Implémenter.  

Tout d’abord, il suffit de configurer l’interface Logique du Tunnel à créer avec un plan d’adressage unique qui n’existe pas. On a besoin de l’IP Publique WAN de sortie de Routeur Local ainsi que l’IP Publique (WAN) du Site distant. La conf est la suivante (R1 et R2) : 

 

R1(config)# interface Tunnel0                                                                                                                                                                                     

R1(config-if)# ip address 172.16.100.1 255.255.255.252                                                                                                                                         

R1(config-if)# ip mtu 1400                                                                                                                                                                                           

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

R1(config-if)# tunnel source 1.1.1.1                                                                                                                                                                           

R1(config-if)# tunnel destination 3.3.3.2 

 

R2(config)# interface Tunnel0                                                                                                                                                                                     

R2(config-if)# ip address 172.16.100.2 255.255.255.252                                                                                                                                           

R2(config-if)# ip mtu 1400                                                                                                                                                                                         

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

R2(config-if)# tunnel source 3.3.3.2                                                                                                                                                                           

R2(config-if)# tunnel destination 1.1.1.1  

 

Les deux extrémités crées du Tunnel se voient :  

 

La deuxième étape est de Router le LAN des Vlans 10 et 20 ainsi que le LAN 30 et les forcer à circuler à travers le Tunnel0 et pas la route par défaut de l’interface WAN Publique :  

 

R1(config)# ip route 10.10.30.0 255.255.255.0 172.16.100.2 

 

R2(config)# ip route 10.10.10.0 255.255.255.0 172.16.100.1                                                                                                                             

R2(config)# ip route 10.10.20.0 255.255.255.0 172.16.100.1 

 

Voilà, c’est Simple, et c’est largement suffisant pour faire communiquer les deux Sites distants : )  

Le PC1 arrive maintenant à Pinger le PC3 du Site distant (en gardant son Access Internet) :

 

A ce niveau-là, les flux ne sont pas cryptés et circulent en clair encapsulés dans des trames GRE. Il faut ajouter la couche Sécurité (cryptage) : L’IPSec.  

Les étapes de Conf sont deux : Phase 1 (ISAKMP) et Phase 2 (IPSec).  

Concernant la Phase1, les paramètres choisis de ISAKMP SA sont :  

3DES pour le Cryptage, MD5 comme algorithme de Hachage, Pre-shared key comme méthode d’authentification et Group 2 est le Diffie-Hellman groupe à utiliser pour l’échange de clés.  

 

La conf est la suivante :  

 

R1(config)# crypto isakmp policy 1                                                                                                                                                                           

R1(config-isakmp)# encryption 3des                                                                                                                                                                         

R1(config-isakmp)# hash md5                                                                                                                                                                                   

R1(config-isakmp)# authentication pre-share                                                                                                                                                           

R1(config-isakmp)# group 2                                                                                                                                                                                       

R1(config-isakmp)# lifetime 86400                                                                                                                                                                             

R1(config-isakmp)#exit                                                                                                                                                                                           

R1(config)# crypto isakmp key Cisco address 3.3.3.2  

 

R2(config)# crypto isakmp policy 1                                                                                                                                                                             

R2(config-isakmp)# encryption 3des                                                                                                                                                                         

R2(config-isakmp)# hash md5                                                                                                                                                                                   

R2(config-isakmp)# authentication pre-share                                                                                                                                                             

R2(config-isakmp)# group 2                                                                                                                                                                                       

R2(config-isakmp)# lifetime 86400                                                                                                                                                                           

R2(config-isakmp)#exit                                                                                                                                                                                           

R2(config)# crypto isakmp key Cisco address 1.1.1.1 

 

On passe par suite à la Phase 2 : 

On crée le Transform Set avec les paramètres choisis suivants : ESP-3DES (méthode de cryptage), MD5 (Algorithme de hachage) et le mode utilisé est “Transport mode”.  

 

R1(config)# crypto ipsec transform-set SET esp-3des esp-md5-hmac 

R1(cfg-crypto-trans)# mode transport 

 

R2(config)# crypto ipsec transform-set SET esp-3des esp-md5-hmac 

R2(cfg-crypto-trans)# mode transport 

 

Finalement on crée le IPSec Profile afin de collecter et appliquer les deux Phase 1 (ISAKMP) et 2 (Transform SET) ensemble.  

 

R1(config)# crypto ipsec profile GRE                                                                                                                                                                           

R1(ipsec-profile)# set security-association lifetime seconds 86400                                                                                                                           

R1(ipsec-profile)# set transform-set SET 

 

R2(config)# crypto ipsec profile GRE                                                                                                                                                                           

R2(ipsec-profile)# set security-association lifetime seconds 86400                                                                                                                             

R2(ipsec-profile)# set transform-set SET 

 

La Conf de IPSec Profile est appliquée sous l’Interface tunnel crée ! Voilà ! 

 

R1(config)# interface Tunnel 0 

R1(config-if)# tunnel protection ipsec profile GRE 

 

R2(config)# interface Tunnel 0 

R2(config-if)# tunnel protection ipsec profile GRE  

 

La vérification de Cryptage des Flux s’effectue avec les deux commandes suivantes : 

“show crypto isakmp sa” et “show crypto session detail”