
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):
- Situation d'origine: Moscou <-> russie-srv <-> chine-srv <-> Shanghai
- ILV a fermé la connexion avec la Chine: Moscou <-> russia-srv <-> Manille <-> Singapour <-> Shanghai
- (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:
- 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;
- il est nĂ©cessaire de fournir une distribution automatique des clĂ©s entre tous les nĆuds actifs;
- 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:
- Définissez le nom d'hÎte, le réseau, les paramÚtres IP, le port, le masque de sous-réseau, etc.
- Normalisez-les (tinc a une limite sur certaines valeurs) et créez celles qui manquent
- Vérifier les paramÚtres
- Si nécessaire, installez tinc-boot sur le systÚme (désactivable)
- Créer des
subnet-down
tinc-up
, tinc-down
, subnet-up
, subnet-down
- Créer un
tinc.conf
configuration tinc.conf
- Créer un
hosts/
- Effectuer la génération de clés
- Effectuer un échange de clés avec bootnode
- 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
- Envoyer des données via le protocole HTTP à bootnode
- 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 - 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) - Sinon, utilisez l'adresse suivante dans la liste du nĆud de dĂ©marrage et rĂ©pĂ©tez Ă partir de l'Ă©tape 2
- 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:
- Accepter une demande d'un client
- 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
- Vérifier le nom
- Enregistrez le fichier s'il n'y a pas encore de fichier du mĂȘme nom
- Chiffrez et signez votre propre fichier hÎte et votre nom en utilisant l'algorithme décrit ci-dessus
- 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 noeudPOST /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ĆudPOST /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