Introduction

Tinc est un démon de réseau privé virtuel (VPN) open source doté de fonctions utiles telles que le cryptage, la compression optionnelle et le routage automatique de maillage qui peut opportunément acheminer le trafic VPN directement entre les serveurs. Ces caractéristiques différencient Tinc des autres solutions de VPN, et en font un bon choix pour créer un VPN à partir de nombreux petits réseaux géographiquement distribués.

Dans ce tutoriel, nous allons voir comment utiliser Tinc pour créer un VPN sécurisé sur lequel vos serveurs peuvent communiquer comme s'ils étaient sur un réseau local. Nous montrerons également comment utiliser Tinc pour créer un tunnel sécurisé vers un réseau privé. Nous utiliserons des serveurs Ubuntu 18.04, mais les configurations peuvent être adaptées pour être utilisées avec n'importe quel autre système d'exploitation.

Objectifs

Afin de couvrir des cas d'utilisation multiples, ce tutoriel explique comment connecter un nœud client au VPN via une interface de réseau privé et un autre via une interface publique. Vous pouvez toutefois adapter ce dispositif à vos propres besoins. Il vous suffit de planifier la manière dont vous souhaitez que vos serveurs accèdent les uns aux autres et d'adapter les exemples présentés dans ce tutoriel à vos propres besoins. Si vous l'adaptez à votre propre configuration, veillez à remplacer les valeurs mises en évidence dans les exemples par vos propres valeurs. Cependant, il peut être dans votre intérêt de suivre d'abord le tutoriel tel qu'il est écrit pour vous assurer que vous comprenez les composants et les processus impliqués avant de modifier ces instructions.

Pour simplifier les choses, ce tutoriel fera référence aux serveurs comme ceci :

  • server-01 : tous les nœuds VPN se connecteront à cette machine, et la connexion doit être maintenue pour que le VPN fonctionne correctement. Des serveurs supplémentaires peuvent être configurés de la même manière que celui-ci pour assurer la redondance, si vous le souhaitez
  • client-01 : se connecte au nœud VPN du server-01 en utilisant son interface de réseau privé
  • client 02 : se connecte au nœud VPN du server-01 via l'interface du réseau public

Remarque : Tinc lui-même ne fait pas de différence entre les serveurs (machines qui hébergent et fournissent des services VPN) et les clients (les machines qui se connectent au réseau privé sécurisé et l'utilisent), mais il peut être utile de comprendre et de visualiser le fonctionnement de Tinc en pensant à vos serveurs de cette manière.

Voici un schéma du VPN que nous voulons mettre en place :

Configuration du VPN Tinc

La case bleue représente notre VPN et la rose représente le réseau privé sous-jacent. Les trois serveurs peuvent communiquer sur le VPN, même si le réseau privé est par ailleurs inaccessible au client 02.

Conditions préalables

Si vous souhaitez suivre ce tutoriel à la lettre, mettez à disposition deux serveurs Ubuntu 18.04 (server-01 et client-01) dans le même centre de données et autorisez la mise en réseau privée sur chacun d'eux. Ensuite, créez un autre serveur Ubuntu 18.04 (client-02) dans un centre de données séparé. Chaque serveur doit être doté d'un utilisateur administratif et d'un pare-feu configuré avec ufw. Pour le mettre en place, suivez notre guide de configuration initiale du serveur pour Ubuntu 18.04.

De plus, plus loin dans ce tutoriel, nous aurons besoin de transférer quelques fichiers entre chaque machine en utilisant scp. Pour cette raison, vous devrez générer des clés SSH sur chacun de vos serveurs, ajouter à la fois les clés SSH du client 01 et du client 02 au fichier authorized_keys du serveur 01, puis ajouter la clé SSH du serveur 01 aux fichiers authorized_keys du client 01 et du client 02. Pour obtenir de l'aide pour la mise en place, consultez notre guide sur la mise en place des clés SSH sur Ubuntu 18.04.

Étape 1 - Installez Tinc

Tinc est disponible à partir des dépôts APT par défaut d'Ubuntu, ce qui signifie que nous pouvons l'installer avec seulement quelques commandes.

Si vous ne l'avez pas fait récemment, exécutez la commande suivante sur chaque serveur pour mettre à jour leurs index de package respectifs :

All servers
  • sudo apt update

Installez ensuite Tinc sur chaque serveur en exécutant la commande suivante :

All servers
  • sudo apt install tinc

En faisant cela, vous avez installé Tinc sur chacun de vos serveurs. Cependant, vous devrez apporter quelques modifications à la configuration de Tinc sur chaque machine afin de rendre votre VPN opérationnel. Commençons par mettre à jour server-01.

Étape 2 - Configurez le serveur Tinc

Tinc exige que chaque machine qui fera partie du VPN ait les trois éléments de configuration suivants :

  • Fichiers de configuration Tinc : Il existe trois fichiers distincts qui configurent le démon Tinc :
    • tinc.conf, qui définit le nom du réseau, le périphérique réseau sur lequel le VPN fonctionnera, et d'autres options VPN ;
    • tinc-up, un script qui active le périphérique réseau défini dans tinc.conf après le démarrage de Tinc ;
    • tinc-down, qui désactive l'appareil du réseau lorsque Tinc s'arrête.
  • Paires de clés publiques/privées : Tinc utilise des paires de clés publiques/privées pour s'assurer que seuls les utilisateurs disposant de clés valides peuvent accéder au VPN.
  • Fichiers de configuration de l'hôte : chaque machine (ou hôte) du VPN a son propre fichier de configuration qui contient l'adresse IP réelle de l'hôte et le sous-réseau où Tinc le servira

Tinc utilise un nom de réseau pour distinguer un VPN Tinc d'un autre. Cela est utile dans les cas où vous souhaitez mettre en place plusieurs VPN, mais il est recommandé d'utiliser un nom de réseau même si vous ne prévoyez de configurer qu'un seul VPN. Vous pouvez donner à votre VPN le nom de réseau que vous souhaitez, mais pour plus de simplicité, nous l'appellerons VPN nom de réseau.

Sur le server-01, créez la structure du répertoire de configuration pour le VPN :

server-01
  • sudo mkdir -p /etc/tinc/netname/hosts

Utilisez votre éditeur de texte préféré pour créer un fichier tinc.conf. Ici, nous utiliserons le nano :

server-01
  • sudo nano /etc/tinc/netname/tinc.conf

Ajoutez les lignes suivantes au fichier vide. Celles-ci configurent un noeud Tinc nommé server_01 avec une interface réseau appelée tun0 qui utilisera IPv4 :

server-01:/etc/tinc/netname/tinc.conf
Name = server_01
AddressFamily = ipv4
Interface = tun0

Avertissement : notez que la valeur après la directive Name comprend un tiret bas (_) plutôt qu'un trait d'union (-). C'est important, car Tinc exige que la valeur de Name ne contienne que des caractères alphanumériques ou de soulignement. Si vous utilisez un trait d'union ici, vous rencontrerez une erreur lorsque vous essaierez de lancer le VPN plus loin dans ce guide.

Enregistrez et fermez le fichier après avoir ajouté ces lignes. Si vous avez utilisé nano, faites-le en appuyant sur CTRL+X, Y, puis ENTER.

Ensuite, créez un fichier de configuration de l'hôte nommé server_01 dans le sous-répertoire hosts. En fin de compte, les nœuds clients utiliseront ce fichier pour communiquer avec le server-01 :

server-01
  • sudo nano /etc/tinc/netname/hosts/server_01

Encore une fois, notez que le nom de ce fichier contient un tiret bas plutôt qu'un trait d'union. Ainsi, il s'aligne sur la directive Name du fichier tinc.conf, ce qui permettra à Tinc d'ajouter automatiquement la clé RSA publique du serveur à ce fichier lorsque nous le générerons ultérieurement.

Ajoutez les lignes suivantes au fichier, en veillant à inclure l'adresse IP publique du server-01 :

server-01:/etc/tinc/netname/hosts/server_01
Address = server-01_public_IP_address
Subnet = 10.0.0.1/32

Le champ Address spécifie comment les autres nœuds se connecteront à ce serveur, et Subnet spécifie quel sous-réseau ce démon desservira. Enregistrez et fermez le fichier.

Ensuite, générez une paire de clés RSA publiques et privées pour cet hôte avec la commande suivante :

server-01
  • sudo tincd -n netname -K4096

Après avoir exécuté cette commande, vous serez invité à saisir des noms de fichiers où Tinc enregistrera les clés RSA publiques et privées :

Output
. . . Please enter a file to save private RSA key to [/etc/tinc/netname/rsa_key.priv]: Please enter a file to save public RSA key to [/etc/tinc/netname/hosts/server_01]:

Appuyez sur ENTER pour accepter les emplacements par défaut à chaque message-guide ; cela indiquera à Tinc de stocker la clé privée dans un fichier nommé rsa_key.priv et d'ajouter la clé publique au fichier de configuration de l'hôte server_01.

Ensuite, créez tinc-up, le script qui s'exécutera à chaque fois que le VPN netname est lancé :

server-01
  • sudo nano /etc/tinc/netname/tinc-up

Ajoutez les lignes suivantes :

server-01:/etc/tinc/netname/tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.1/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Voici ce que fait chacune de ces lignes :

  • ip link ... : définit le statut de l'interface de réseau virtuel de Tinc comme activé
  • ip addr ... : ajoute l'adresse IP 10.0.0.1 avec un masque de réseau de 32 à l'interface réseau virtuelle de Tinc, ce qui fera que les autres machines sur le VPN verront l'adresse IP du server-01 comme étant 10.0.0.1
  • ip route ... : ajoute un itinéraire (10.0.0.0/24) qui peut être atteint sur l'interface du réseau virtuel de Tinc

Enregistrez et fermez le fichier après avoir ajouté ces lignes.

Ensuite, créez un script pour supprimer l'interface de réseau virtuel lorsque votre VPN est arrêté :

server-01
  • sudo nano /etc/tinc/netname/tinc-down

Ajoutez les lignes suivantes :

server-01:/etc/tinc/netname/tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down

Ces lignes ont les effets opposés à ceux du script tinc-up :

  • ip route ... : supprime l'itinéraire 10.0.0.0/24
  • ip addr ... : supprime l'adresse IP 10.0.0.1 de l'interface réseau virtuelle de Tinc
  • ip link ... : définit le statut de l'interface de réseau virtuel de Tinc comme down

Enregistrez et fermez le fichier, puis rendez ces deux nouveaux scripts réseau exécutables :

server-01
  • sudo chmod 755 /etc/tinc/netname/tinc-*

Pour terminer la configuration du server-01, ajoutez une règle de pare-feu qui autorisera le trafic par le port 655, le port par défaut de Tinc :

server-01
  • sudo ufw allow 655

Le server-01 est maintenant entièrement configuré et vous pouvez passer à la configuration de vos nœuds clients.

Étape 3 - Configurez les nœuds clients

Vos deux machines clientes nécessiteront une configuration légèrement différente de celle du serveur, bien que le processus soit généralement assez similaire.

En raison de la configuration que nous souhaitons réaliser dans ce guide, nous allons configurer client-01 et client-02 de manière presque identique, avec seulement quelques légères différences entre eux. Par conséquent, de nombreuses commandes données dans cette étape doivent être exécutées sur les deux machines. Notez, cependant, que si client-01 ou client-02 nécessite une commande spécifique ou une configuration spéciale, ces instructions seront affichées dans un bloc de commande, respectivement bleu ou rouge.

Sur client-01 et client-02, reproduisez la structure de répertoire que vous avez créée sur le server-01 :

client-01 & client-02
  • sudo mkdir -p /etc/tinc/netname/hosts

Créez ensuite un fichier tinc.conf :

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc.conf

Ajoutez les lignes suivantes au fichier, sur les deux machines :

client-01 & client-02 /etc/tinc/netname/tinc.conf
Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01

Veillez à remplacer node_name par le nom du nœud client correspondant. Encore une fois, assurez-vous que ce nom utilise un tiret bas (_) plutôt qu'un trait d'union.

Notez que ce fichier contient une directive ConnectTo pointant sur server_01, alors que le fichier tinc.conf de server-01 n'incluait pas cette directive. En n'incluant pas de déclaration ConnectTo sur server-01, cela signifie que server-01 n'écoutera que les connexions entrantes. Cela fonctionne pour notre installation, puisqu'elle ne se connectera à aucune autre machine.

Enregistrez et fermez le fichier.

Ensuite, créez un fichier de configuration de l'hôte sur chaque nœud client. Encore une fois, assurez-vous que le nom du fichier contient un tiret bas au lieu d'un trait d'union :

client-01 & client-02
  • sudo nano /etc/tinc/netname/hosts/node_name

Pour client-01, ajoutez cette ligne :

client-01:/etc/tinc/netname/hosts/client_01
Subnet = 10.0.0.2/32

Pour client-02, ajoutez cette ligne :

client-02:/etc/tinc/netname/hosts/client_02
Subnet = 10.0.0.3/32

Notez que chaque client possède un sous-réseau différent que Tinc desservira. Enregistrez et fermez le fichier.

Ensuite, générez les paires de clés sur chaque machine cliente :

client-01 & client-02
  • sudo tincd -n netname -K4096

Comme vous l'avez fait pour server-01, lorsque vous êtes invité à sélectionner des fichiers pour stocker les clés RSA, appuyez sur ENTER pour accepter les choix par défaut.

Ensuite, créez le script de démarrage de l'interface réseau sur chaque client :

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc-up

Pour client-01, ajoutez ces lignes :

client-01:/etc/tinc/netname/tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.2/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Pour client-02, ajoutez ce qui suit :

client-02:/etc/tinc/netname/tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.3/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Enregistrez et fermez chaque fichier.

Ensuite, créez le script d'arrêt de l'interface réseau sur chaque client :

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc-down

Sur client-01, ajoutez le contenu suivant au fichier vide :

client-01:/etc/tinc/netname/tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.2/32 dev $INTERFACE
ip link set $INTERFACE down

Sur client-02, ajoutez ce qui suit :

client-02:/etc/tinc/netname/tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.3/32 dev $INTERFACE
ip link set $INTERFACE down

Enregistrez et fermez les fichiers.

Rendez les scripts réseau exécutables en exécutant la commande suivante sur chaque machine cliente :

client-01 & client-02
  • sudo chmod 755 /etc/tinc/netname/tinc-*

Enfin, ouvrez le port 655 sur chaque client :

client-01 & client-02
  • sudo ufw allow 655

À ce stade, les nœuds clients sont presque, mais pas tout à fait, mis en place. Ils ont encore besoin de la clé publique que nous avons créée sur server-01 dans l'étape précédente pour authentifier la connexion au VPN.

Étape 4 - Distribuer les clés

Chaque nœud qui souhaite communiquer directement avec un autre nœud doit avoir échangé des clés publiques, qui se trouvent dans les fichiers de configuration de l'hôte. Dans notre cas, server-01 doit échanger des clés publiques avec les autres nœuds.

Échange de clés entre server-01 et client-01

Sur client-01, copiez son fichier de configuration de l'hôte sur server-01. Etant donné que client-01 et server-01 se trouvent tous les deux dans le même centre de données et qu'ils ont tous les deux un réseau privé activé, vous pouvez utiliser l'adresse IP privée de server01 :

client-01
  • scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp

Cliquez ensuite sur server-01 et copiez le fichier de configuration de l'hôte de client-01 dans le répertoire /etc/tinc/netname/hosts/ :

server-01
  • sudo cp /tmp/client_01 /etc/tinc/netname/hosts/

Ensuite, toujours sur server-01, copiez son fichier de configuration de l'hôte sur client-01 :

server-01
  • scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp

Sur client-01, copiez le fichier server-01 à l'emplacement approprié :

client-01
  • sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

Sur client-01, éditez le fichier de configuration de l'hôte de server-01 de sorte que le champ Address soit réglé sur l'adresse IP privée de server-01. Ainsi, client-01 se connectera au VPN par l'intermédiaire du réseau privé :

client-01
  • sudo nano /etc/tinc/netname/hosts/server_01

Modifiez la directive Address de façon à pointer vers l'adresse IP privée de server-01 :

client-01:/etc/tinc/netname/hosts/server_01
Address = server-01_private_IP
Subnet = 10.0.0.1/32

Enregistrez et quittez. Passons maintenant à notre noeud restant, client-02.

Échange de clés entre server-01 et client-02

Sur client-02, copiez son fichier de configuration de l'hôte sur server-01 :

client-02
  • scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp

Ensuite, sur server-01, copiez le fichier de configuration de l'hôte de client-02 à l'emplacement approprié :

server-01
  • sudo cp /tmp/client_02 /etc/tinc/netname/hosts/

Puis, copiez le fichier de configuration de l'hôte de server-01 sur client-02 :

server-01
  • scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp

Sur client-02, copiez le fichier server-01 à l'emplacement approprié :

client-02
  • sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

En supposant que vous ne mettiez en place que deux nœuds clients, vous avez fini de distribuer des clés publiques. Si, toutefois, vous créez un VPN plus important, c'est le bon moment pour échanger les clés entre ces autres nœuds. N'oubliez pas que si vous souhaitez que deux nœuds communiquent directement entre eux (sans serveur de transfert entre eux), ils doivent avoir échangé leurs clés/fichiers de configuration des hôtes et pouvoir accéder aux véritables interfaces réseau de l'autre. Il est également possible de copier le fichier de configuration de chaque hôte sur chaque nœud du VPN.

Étape 5 - Testez la configuration

Sur chaque noeud, en commençant par server-01, lancez Tinc avec la commande suivante :

All servers
  • sudo tincd -n netname -D -d3

Cette commande inclut le drapeau -n, qui désigne le nom de réseau pour votre VPN, netname. C'est utile si vous avez mis en place plus d'un VPN et que vous devez préciser lequel vous souhaitez lancer. Elle comporte aussi le drapeau -D, qui empêche Tinc de s'enfoncer et de se détacher, et désactive le mécanisme de redémarrage automatique de Tinc. Enfin, elle comprend le drapeau -d, qui ordonne à Tinc de fonctionner en mode débogage, avec un niveau de débogage de 3.

Remarque : en ce qui concerne le démon Tinc, un niveau de débogage de 3 affichera chaque requête échangée entre deux des serveurs, y compris les demandes d'authentification, les échanges de clés et les mises à jour de la liste de clés Des niveaux de débogage plus élevés donnent plus d'informations sur le trafic réseau, mais pour l'instant nous ne nous préoccupons que de savoir si les nœuds peuvent communiquer entre eux, donc un niveau de 3 suffira. Dans un scénario de production, cependant, vous souhaiteriez passer à un niveau de débogage inférieur afin de ne pas remplir les disques avec des fichiers journaux.

Vous pouvez en savoir plus sur les niveaux de débogage de Tinc en consultant la documentation officielle.

Après le démarrage du démon sur chaque nœud, vous devriez voir la sortie avec les noms de chaque nœud lorsqu'ils se connectent à server-01. Testons maintenant la connexion via le VPN.

Dans une fenêtre séparée, envoyez un ping sur client-02 avec l'adresse IP de VPN de client-01. Nous lui avons attribué la valeur de 10.0.0.2 plus tôt :

client-02
  • ping 10.0.0.2

Le ping devrait fonctionner correctement, et vous devriez voir une sortie de débogage dans les autres fenêtres concernant la connexion sur le VPN. Cela indique que client-02 peut communiquer via le VPN via server-01 vers client-01. Appuyez sur CTRL+C pour arrêter le pinging.

Vous pouvez également utiliser les interfaces VPN pour effectuer toute autre communication réseau, comme les connexions d'apps, la copie de fichiers et le SSH.

Sur chaque fenêtre de débogage de démon Tinc, fermez le démon en appuyant sur CTRL+\.

Étape 6 - Configurez Tinc pour un démarrage lors de la mise en marche

Les serveurs Ubuntu utilisent systemd comme gestionnaire de système par défaut pour commander les processus de démarrage et de fonctionnement. Par conséquent, nos pouvons autoriser le VPN netname à démarrer automatiquement lors de la mise en marche avec une commande systemctl unique.

Exécutez la commande suivante sur chaque noeud pour permettre au VPN Tinc de démarrer à chaque mise en marche des machines :

All servers
  • sudo systemctl enable tinc@netname

Tinc est configuré pour démarrer à chaque mise en marche sur chacune de vos machines, et vous pouvez le contrôler avec la commande systemctl. Si vous souhaitez le démarrer maintenant, exécutez la commande suivante sur chacun de vos nœuds :

All servers
  • sudo systemctl start tinc@netname

Remarque : si vous avez plusieurs VPN, vous devez activer ou démarrer chacun d'entre eux en même temps, comme ceci :

All servers
  • sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n

Grâce à cette manipulation, votre VPN Tinc est entièrement configuré et fonctionne sur chacun de vos nœuds.

Conclusion

Maintenant que vous avez suivi ce tutoriel, vous devriez avoir une bonne base pour construire votre VPN afin qu'il réponde à vos besoins. Tinc est très flexible, et tout nœud peut être configuré pour se connecter à n'importe quel autre nœud (auquel il peut accéder par le réseau) afin qu'il puisse agir comme un VPN maillé sans dépendre d'un nœud individuel.

0 Comments

Creative Commons License