GRE est un protocole de tunnel qui a été à l'origine développé par Cisco, et qui peut réaliser plus de choses que le tunnel IP dans IP. Par exemple, vous pouvez aussi transporter du trafic multi-diffusion (multicast) et de l'IPv6 à travers un tunnel GRE.
Dans Linux, vous aurez besoin du module ip_gre.o.
Dans un premier temps, intéressons-nous au tunnel IPv4 :
Disons que vous avez trois réseaux : 2 réseaux internes A et B, et un réseau intermédiaire C (ou disons internet).
Les caractéristiques du réseau A sont :
réseau 10.0.1.0 masque de sous-réseau 255.255.255.0 routeur 10.0.1.1
Le routeur a l'adresse 172.16.17.18
sur le réseau C. Appelons ce réseau neta
.
Et pour le réseau B :
réseau 10.0.2.0 masque de sous-réseau 255.255.255.0 routeur 10.0.2.1
Le routeur a l'adresse 172.19.20.21
sur le réseau C. Appelons ce réseau netb
.
En ce qui concerne le réseau C, nous supposerons qu'il transmettra n'importe quels paquets de A vers B et vice-versa. Comment et pourquoi, on s'en moque.
Sur le routeur du réseau A, nous faisons la chose suivante :
ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255 ip link set netb up ip addr add 10.0.1.1 dev netb ip route add 10.0.2.0/24 dev netb
Discutons un peu de cela. Sur la ligne 1, nous avons ajouté un
périphérique tunnel, que nous avons appelé netb
(ce qui est évident, dans la mesure où c'est
là que nous voulons aller). De plus, nous lui avons dit d'utiliser
le protocole GRE (mode gre
), que l'adresse distante est 172.19.20.21
(le routeur de l'autre côté), que nos
paquets « tunnelés » devront être générés à partir
de 172.16.17.18
(ce qui autorise votre
serveur à avoir plusieurs adresses IP sur le réseau C et ainsi vous
permet de choisir laquelle sera utilisée pour votre tunnel) et que
le champ TTL de vos paquets sera
fixé à 255 (ttl 255
).
La deuxième ligne active le périphérique.
Sur la troisième ligne, nous avons donné à cette nouvelle
interface l'adresse 10.0.1.1
. C'est
bon pour de petits réseaux, mais quand vous commencez une
exploitation minière (BEAUCOUP de tunnels !), vous pouvez
utiliser une autre gamme d'adresses IP pour vos interfaces
« tunnel » (dans cet exemple, vous
pourriez utiliser 10.0.3.0
).
Sur la quatrième ligne, nous positionnons une route pour le
réseau B. Notez la notation différente pour le masque de
sous-réseau. Si vous n'êtes pas familiarisé avec cette notation,
voici comment ça marche : vous écrivez le masque de sous-réseau
sous sa forme binaire, et vous comptez tous les 1. Si vous ne savez
pas comment faire cela, rappelez-vous juste que 255.0.0.0
est /8, 255.255.0.0
est /16 et 255.255.255.0
est /24. Et 255.255.254.0
est /23, au cas où ça vous
intéresserait.
Mais arrêtons ici, et continuons avec le routeur du réseau B.
ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255 ip link set neta up ip addr add 10.0.2.1 dev neta ip route add 10.0.1.0/24 dev neta
Et quand vous voudrez retirer le tunnel sur le routeur A :
ip link set netb down ip tunnel del netb
Bien sûr, vous pouvez remplacer netb
par neta
pour le
routeur B.
Voir la section 6 pour une courte description des adresses IPv6.
À propos des tunnels.
Supposons que vous ayez le réseau IPv6 suivant, et que vous vouliez le connecter à une dorsale IPv6 (6bone) ou à un ami.
Réseau 3ffe:406:5:1:5:a:2:1/96
Votre adresse IPv4 est 172.16.17.18
, et le routeur 6bone a une adresse
IPv4 172.22.23.24
.
ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255 ip link set sixbone up ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone ip route add 3ffe::/15 dev sixbone
Voyons cela de plus près. Sur la première ligne, nous avons créé
un périphérique tunnel appelé sixbone
.
Nous lui avons affecté le mode sit
(qui est le tunnel IPv6 sur IPv4) et lui avons dit où l'on va
(remote
) et d'où l'on vient
(local
). TTL
est configuré à son maximum : 255
. Ensuite, nous avons rendu le périphérique
actif (up
). Puis, nous avons ajouté
notre propre adresse réseau et configuré une route pour
3ffe::/15
à travers le tunnel.
Les tunnels GRE constituent actuellement le type de tunnel préféré. C'est un standard qui est largement adopté, même à l'extérieur de la communauté Linux, ce qui constitue une bonne raison de l'utiliser.