• Archive
  • [Tuto] Installer et configurer tinc sur Debian Jessie et Tomato

Salut tous le monde.

J'avais besoin de mettre en place un VPN entre 2 serveurs et mon routeur, donc je me suis dis pourquoi pas faire un tuto
C'est mon premier tuto sur mondedie alors soyez indulgents.
Je suis bien evidemment ouvert aux critiques constructives et j'espere meme que les plus "anciens" de ce forum viendront me conseiller autant sur le contenu (s'il y aurait quelque chose a modifier, rajouter) que sur la forme.
Les sources d'information que j'ai utilise se trouvent a la fin du tuto.

Bon, tous d'abord qu'est ce que tinc?
Tinc est un serveur/client VPN en mode "mesh" (en francais on dirait "maille"), c'est a dire qu'il n'a pas la meme topologie qu'OpenVPN (qui lui est centralise : un serveur, plusieurs clients), mais tous les noeuds du VPN se connectent les uns aux autres ; il n'y a plus de centralisation et du coup c'est plus fiable (meme si un noeud du reseau n'est plus joignable, les autres continuent a communiquer entre eux).

Pour ce tuto j'aurais 3 noeuds (mais vous pouvez en avoir autant que vous voulez) que j'ai appele : serveur1, serveur2 et routeur.
Serveur1 et serveur2 sont des serveurs dedies sur lesquels est installe Debian 8 alors que routeur et mon routeur a la maison qui fait tourner un firmware Tomato avec tinc integre.

Toutes les commandes sont executees par root.

Note importante :
Il est mentionne sur plusieurs sites (notamment ici a "Security statement") que la version de tinc presente dans les depots de Debian 8 aurait des vulnerabilites, la prochaine version "sure" etant la 1.1 (version integree dans le firmware Tomato) ; cependant (a nouveau selon ce que dit le site) il n'y a pas d'exploitation connue de ces vulnerabilites. A vous de voir si vous voulez utiliser la version des depots Debian 8 ou compiler une autre version plus recente.


Sur serveur1 :

On commence par installer le paquet tinc:
apt-get update && apt-get upgrade && apt-get install tinc
Puis on cree un dossier pour notre reseau (vous pouvez mettre ce que vous voulez a la place de monreseau mais il faudra utiliser le meme nom dans la suite du tuto):
mkdir /etc/tinc/monreseau
On cree ensuite le fichier de configuration:
vim /etc/tinc/monreseau/tinc.conf
Name = serveur1
AddressFamily = ipv4
Interface = tinc
ConnectTo = serveur2
Port = 1234
Je pense que c'est assez explicite. ConnectTo indique que serveur1 se connectera a serveur2 (je n'ai pas mis routeur ici car j'ai une ip dynamique a la maison, mais le routeur se connectera lui aux 2 serveurs donc ils pourront communiquer tous ensembles). Port indique le port d'ecoute de tinc, par defaut c'est 655 mais j'ai prefere le changer.

On cree ensuite le dossier pour les differents noeuds:
mkdir /etc/tinc/monreseau/hosts
Et le fichier pour le serveur1:
vim /etc/tinc/monreseau/hosts/serveur1
Address = xx.xxx.xx.xx 1234
Subnet = 192.168.100.2/32
Address signifie l'ip du serveur1 (celle ou il peut etre joint par les autres noeuds) et Subnet et le reseau que ce noeud va desservir.

On genere ensuite les cles:
tincd -n monreseau -K4096
On cree le fichier tinc-up (il faut laisser $INTERFACE tel quel et ne pas mettre autre chose), c'est aussi ici que vous mettrais vos regles iptables qui concernent l'interface tinc:
vim /etc/tinc/monreseau/tinc-up
#!/bin/bash
ifconfig $INTERFACE 192.168.100.2 netmask 255.255.255.0
Et le fichier tinc-down (vous pouvez egalement rajouter des regles iptables a effacer si l'interface n'est plus disponible):
vim /etc/tinc/monreseau/tinc-down
#!/bin/bash
ifconfig $INTERFACE down
On rend executable les 2 fichiers:
chmod +x /etc/tinc/monreseau/tinc-*
On rajoute notre reseau au fichier /etc/tinc/nets.boot (je sais pas si c'est vraiment necessaire mais je l'ai fais):
echo monreseau >> /etc/tinc/nets.boot
Comme Debian Jessie n'integre pas de fichier service pour tinc il faut le creer (a verifier si necessaire sur d'autres distributions):
vim /etc/systemd/system/tinc.service
# This is a mostly empty service, but allows commands like stop, start, reload
# to propagate to all tinc@ service instances.

[Unit]
Description=Tinc VPN
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/etc/tinc

[Install]
WantedBy=multi-user.target
vim /etc/systemd/system/tinc@.service
[Unit]
Description=Tinc net %i
PartOf=tinc.service
ReloadPropagatedFrom=tinc.service

[Service]
Type=simple
WorkingDirectory=/etc/tinc/%i
ExecStart=/usr/sbin/tincd -n %i -D --logfile=/var/log/tinc/log --chroot
ExecReload=/usr/sbin/tincd -n %i -kHUP
ExecStop=/usr/sbin/tincd -n %i -k
TimeoutStopSec=5
Restart=always
RestartSec=60

[Install]
WantedBy=tinc.service
Dans mon cas j'ai voulu avoir les logs dans /var/log/tinc/log et aussi faire un chroot pour tinc.

On a encore quelques etapes a realiser sur serveur1 mais avant il faut configurer les autres noeuds.


Sur serveur2 les etapes sont similaires a part quelques infos qui changent :

On commence par installer le paquet tinc:
apt-get update && apt-get upgrade && apt-get install tinc
Puis on cree un dossier pour notre reseau:
mkdir /etc/tinc/monreseau
On cree ensuite le fichier de configuration:
vim /etc/tinc/monreseau/tinc.conf
Name = serveur2
AddressFamily = ipv4
Interface = tinc
ConnectTo = serveur1
Port = 5678
On cree ensuite le dossier pour les differents noeuds:
mkdir /etc/tinc/monreseau/hosts
Et le fichier pour le serveur2:
vim /etc/tinc/monreseau/hosts/serveur2
Address = xx.xxx.xx.xx 5678
Subnet = 192.168.100.3/32
Il faut faire attention au Subnet (ne pas mettre la meme ip que sur serveur1).

On genere ensuite les cles:
tincd -n monreseau -K4096
On cree le fichier tinc-up:
vim /etc/tinc/monreseau/tinc-up
#!/bin/bash
ifconfig $INTERFACE 192.168.100.3 netmask 255.255.255.0
Et le fichier tinc-down:
vim /etc/tinc/monreseau/tinc-down
#!/bin/sh
ifconfig $INTERFACE down
On rend executable les 2 fichiers:
chmod +x /etc/tinc/monreseau/tinc-*
On rajoute notre reseau au fichier /etc/tinc/nets.boot:
echo monreseau >> /etc/tinc/nets.boot
On cree le fichier service pour tinc:
vim /etc/systemd/system/tinc.service
# This is a mostly empty service, but allows commands like stop, start, reload
# to propagate to all tinc@ service instances.

[Unit]
Description=Tinc VPN
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/etc/tinc

[Install]
WantedBy=multi-user.target
vim /etc/systemd/system/tinc@.service
[Unit]
Description=Tinc net %i
PartOf=tinc.service
ReloadPropagatedFrom=tinc.service

[Service]
Type=simple
WorkingDirectory=/etc/tinc/%i
ExecStart=/usr/sbin/tincd -n %i -D --logfile=/var/log/tinc/log --chroot
ExecReload=/usr/sbin/tincd -n %i -kHUP
ExecStop=/usr/sbin/tincd -n %i -k
TimeoutStopSec=5
Restart=always
RestartSec=60

[Install]
WantedBy=tinc.service
Pour l'instant on est bon en ce qui concerne serveur2 (on y reviendra plus tard).


Sur routeur :

La, les choses sont un peu differentes car on a une interface web pour gerer tinc.

Il faut tout d'abord aller sur l'onglet Generate Keys et cliquer sur le bouton:


Il faut ensuite aller dans l'onglet Config, y recopier les cles prives et completer comme suit:


Apres dans l'onglet Scripts vous avez 2 possibilites (soit que les choses soient automatiques soient manuels), moi je prefere manuel donc je met le Firewall a Manual et j'y met mes regles iptables (qui concerne l'interface tinc bien evidemment et les 2 regles suivantes):
/usr/sbin/iptables -I INPUT -p udp --dport 26878 -j ACCEPT
/usr/sbin/iptables -I INPUT -p tcp --dport 26878 -j ACCEPT
A adapter avec le port sur lequel ecoute tinc sur le routeur.

Et le tinc-up creation est egalement a Manual et j'y met:
#!/bin/sh
ifconfig $INTERFACE 192.168.100.1 netmask 255.255.255.0
Faire a nouveau gaffe de pas mettre les memes ips que pour serveur1 ou serveur2.

Et pour tinc-down
#!/bin/sh
ifconfig $INTERFACE down


Vient ensuite le dernier onglet Hosts ou il faut y mettre d'abord le routeur lui meme:
A Name vous mettez son nom (routeur), a Address vous mettez l'addresse publique du routeur (chez moi elle est dynamique donc je ne le mentionne pas), a Port le port sur lequel tourne tinc sur le routeur (dans mon cas 26878 mais je ne le mentionne pas car je n'ai pas mentionne d'adresse ip), le niveau de compression que vous souhaiter et le Subnet que le noeud dessert (dans mon cas 192.168.100.1/32). Ensuite il faut mentionner les cles publiques du routeur (a copier depuis l'onglet Generate Keys) comme indique dans la capture et cliquer sur add.



Encore un peu et c'est bon:

Maintenant il faut echanger les fichiers hosts des noeuds pour qu'ils puissent se connecter entre eux.

Sur serveur1:
On scp le fichier du serveur2 (/etc/tinc/monreseau/hosts/serveur2) vers le serveur1 ou bien on cree tout simplement le fichier serveur2 sur serveur1 et on y copie colle les donnees du serveur2 (/etc/tinc/monreseau/hosts/serveur2):
vim /etc/tinc/monreseau/hosts/serveur2
Address = xx.xxx.xx.xx 5678
Subnet = 192.168.100.3/32

-----BEGIN RSA PUBLIC KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PUBLIC KEY-------

On cree le fichier routeur sur serveur1:
vim /etc/tinc/monreseau/hosts/routeur
Subnet = 192.168.100.1/32

-----BEGIN RSA PUBLIC KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PUBLIC KEY-------
Ici je n'ai pas de champs Address car le routeur a une ip dynamique donc je ne mentionne rien. La cle a copier dans ce fichier est la cle RSA publique de routeur.

Sur serveur2:
On scp le fichier du serveur1 (/etc/tinc/monreseau/hosts/serveur1) vers le serveur2 ou bien on cree tout simplement le fichier serveur1 sur serveur2 et on y copie colle les donnees du serveur1 (/etc/tinc/monreseau/hosts/serveur1):
vim /etc/tinc/monreseau/hosts/serveur1
Address = xx.xxx.xx.xx 1234
Subnet = 192.168.100.2/32

-----BEGIN RSA PUBLIC KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PUBLIC KEY-------
On cree le fichier routeur sur serveur2:
vim /etc/tinc/monreseau/hosts/routeur
Subnet = 192.168.100.1/32

-----BEGIN RSA PUBLIC KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PUBLIC KEY-------
Sur routeur:
Dans l'onglet Hosts on rajoute les 2 autres noeuds (serveur1 et serveur2) chacun a leur tour comme suit:
On coche ConnectTo, a Name on met le nom respectif (serveur1 ou serveur2), a Port on indique le port d'ecoute pour chacun des noeuds (1234 pour serveur1 et 5678 pour serveur2), on choisi le niveau de compression et enfin on indique le Subnet de chaque noeud (192.168.100.2/32 pour serveur1 et 192.168.100.3/32 pour serveur2).
Comme la version de tinc qui se trouve dans les depots de Debian Jessie ne supporte pas encore les cles Ed25519, dans le champs Ed25519 Public Key pour chacun des noeuds il faut mettre un # (et c'est tout, ne pas rajouter d'espace ou autre, sinon ca ne marche pas). Pour RSA Public Key il faut mentionner la cle RSA publique de chaque noeuds (qui se trouve dans les fichiers /etc/tinc/monreseau/hosts/serveur1 et /etc/tinc/monreseau/hosts/serveur2). Finir en cliquant sur add et save.


Il faut maintenant ouvrir le pare-feu sur les 2 serveurs:
Sur serveur1:
iptables -A INPUT -p tcp --dport 1234 -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport 1234 -i eth0 -j ACCEPT
Sur serveur2:
iptables -A INPUT -p tcp --dport 5678 -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport 5678 -i eth0 -j ACCEPT
Il ne reste plus qu'a executer sur les 2 serveurs:
systemctl enable tinc
systemctl enable tinc@monreseau
systemctl start tinc
Normalement maintenant si vous faites un ping depuis un des noeuds vers un autre noeud vous devriez recevoir une reponse (sinon il faudrait verifier les regles iptables et s'assurer que l'interface tinc et en ACCEPT ou executer les commandes habituelles pour voir si le daemon tinc a demarre, ce qu'il y a dans les logs, etc).

Franchement, on s'est un peu fait chier en renseignant les noeuds les uns aux autres mais c'etait pour bien comprendre comment fonctionne les choses, car normalement si le noeud serveur1 "connais" serveur2 et routeur, meme si serveur2 et routeur n'ont pas echange de cles au debut, ils le ferront au travers de serveur1. Ce que je veux dire c'est que si vous rajoutez un autre noeud (disons serveur3) au reseau, il ne faut echanger de cles qu'avec un seul noeud (disons serveur1) et le reste des echanges (entre serveur3 et serveur2 / entre serveur3 et routeur) se fera automtiquement au travers de serveur1 et puis les communications seront directes. C'est super pratique quand il faut gerer un reseau VPN de quelques dizaines voire centaines de noeuds car pas besoin d'echanger de cles entre tous les noeuds, il suffit de les echanger avec un seul noeud puis le reste des echanges se fait tout seul.

L'avantage d'avoir tinc sur le routeur c'est de pouvoir se connecter aux serveurs au travers de tinc depuis n'importe quel equipement (ordinateur de bureau, ordinateur portable, telephone, tablette) qui est connecte au routeur sans avoir tinc installe et configure sur chaque equipement.

Petit souci :
J'ai un petit souci a l'arret de tinc (service tinc stop), car le script /etc/tinc/monreseau/tinc-down n'est pas execute et du coup, dans mon cas, les regles iptables que j'ai insere (grace a /etc/tinc/monreseau/tinc-up) ne sont pas effacees (et lors d'un redemarrage de tinc les regles iptables se retrouvent dupliquees).
J'ai trouve 2 sites qui parlent de ce bug mais aucune des methodes mentionnees n'a fonctionne dans mon cas (archlinux et redhat). Si quelqu'un a une idee de comment resoudre ca sur Debian...


Sources :
Bien evidemment la man page (man tincd et man tinc.conf)
http://wlk.me/tinc/index.html
http://xmodulo.com/how-to-install-and-configure-tinc-vpn.html
https://florianjensen.com/2015/10/28/tinc-mesh-vpn-on-tomato/
http://www.linksysinfo.org/index.php?threads/tinc-mesh-vpn.70257/
https://github.com/gsliepen/tinc/tree/master/distro


Pour les discussions c'est ici.
Répondre…