Objectifs

Permettre de relier 2 réseaux distincts via un tunnel GRE.

Le protocole GRE permet de relier des réseaux IP différents en masquant le ou les réseaux routés intermédiaires. Pour cela un paquet IP d'un reseau A, à destination du réseau B, à l'entrée du tunnel, est encapsulé dans un autre paquet IP pour être transmis via les réseaux intermédaires (ex: internet, réseau WAN etc). Arrivé sur le réseau B, à l'autre bout du tunnel, le paquet IP est désencapsulé et peut reprendre son trajet sur le réseau B. Ainsi sur le réseau B, ce paquet ne porte plus aucune trace d'un transport sur d'autres réseaux intermédiaires.

Attention, par contre, vu qu'il s'agit d'une encapsulation d'IP sur IP, sans autre traitement, les données sont donc transmises en claire. Pour chiffrer les données, et ainsi sécuriser leur transport sur les réseaux intermédiaires, il est possible par exemple d'utiliser IPSec par dessus le tunnel GRE. Cependant, s'il s'agit de faire transiter que des flux déjà chiffrés (ssh, https, etc), GRE garde tout son intérêt, grâce à sa simplicité de mise en oeuvre, et à sa légèreté.

Topologie de la maquette

Plages d'adresses des 2 reseaux à relier:

  • 192.168.16.x pour le réseau A
  • 192.168.22.x pour le réseau B

Le réseau WAN utilisé pour le tunnel possède une plage d'ip en 192.168.122.x.

Le serveur OpenBSD sur le réseau A, appellé tun.a, possède les adresses IP suivantes:

  • 192.168.122.16 sur le réseau WAN
  • 192.168.16.254 sur le réseau A

Le serveur OpenBSD sur le réseau B, appellé tun.b, possède les adresses IP suivantes:

  • 192.168.122.22 sur le réseau WAN
  • 192.168.22.254 sur le réseau B

Voir le schéma suivant:

Tunnel GRE

Pré-requis

Pare-feu

Dans un premier temps, pour faciliter la mise en oeuvre, n'appliquons aucun filtrage sur les interfaces GRE.

Ajouter la ligne suivante, sur les 2 serveurs, dans le début du fichier /etc/pf.conf:

set skip on gre0

Autorisation des tunnels GRE

Pour autoriser au niveau du noyau les tunnels de type GRE, il faut ajouter sur les 2 serveurs, la ligne suivante dans /etc/sysctl.conf:

net.inet.gre.allow=1

Et pour l'appliquer immédiatement, taper la commande suivante:

# sysctl -w net.inet.gre.allow=1

Autorisation du routage

Pour activer le routage IP, il faut ajouter la ligne suivante dans /etc/sysctl.conf:

net.inet.ip.forwarding=1

Et pour l'appliquer immédiatement, taper la commande suivante:

# sysctl -w net.inet.ip.forwarding=1

Configuration

Il s'agit de configurer un tunnel utilisant les adresses suivantes à ses extrémités:

  • 172.16.0.1 sur tun.a
  • 172.16.0.2 sur tun.b

L'interface utilisée pour le tunnel sera nommée gre0 en rapport avec le protocole utilisé GRE.

Sur le serveur tun.a

Contenu du fichier /etc/hostname.gre0

172.16.0.1 172.16.0.2 netmask 0xffffffff link0 up
tunnel 192.168.122.16 192.168.122.22
!route add -net 192.168.22 -netmask 255.255.255.0 172.16.0.2

Sur le serveur tun.b

Contenu du fichier /etc/hostname.gre0

172.16.0.2 172.16.0.1 netmask 0xffffffff link0 up
tunnel 192.168.122.22 192.168.122.16
!route add -net 192.168.16 -netmask 255.255.255.0 172.16.0.1

Validation

Il faut s'assurer que le traffic est bien routé vers l'entrée du tunnel, soit le serveur OpenBSD fait office de passerelle par défaut pour les clients de son réseau, soit il faut ajouter sur ces derniers, une route pour indiquer que les flux vers réseau distant doit passer par le serveur OpenBSD.

Exemple de route à ajouter sur un client Linux du réseau A en 192.168.16.0/24:

# ip route add 192.168.22.0/24 via 192.168.16.254

La même chose pour un client Linux du réseau B en 192.168.22.0/24:

# ip route add 192.168.16.0/24 via 192.168.22.254

Ensuite un simple ping d'un client A vers un client B devrait fonctionner:

[client01.a] $ ping 192.168.22.1
host 192.168.22.1 is alive!

voila!

Exemple de trames interceptées par un tcpdump sur un des serveurs OpenBSD:

12:20:43.026311 FF:FF:00:e8:e7:aa 52:54:00:3f:44:e6 0800 122: gre 192.168.122.16 > 192.168.122.22:  192.168.16.1 > 192.168.22.1: icmp: echo request (id:7e77 seq:243) (ttl 254, id 22932, len 84) (ttl 64, id 30293, len 108)
12:20:43.027113 FF:FF:00:3f:44:e6 52:54:00:e8:e7:aa 0800 122: gre 192.168.122.22 > 192.168.122.16:  192.168.22.1 > 192.168.16.1: icmp: echo reply (id:7e77 seq:243) (ttl 254, id 7409, len 84) (ttl 64, id 33582, len 108)

Ce qui confirme que le ping est bien transmis, et que les trames GRE passent bien en claires, car on voit des paquets GRE entre nos serveurs OpenBSD avec leurs adresses IP du réseau WAN, et à l'intérieur du paquet, les requetes ICMP sur les réseaux A et B.