GRE

Un tunnel GRE est la façon la plus simple de créer un tunnel entre deux points. Ce tunnel permet d’encapsuler dans la couche réseau (niveau 3 OSI) n’importe quel paquet IP.

GRE a été créé à l’origine par CISCO et est porté actuellement sur différents UNIX, Linux et BSD notamment. Un des principaux avantages des GRE est qu’il permet de conserver une liaison permanente entre deux points en ne concervant pas l’état.

L’avantage principal est la flexibilité du système, en effet, en créant un tunnel entre ces deux points sans états, toute modification topologique au niveau des routes ne posera pas de problème. L’inconvénient principal est que, si le tunnel GRE tombe, il se transformera en trou noir absorbant les paquets. Il convient dans ce cas de mettre en place des protocoles de routage dynamique comme OSPF et RIP.

En terme de disponbilité, GRE ne pourra être désactivé que dans les cas suivants:

  • Il n’y a plus de route vers la machine distance
  • Une des interfaces est en panne/éteinte
  • La route vers le tunnel est le tunnel lui-même

Configuration

La configuration de GRE se fait en deux étapes, et sur les deux machines de manière analogue.

Prenons l’exemple suivant:

servA

  • Adresse IP 2.2.2.224
  • Adresse de tunnel 192.168.255.132

servB

  • Adresse IP 3.3.3.324
  • Adresse de tunnel 192.168.255.232

Sous BSD

Activez tout d’abord le support de GRE sur chacun des serveurs en tapant la commande suivante:

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

Pour le rendre permanent ajouter la ligne net.inet.gre.allow=1 au fichier /etc/sysctl.conf

Créons maintenant le tunnel sur servA

servA# ifconfig gre0 create
servA# ifconfig gre0 192.168.255.1 192.168.255.2 netmask 255.255.255.255 link0 up
serv1# ifconfig gre0 tunnel 2.2.2.2 3.3.3.3

Puis sur servB:

servB# ifconfig gre0 create
servA# ifconfig gre0 192.168.255.2 192.168.255.1 netmask 255.255.255.255 link0 up
serv1# ifconfig gre0 tunnel 3.3.3.3 2.2.2.2

La première commande créée une interface de type GRE. On définit l’adresse IP GRE source et destination du tunnel, avec un masque /32, et un lien virtuel link0 à l’état actif. Et ensuite on définit le tunnel entre l’adresse IP locale réelle et l’adresse IP distante réelle.

Voici l’état de l’interface à ce moment:

gre0: flags=9011<UP,POINTOPOINT,LINK0,MULTICAST> mtu 1476
        priority: 0
        groups: gre
        physical address inet 2.2.2.2 --> 3.3.3.3
        inet 192.168.255.1 --> 192.168.255.2 netmask 0xffffffff

Sous Linux

Sous Linux GRE est activé par défaut. Créons le tunnel sur servA

servA# ip tunnel add gre0 mode gre remote 3.3.3.3 local 2.2.2.2 ttl 255
servA# ip link set gre0 up
servA# ip addr add 192.168.255.1/32 dev gre0

et maintenant sur servB

servB# ip tunnel add gre0 mode gre remote 2.2.2.2 local 3.3.3.3 ttl 255
servB# ip link set gre0 up
servB# ip addr add 192.168.255.2/32 dev gre0

On créé ici un tunnel GRE nommé tun0 et on spécifie l’adresse IP source réelle et destination réelle. On configure l’adresse, on allume l’interface, et on définit le pointopoint (adresse de tunnel distante). On va également activer le multicast (utile pour OSPF ou RIP par exemple).

Test final

Vous pouvez désormais tester que le tunnel fonctionne en lancant un ping sur l’autre partie du tunnel

# ping 192.168.255.2
PING 192.168.255.2 (172.16.0.2): 56 data bytes
64 bytes from 192.168.255.2: icmp_seq=0 ttl=255 time=0.555 ms
64 bytes from 192.168.255.2: icmp_seq=1 ttl=255 time=0.658 ms
64 bytes from 192.168.255.2: icmp_seq=2 ttl=255 time=0.958 ms

Sauvegarde du tunnel

OpenBSD

Ouvrez le fichier /etc/hostname.gre0 et inscrivez la configuration suivante (ici sur servA)

192.168.255.1 192.168.255.2 netmask 255.255.255.255 link0 up
tunnel 2.2.2.2 3.3.3.3

FreeBSD

Ouvrez le fichier /etc/rc.conf et ajoutez les lignes suivantes:

cloned_interfaces="gre0"
ifconfig_gre0="192.168.255.1 192.168.255.2 netmask 255.255.255.0 tunnel 2.2.2.2 3.3.3.3"

Debian

Ouvrez le fichier /etc/network/interfaces et ajoutez les lignes suivantes:

auto tun0
iface tun0 inet static
       address 192.168.255.1
       netmask 255.255.255.255
       up ifconfig tun0 multicast
       pre-up iptunnel add tun0 mode gre remote 3.3.3.3 local 2.2.2.2 ttl 255
       pointopoint 192.168.255.2
       post-down iptunnel del tun0

Conclusion

Vous savez désormais configurer un Tunnel GRE sous Linux & BSD, ce tunnel peut permettre de relier deux sites distants, il convient de mettre en place du routage (dans l’idéal dynamique), et mettre en place IPSec over GRE permet de crypter l’ensemble des données entre les deux sites.