Interconnexion de LAN avec Tinc VPN

Je vais tenter de présenter la façon d'interconnecter 2 réseaux locaux avec Tinc VPN Ceci peut s'appliquer quelque soit la localisation des 2 réseaux. Que ce soit un VRACK OVH, un LAN d'entreprise ou autre. Je ne vais pas rentrer dans le détail de la configuration des LAN, je pars du principe que les 2 réseaux sont déjà opérationnels. Pour info je ne monte pas la solution en "labo" et je ne l'ai pas en prod non plus. Par conséquent je ne peux pas tester la procédure, mais elle devrait fonctionner.

Présentation de Tinc VPN
Présentation du réseau
Installation de Tinc
Routage
Routage Avancé


Présentation de Tinc VPN

J'aime beaucoup ce VPN car il est extrêmement robuste. Il ne m'a jamais fait défaut, stable, léger, fiable. Tinc n'a pas vraiment vocation à fonctionner en mode "client-serveur" comme le ferait Open VPN mais il est surtout utilisé pour créer un maillage de réseaux. Vous pouvez sans problème connecter des dizaines de réseaux entres eux sans qu'il y est besoin d'un point central. Vous pouvez très bien avoir 3 réseaux, A B et C. B et C peuvent se connecter à A, mais si un client du réseau B à besoin d'accéder à une ressource du réseau C il n'aura pas besoin de passer par A. Tinc va propager la "topographie" du réseau à chacun des noeuds du réseau. Chaque noeud peut librement se connecter aux autres autres directement.

De + en cas de coupure réseau, tinc continuera d'essayer de se reconnecter sans planter ou s'arrêter. Le délais d'essai entre deux connexions va progressivement augmenter jusqu'a atteindre un maximum de quelques minutes.


Présentation du réseau

Voici le super réseau que j'ai fais de mes mains, on ne se moque pas. Nous avons 1 premier LAN en 10.0.0.0/24 avec un routeur en 10.0.0.254 Le 2° LAN est en 10.0.1.0/24 et son routeur en 10.0.1.254 Le VPN lui est en 10.1.0.0/24 et les 2 routeurs en 10.1.0.1 et 10.1.0.2

Je pars du principe que l'on peut déployer Tinc sur les routeurs (serveur linux ou autre). A noter que dans le cas d'une box ce n'est pas possible ce qui imposera de passer par un serveur tiers. Perso j'ai un petit rasperry qui tourne dans un placard chez moi et qui fait le job depuis des années.

Vous noterez que les 3 réseaux sont sur des subnet différents. C'est indispensable pour que le routage fonctionne. Il faut savoir que tinc permet un mode "bridge", qui permet d'utiliser le même plan IP sur tous les réseaux. Mais c'est à déconseiller, car dans ce mode le broadcast passe le routeur, tout comme les requêtes DHCP... Il faut mieux bien séparer ses réseaux, c'est + simple et + safe.


Installation de Tinc

Je vais présentation l'installation de Tinc sur Debian. Il me semble que depuis Debian 9 Tinc est dispo dans les repos. Mais en cas de besoin il s'installe très bien depuis les sources.

Tout d'abord le classique :
apt-get -y install tinc

Tinc a besoin du mod TUN - Universal TUN/TAP device driver.
modprobe tun

La configuration de tinc va se trouver dans le dossier /etc/tinc/ Il faut créer un dossier pour le VPN que nous voulons créer, il est ainsi possible d'avoir plusieurs réseaux sur le même serveur Nous appellerons notre réseau "vpn" tout simplement. Pour cela il faut créer 2 dossiers :
mkdir /etc/tinc/vpn
mkdir /etc/tinc/vpn/hosts

Plusieurs fichiers de configurations vont être nécessaire au bon fonctionnement de tinc. Pour cela nous allons "nommer" nos routeurs. Il y aura routeur1 sur LAN1 et routeur2 sur LAN2.

Tout d'abord pour routeur1 nous allons configurer le fichier tinc.conf dans /etc/tinc/vpn/
Name = routeur1
Interface = vpn
ConnectTo = routeur2

La même chose sur routeur2 :
Name = routeur2
Interface = vpn
ConnectTo = routeur1

Je traduis. La 1ère ligne est le nom que l'on va donner au "noeud" tinc. La 2° ligne sert à déterminer le nom de l'interface réseau à utiliser. Et enfin la 3° ligne détermine à quel noeud on doit se connecter. Pour se connecter à plusieurs noeuds il faut simplement plusieurs lignes "ConnectTo".

Le 2° fichier qui sera important sera tinc-up toujours dans /etc/tinc/vpn/. Point très important, ce fichier doit être exécutable ! Par conséquent ne pas oublier de faire :
chmod +x tinc-up

Voici à quoi ressemble ce fichier pour routeur1 :
#!/bin/sh
ip address add 10.1.0.1/24 brd + dev vpn
ip link set dev vpn up
ip route add 10.0.1.0/24 via 10.1.0.2

Et pour routeur2 :
#!/bin/sh
ip address add 10.1.0.2/24 brd + dev vpn
ip link set dev vpn up
ip route add 10.0.0.0/24 via 10.1.0.1

Petite traduction.
Première ligne pour dire d'exécuter le code avec /bin/sh
La 2° ligne va configurer l'adresse IP.
La 3° sert à "monter" l'interface réseau
La dernière ligne va permettre de configurer la route pour accéder au LAN distant.
J'aborderai ce point + en détail par la suite dans la partie routage.

Pour que tout soit fonctionnel nous avons besoin d'un fichier supplémentaire. Ce fichier porte le nom du noeud définit dans tinc.conf et se situe dans /etc/tinc/vpn/hosts/

Comme toujours nous allons commencer par routeur1 :
Le fichier doit être configuré sur routeur1 dans /etc/tinc/vpn/hosts et se nomme routeur1.
Voici ce qu'il contient :
Subnet = 10.1.0.1/32
Subnet = 10.0.0.0/24
Compression = 0
Address = routeur1.tld
Port = 655

Et la même chose pour routeur2 :
Subnet = 10.1.0.2/32
Subnet = 10.0.1.0/24
Compression = 0
Address = routeur2.tld
Port = 655

Comme toujours voici l'explication pour chaque ligne :
Les 2 lignes Subnet servent à indiquer les réseaux derrières ce noeud. Ici pour routeur1 il s'agit de sa propre IP : 10.1.0.1/32 ainsi que le LAN derrière lui : 0.0.0.0/24.
La 3° ligne avec Compression permet de définir un niveau de..... compression... usqu'à 11.
Pour la 4° ligne Address il s'agit là de l'adresse "publique" du routeur. Celle qui sera accessible depuis internet et dont le port 655 est accessible.
Et enfin la 5° ligne va déterminer le n° de Port sur lequel va écouter le service, utile si vous avez plusieurs réseaux avec Tinc sur le même serveur. Bien penser à ouvrir le port en TCP et UDP.

Maintenant que nous avons nos fichiers de configuration il faut créer les clés publique et privé pour chaque noeud.
Cette commande doit être exécuté sur chaque routeur.
Elle va créer le fichier /etc/tinc/vpn/rsa_key.priv et ajouter la clé publique dans /etc/tinc/vpn/hosts/

Cette commande est la suivante, il faut valider 2x :
tincd -n vpn -K

Bon, on arrive à la fin !
Maintenant il faut copier le fichier dans /etc/tinc/vpn/hosts sur chaque routeur.
Ainsi nous devons avoir les fichiers routeur1 et routeur2 sur chaque routeur.
En prenant bien soin de vérifier que ces fichiers contiennent bien la partie clé publique.
ça ressemble à ça :
-----BEGIN RSA PUBLIC KEY-----
....
-----END RSA PUBLIC KEY-----

Une fois cela fait on va pouvoir enregistrer le service pour le démarrage auto.
Voici les commandes à faire pour enregistrer le service et le démarrer :
systemctl enable tinc@vpn
systemctl start tinc@vpn.service

A partir de ce moment vous devriez avoir une interface réseau du nom de vpn si vous listez vos adresses :
ip a

Avec bien entendu la bonne IP sur chaque routeur.
Pour s'assurer que tout est ok il faut tenter de pinger l'autre routeur.
Par exemple depuis routeur1 :
ping 10.1.0.2


Routage

Maintenant que Tinc est bien configuré passons à la question du routage.
Pour se faire je remet le merveilleux schéma de notre réseau.

Notre objectif étant que les postes clients du réseau 1 puissent accéder aux postes clients du réseau 2.
On notera que cela peut être des serveurs, des routeurs, osef, le but étant que les différents équipements des deux réseaux puissent communiquer ensemble.

Comme nous l'avons vu juste avant les 2 routeurs sont censés pouvoir communiquer entres eux via leur IP sur le VPN.
Nous avons également ajouté des routes vers les différents LAN dans tinc-up avec la commande :
ip route add 10.0.1.0/24 via 10.1.0.2

Cette commande sert à dire à routeur1 que pour accéder au réseau 10.0.1.0/24 il doit passer par le routeur à l'IP 10.1.0.2

Pour aller plus loin on va vérifier si routeur1 peut communiquer avec l'adresse privée de routeur2.
Cela via la commande :
ping 10.0.1.254

Normalement arrivé à ce niveau cela devrait fonctionner. Vous devriez également pouvoir communiquer entre les 2 LANs directement. Pensez à vérifier vos règles de filtrage sur les parefeu.


Routage Avancé

J'ai présenté la configuration a réaliser si Tinc est directement installé sur les routeurs.
Malheureusement cela n'est pas toujours possible, comme avec une box par exemple.

Dans ce cas je vais faire l'explication avec un routeur dédié à Tinc à l'intérieur des réseaux locaux.

Comme nous pouvons le voir ici, le VPN passe désormais par 2 serveurs Linux, dont les ips sont 10.0.0.250 et 10.0.1.250.
Cela ne va strictement rien changer à la configuration de Tinc.
Par contre, il va falloir créer des routes additionnelles sur les routeurs.
En effet, les routeurs doivent savoir comment accéder aux autres réseaux. Ces réseaux n'étant pas directement connectés aux routeurs il faut leur donner les routes.

Tout d'abord sur routeur1 nous allons ajouter les routes suivantes :
Je mets la syntaxe Linux, mais c'est à adapter à chaque équipement.
ip route add 10.0.1.0/24 via 10.0.0.250
ip route add 10.1.0.0/24 via 10.0.0.250

Ensuite sur routeur2 il faut ajouter ces routes :
ip route add 10.0.0.0/24 via 10.0.1.250
ip route add 10.1.0.0/24 via 10.0.1.250

Maintenant prenons l'exemple d'un poste sur LAN1 qui souhaite communiquer avec un serveur sur LAN2.
Le client va faire un ping sur 10.0.1.1 par exemple.
10.0.1.1 ne faisant pas parti du même LAN que lui, et ne connaissant pas de route directe le système va demander à sa passerelle par défaut (ici routeur1) comment joindre ce réseau.
Le routeur dans ce cas vérifie sa table de routage, et comme nous l'avons déclaré plus haut, pour accéder à 10.0.1.0/24 il faut passer par 10.0.0.250.
Ainsi routeur1 va transmettre son paquet au routeur tinc en 10.0.0.250.
Ce même routeur vérifie sa propre table de routage, il connaît bien 10.0.1.0/24, on a déclaré la route dans le fichier tinc-up.
Et pour accéder à 10.0.1.0/24 le routeur doit envoyer le paquet à 10.1.0.2 d'après la règle que nous avons configuré.
Il connaît la route pour 10.1.0.2 car c'est sur le même réseau que sa patte 10.1.0.1.
Arrivé au 2° routeur celui ci transmet le paquet au serveur sur sa patte dans le LAN.

Mais là attention, le serveur doit pouvoir répondre, et il ne connaît pas le réseau 10.0.0.0/24 du client !
C'est là que nous empruntons le chemin inverse.
Le serveur demande à son routeur en 10.0.1.254 comment accéder à 10.0.0.0/24.
Celui ci lui répond qu'il faut envoyer le paquet à 10.0.1.250, qui lui même enverra le paquet à routeur1 qui transmettra la réponse au client.

La subtilité dans cette configuration c'est de bien configurer toutes les routes sur les "passerelles par défaut" des postes clients de chaque réseau.
A défaut de pouvoir créer ces routes sur routeur1 et routeur2 il faudra les créer sur chaque poste client.