tinc-boot - réseau maillé sans douleur


Automatique, sécurisé, distribué, avec des connexions transitives (c'est-à-dire le transfert de messages lorsqu'il n'y a pas d'accÚs direct entre les abonnés), sans point de défaillance unique, homologue, testé dans le temps, faible consommation de ressources, réseau VPN à maillage complet avec la capacité de «perforer» NAT - est-ce possible?


Les bonnes réponses sont:


  • oui, avec douleur si vous utilisez du tinc.
  • oui, facile si vous utilisez tinc + tinc-boot

Lien de saut d'introduction


Description de la tinc


Malheureusement, quelques informations ont Ă©tĂ© publiĂ©es sur Tinc VPN sur HabrĂ©, mais quelques articles pertinents peuvent toujours ĂȘtre trouvĂ©s:



Des articles de langue anglaise peuvent ĂȘtre distinguĂ©s:



La source d'origine est préférable de considérer la documentation originale de Tinc man


Ainsi (une rĂ©impression gratuite sur le site officiel), Tinc VPN est un service (dĂ©mon tincd ) qui assure le fonctionnement d'un rĂ©seau privĂ© en tunnelant et en chiffrant le trafic entre les nƓuds. Le code source est ouvert et disponible sous la licence GPL2. Comme la solution classique (OpenVPN), le rĂ©seau virtuel crĂ©Ă© est disponible au niveau IP (OSI 3), ce qui signifie que, dans le cas gĂ©nĂ©ral, il n'est pas nĂ©cessaire d'apporter des modifications aux applications.


Caractéristiques clés:


  • cryptage, authentification et compression du trafic;
  • solution entiĂšrement maillĂ©e entiĂšrement automatique, qui comprend l'Ă©tablissement de connexions aux nƓuds de rĂ©seau dans un mode tout avec tous ou, si cela n'est pas applicable, le transfert de messages entre des hĂŽtes intermĂ©diaires;
  • punch NAT;
  • la possibilitĂ© de connecter des rĂ©seaux isolĂ©s au niveau ethernet (commutateur virtuel);
  • prise en charge de plusieurs systĂšmes d'exploitation: Linux, FreeBSD, OS X, Solaris, Windows, etc.

Il existe deux branches de dĂ©veloppement tinc: 1.0.x (dans presque tous les rĂ©fĂ©rentiels) et 1.1 (bĂȘta Ă©ternelle). L'article utilise la version 1.0.x partout.


Tinc 1.1x fournit plusieurs nouvelles fonctionnalités clés: une sécurité avant parfaite, une connectivité client simplifiée (remplaçant en fait tinc-boot ) et une conception généralement plus réfléchie.

Cependant, pour le moment, une version stable - 1.0.x est indiquée et mise en évidence sur le site officiel, donc lorsque vous utilisez tous les avantages de la branche 1.1, vous devez évaluer tous les avantages et les inconvénients de l'utilisation d'une version non finale.

De mon point de vue, l'une des possibilitĂ©s les plus fortes est de transmettre des messages lorsque la connexion directe n'est pas possible. Dans le mĂȘme temps, les tables de routage sont construites automatiquement. MĂȘme les nƓuds sans adresse publique peuvent faire passer le trafic par eux-mĂȘmes.



Considérons la situation avec trois serveurs (Chine, Russie, Singapour) et trois clients (Russie, Chine et Philippines):


  • les serveurs ont une adresse publique, les clients derriĂšre NAT;
  • ILV lors de la prochaine interdiction des procurations probables Le TĂ©lĂ©gramme a bloquĂ© tous les hĂ©bergeurs Ă  l'exception de la Chine "amie";
  • la frontiĂšre du rĂ©seau de la Chine <-> RF est instable et peut tomber (en raison de l'ILV et / ou de la censure chinoise);
  • les connexions Ă  Singapour sont conditionnellement stables (expĂ©rience personnelle);
  • Manille (Philippines) n'est une menace pour personne et est donc autorisĂ©e pour tout le monde (en raison de la distance de tout le monde et de tout).

Par exemple, l'échange de trafic entre Shanghai et Moscou, considérons les scénarios de Tinc (environ):


  1. Situation d'origine: Moscou <-> russie-srv <-> chine-srv <-> Shanghai
  2. ILV a fermé la connexion avec la Chine: Moscou <-> russia-srv <-> Manille <-> Singapour <-> Shanghai
  3. (aprÚs 2) en cas de panne du serveur à Singapour, le trafic est transféré vers le serveur en Chine et vice versa.

Dans la mesure du possible, Tinc tente d'Ă©tablir une connexion directe entre les deux nƓuds derriĂšre NAT par poinçonnage.


Une brĂšve introduction Ă  la configuration tinc


Tinc se positionne comme un service facile Ă  configurer. Cependant, quelque chose s'est mal passĂ© - pour crĂ©er un nouveau nƓud, il est minimalement nĂ©cessaire:


  • DĂ©crivez la configuration de l'hĂŽte (type, nom) ( tinc.conf );
  • DĂ©crire le fichier de configuration (sous-rĂ©seaux desservis, adresses publiques) ( hosts/ );
  • crĂ©er une clĂ©;
  • crĂ©er un script spĂ©cifiant l'adresse du nƓud et les paramĂštres associĂ©s ( tinc-up );
  • il est conseillĂ© de crĂ©er un script qui efface les paramĂštres crĂ©Ă©s aprĂšs l'arrĂȘt ( tinc-down ).

De plus, lors de la connexion à un réseau existant, vous devez obtenir les clés d'hÎte existantes et fournir les vÎtres.


C'est-à-dire: pour le deuxiùme nƓud



Pour le troisiĂšme



Lorsque vous utilisez la synchronisation bidirectionnelle (par exemple, Ă  l' unison ), le nombre d'opĂ©rations supplĂ©mentaires augmente Ă  N Ă©lĂ©ments, oĂč N est le nombre de nƓuds publics.


Nous devons rendre hommage aux développeurs de Tinc - pour l'inclusion dans le réseau, il suffit d'échanger des clés
avec un seul des nƓuds (bootnode). AprĂšs avoir dĂ©marrĂ© le service et se connecter au participant, tinc obtiendra la topologie
réseau et pourra travailler avec tous les abonnés.

Cependant , si l'hÎte de démarrage est devenu indisponible et que tinc a redémarré, il n'y a aucun moyen
se connectera au réseau virtuel.

De plus, les énormes possibilités du tinc, ainsi que la documentation académique de celui-ci (bien décrit, mais peu d'exemples), fournissent un vaste champ d'erreurs.


Raisons de créer tinc-boot


Si nous généralisons les problÚmes décrits ci-dessus et les formulons en tùches, nous obtenons:


  1. la capacité de créer un nouveau site avec un effort minimal est nécessaire;
    • potentiellement, il faut permettre de donner au spĂ©cialiste moyen (enikey) une petite ligne pour crĂ©er un nouveau nƓud et se connecter au rĂ©seau;
  2. il est nĂ©cessaire de fournir une distribution automatique des clĂ©s entre tous les nƓuds actifs;
  3. il est nécessaire de prévoir une procédure simplifiée d'échange de clés entre le bootnod et le nouveau client.

bootnode - un nƓud avec une adresse publique (voir ci-dessus);

En raison des exigences de la revendication 2, on peut faire valoir qu'aprĂšs l'Ă©change de clĂ©s entre le nƓud de dĂ©marrage et le nouveau nƓud, et aprĂšs
en connectant le nƓud au rĂ©seau, la distribution de la nouvelle clĂ© se fera automatiquement.


Ce sont ces tĂąches que tinc-boot effectue.


tinc-boot est une application open source autonome, en dehors de tinc , qui fournit:


  • crĂ©ation simple d'un nouveau nƓud;
  • connexion automatique Ă  un rĂ©seau existant;
  • dĂ©finir la majoritĂ© des paramĂštres par dĂ©faut;
  • distribution clĂ© aux nƓuds de miel.

L'architecture


Le fichier exĂ©cutable tinc-boot compose de quatre composants: un serveur bootnode, un serveur de gestion de distribution de clĂ©s et des commandes de gestion RPC pour celui-ci, ainsi qu'un module de gĂ©nĂ©ration de nƓuds.


Module de gĂ©nĂ©ration de nƓuds


Le module de gĂ©nĂ©ration de nƓuds ( tinc-boot gen ) crĂ©e tous les fichiers nĂ©cessaires au bon fonctionnement de tinc.


SimplifiĂ©, son algorithme peut ĂȘtre dĂ©crit comme suit:


  1. Définissez le nom d'hÎte, le réseau, les paramÚtres IP, le port, le masque de sous-réseau, etc.
  2. Normalisez-les (tinc a une limite sur certaines valeurs) et créez celles qui manquent
  3. VĂ©rifier les paramĂštres
  4. Si nécessaire, installez tinc-boot sur le systÚme (désactivable)
  5. Créer des subnet-down tinc-up , tinc-down , subnet-up , subnet-down
  6. Créer un tinc.conf configuration tinc.conf
  7. Créer un hosts/
  8. Effectuer la génération de clés
  9. Effectuer un échange de clés avec bootnode
    1. Chiffrez et signez votre propre fichier hĂŽte avec une clĂ© publique, un vecteur d'initialisation alĂ©atoire (nom) et un nom d'hĂŽte Ă  l'aide de xchacha20poly1305, oĂč la clĂ© de chiffrement est le rĂ©sultat de la fonction sha256 du jeton
    2. Envoyer des données via le protocole HTTP à bootnode
    3. DĂ©chiffrez la rĂ©ponse reçue et l'en X-Node tĂȘte X-Node contenant le nom du nƓud de dĂ©marrage en utilisant le nom d'origine et le mĂȘme algorithme
    4. En cas de succĂšs, enregistrez la clĂ© reçue dans les hosts/ et ajoutez une entrĂ©e ConnectTo au fichier de configuration (c'est-Ă -dire une recommandation oĂč se connecter)
    5. Sinon, utilisez l'adresse suivante dans la liste du nƓud de dĂ©marrage et rĂ©pĂ©tez Ă  partir de l'Ă©tape 2
  10. Afficher des recommandations sur le démarrage d'un service

La conversion via SHA-256 est utilisée uniquement pour normaliser la clé à 32 octets

Pour le tout premier nƓud (c'est-Ă -dire lorsqu'il n'y a rien Ă  spĂ©cifier comme adresse de dĂ©marrage), l'Ă©tape 9 est ignorĂ©e. Drapeau - --standalone .


Exemple 1 - création du premier site public


L'adresse publique est 1.2.3.4


sudo tinc-boot gen --standalone -a 1.2.3.4


  • l'indicateur -a vous permet de spĂ©cifier des adresses accessibles au public

Exemple 1 - Ajout d'un nƓud non public au rĂ©seau


Le nƓud de dĂ©marrage sera tirĂ© de l'exemple ci-dessus. L'hĂŽte doit avoir un noeud de dĂ©marrage tinc-boot en cours d'exĂ©cution (dĂ©crit plus loin).


sudo tinc-boot gen --token "MY TOKEN" http://1.2.3.4:8655


  • l'indicateur --token dĂ©finit le jeton d'autorisation

Module d'amorçage


Le tinc-boot bootnode déclenche un serveur HTTP avec une API pour l'échange de clés primaires avec de nouveaux clients.


Par défaut, le port 8655 .


SimplifiĂ©, l'algorithme peut ĂȘtre dĂ©crit comme suit:


  1. Accepter une demande d'un client
  2. DĂ©chiffrez et vĂ©rifiez la demande Ă  l'aide de xchacha20poly1305, Ă  l'aide du vecteur d'initialisation transmis lors de la demande, et oĂč la clĂ© de chiffrement est le rĂ©sultat de la fonction sha256 du jeton
  3. VĂ©rifier le nom
  4. Enregistrez le fichier s'il n'y a pas encore de fichier du mĂȘme nom
  5. Chiffrez et signez votre propre fichier hÎte et votre nom en utilisant l'algorithme décrit ci-dessus
  6. Retour Ă  l'article 1

Ensemble, le processus d'échange de clé primaire est le suivant:



Exemple 1 - dĂ©marrage du nƓud de tĂ©lĂ©chargement


On suppose que l'initialisation initiale du nƓud a Ă©tĂ© effectuĂ©e ( tinc-boot gen )


tinc-boot bootnode --token "MY TOKEN"


  • l'indicateur --token dĂ©finit le jeton d'autorisation. Il devrait en ĂȘtre de mĂȘme pour les clients se connectant Ă  l'hĂŽte.

Exemple 2 - dĂ©marrage du nƓud de tĂ©lĂ©chargement en tant que service


tinc-boot bootnode --service --token "MY TOKEN"


  • l'indicateur --service de crĂ©er un service systemd (par dĂ©faut, pour cet exemple tinc-boot-dnet.service )
  • l'indicateur --token dĂ©finit le jeton d'autorisation. Il devrait en ĂȘtre de mĂȘme pour les clients se connectant Ă  l'hĂŽte.

Module de distribution de clés


Le module de distribution de clĂ©s ( tinc-boot monitor ) lĂšve un serveur HTTP avec une API pour Ă©changer des clĂ©s avec d'autres nƓuds Ă  l'intĂ©rieur du VPN . Il est fixĂ© Ă  l'adresse Ă©mise par le rĂ©seau (le port par dĂ©faut est 1655 , il n'y aura pas de conflits avec plusieurs rĂ©seaux, car chaque rĂ©seau a / doit avoir sa propre adresse).


Le module démarre et fonctionne de maniÚre entiÚrement automatique: vous n'avez pas besoin de travailler avec lui en mode manuel.


Ce module dĂ©marre automatiquement lorsque le rĂ©seau est tinc-up (dans le script tinc-up ) et s'arrĂȘte automatiquement lorsqu'il s'arrĂȘte (dans le script tinc-down ).


Prise en charge des opérations:


  • GET / - donnez votre fichier de noeud
  • POST /rpc/watch?node=<>&subnet=<> - rĂ©cupĂ©rez un fichier Ă  partir d'un autre nƓud, en supposant qu'un service similaire est en cours d'exĂ©cution dessus. Par dĂ©faut, les tentatives sont expirĂ©es Ă  10 secondes, toutes les 30 secondes jusqu'Ă  la rĂ©ussite ou l'annulation.
  • POST /rpc/forget?node=<> - laissez les tentatives (le cas Ă©chĂ©ant) de rĂ©cupĂ©rer le fichier Ă  partir d'un autre nƓud
  • POST /rpc/kill - met fin au service

De plus, chaque minute (par dĂ©faut) et lorsqu'un nouveau fichier de configuration est reçu, l'indexation des nƓuds enregistrĂ©s est effectuĂ©e pour les nouveaux nƓuds publics. Lorsque des nƓuds avec l'indicateur d' Address sont dĂ©tectĂ©s, une entrĂ©e est ajoutĂ©e au fichier de configuration tinc.conf pour recommander la connexion lors du redĂ©marrage.


Module de distribution de clés (gestion)


Les commandes pour demander ( tinc-boot watch ) et annuler la demande ( tinc-boot forget ) du fichier de configuration Ă  partir d'autres nƓuds sont exĂ©cutĂ©es automatiquement lorsqu'un nouveau nƓud est dĂ©tectĂ© (script de subnet-up ) et arrĂȘtĂ© (script de subnet-down ), respectivement.


Lors de l'arrĂȘt du service, le script tinc-down est tinc-down dans lequel la commande tinc-boot kill arrĂȘte le module de distribution de clĂ©s.


Au lieu du total


Cet utilitaire a Ă©tĂ© crĂ©Ă© sous l'influence de la dissonance cognitive entre le gĂ©nie des dĂ©veloppeurs Tinc et la complexitĂ© croissante de la mise en place de nouveaux nƓuds.


Les principales idées du processus de développement étaient les suivantes:


  • si quelque chose peut ĂȘtre automatisĂ©, il doit ĂȘtre automatisĂ©;
  • les valeurs par dĂ©faut devraient couvrir au moins 80% de l'utilisation (principe de Pareto);
  • toute valeur peut ĂȘtre redĂ©finie en utilisant Ă  la fois des indicateurs et des variables d'environnement;
  • l'utilitĂ© devrait aider, et non pas provoquer le dĂ©sir d'appeler toute la punition du ciel sur le crĂ©ateur;
  • l'utilisation d'un jeton d'autorisation pour l'initialisation initiale est un risque Ă©vident, cependant, dans la mesure du possible, il a Ă©tĂ© minimisĂ© en raison de la cryptographie et de l'authentification totales (mĂȘme le nom de nƓud dans l'en-tĂȘte de rĂ©ponse ne peut pas ĂȘtre remplacĂ©).

Un peu de chronologie:


  • La premiĂšre fois que j'ai utilisĂ© du tinc il y a plus de 4 ans. A Ă©tudiĂ© une quantitĂ© importante de matĂ©riel. Mettre en place un rĂ©seau idĂ©al (Ă  mon avis)
  • AprĂšs six mois, le tinc a Ă©tĂ© remplacĂ© par le zĂ©rotier, comme un outil plus pratique / flexible
  • Il y a 2 ans, j'ai fait un playbook ansible pour dĂ©ployer tinc
  • Un mois plus tard, mon script est tombĂ© en panne sur le dĂ©ploiement incrĂ©mentiel (c'est-Ă -dire lorsqu'il est impossible d'accĂ©der Ă  tous les nƓuds du rĂ©seau, ce qui signifie distribuer des clĂ©s)
  • Il y a deux semaines, j'ai Ă©crit un script bash-script qui Ă©tait le prototype de tinc-boot
  • Il y a 3 jours aprĂšs la deuxiĂšme itĂ©ration, la premiĂšre version (0.0.1 pour ĂȘtre exacte) de l'utilitaire est nĂ©e
  • Il y a 1 jour, j'ai rĂ©duit l'installation d'un nouveau nƓud Ă  une seule ligne: curl -L https://github.com/reddec/tinc-boot/releases/latest/download/tinc-boot_linux_amd64.tar.gz | sudo tar -xz -C /usr/local/bin/ tinc-boot curl -L https://github.com/reddec/tinc-boot/releases/latest/download/tinc-boot_linux_amd64.tar.gz | sudo tar -xz -C /usr/local/bin/ tinc-boot
  • BientĂŽt, la possibilitĂ© d'une connexion encore plus simple au rĂ©seau sera ajoutĂ©e (sans sacrifier la sĂ©curitĂ©)

Pendant le développement, j'ai activement testé sur de vrais serveurs et clients (l'image de la description de tinc ci-dessus est tirée de la vie réelle). Désormais, le systÚme fonctionne parfaitement et tous les services VPN tiers sont désormais désactivés.


Le code d'application est Ă©crit en GO et est ouvert sous la licence MPL 2.0. Une licence (traduction gratuite) permet une utilisation commerciale (si quelqu'un en a soudainement besoin) sans ouvrir le produit source. La seule exigence est que les modifications doivent ĂȘtre transfĂ©rĂ©es au projet.


Les demandes de piscine sont les bienvenues.


Liens utiles


Source: https://habr.com/ru/post/fr468213/


All Articles