Logo Dennis' Tech Blog

Tinc - Peer-to-peer VPN

Dennis Schwerdel  P2p  Vpn  Netzwerk
Post Image

Tinc ist eine Peer-to-peer VPN-Software. Jeder kennt das Problem dass man dank NAT von außen keine Verbindung zu seinen Rechnern zuhause herstellen kann. Als Lösung kann man entweder bestimmte Ports auf dem NAT-Router an die gewünschten Rechner weiterleiten oder wenn man das nicht will ein VPN-Netzwerk aufsetzen.

Die meisten VPN-Tools wie z.B. das bekannte OpenVPN benötigen einen Server der eine feste Adresse haben muss und über den sämtlicher Traffic läuft. Tinc geht hier einen anderen Weg: Es nutzt Peer-to-peer-Technologie um auf diesen Server zu verzichten. Die einzelnen Rechner verbinden sich untereinander ohne einen Server. Damit das ganze auch noch sicher ist bekommt jeder Rechner einen SSL-Key und kennt die öffentlichen Schlüssel der anderen Rechner mit denen er sich verbinden darf.

Ich selbst verwende Tinc schon länger und bin relativ begeistert wie einfach das geht und wie schnell der Datenverkehr ist. Ich habe damit sämtliche Rechner unter meiner Kontrolle, d.h. Rechner zuhause hinter dem NAT-Router, meinen Server im Internet und einen Rechner bei meinen Eltern verbunden. So komme ich immer von außen auf alle Rechner drauf ohne dass ich mir Gedanken um weltweit offene Ports machen muss.

Als weiteres Anwendungsszenario kann ich mir noch vorstelen dass man mit Freunden Spiele spielen will, die nur im LAN funktionieren. Hierfür hat Tinc einen eigenen Modus names “Switch”, das ist dann ein virtuelles LAN.

Einen kleinen Nachteil von Tinc will ich hier nicht verschweigen. Da Tinc für jedes VPN ein eigenes Peer-to-peer-Netzwerk aufbaut, muss auch in jedem VPN mindestens ein Host von den anderen erreichbar und seine Adresse bekannt sein. Das kann entweder eine feste Adresse sein oder aber eine DynDNS-Adresse. Es können auch mehrere Hosts genutzt werden, von denen nur einer gleichzeitig online sein muss.

Tutorial

Die Konfiguration ist relativ einfach. In /etc/tinc gibt es für jedes VPN ein eigenes Unterverzeichnis und in der Datei /etc/tinc/nets.boot stehen die Namen der VPNs die automatisch verbunden werden sollen. Für des neue VPN mynet erzeugt man also einfach das Verzeichnis /etc/tinc/mynet und fügt die Zeile mynet in /etc/tinc/nets.boot ein.

Nun muss man für jeden Host ein SSL-Schlüsselpaar mit folgendem Befehl erzeugen:

$> tincd -n mynet -K

Dieser Befehl erzeugt die beiden Dateien rsa_key.priv und rsa_key.pub.

Für jeden Host legt man nun eine eigene Datei in /etc/tinc/mynet/hosts an:

Address=11.22.33.44
Port=2655
 
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

Hier muss man die Adresse und den Port des Hosts angeben damit andere Hosts dahin verbinden können. Anstelle einer IP-Adresse kann auch ein DNS-Name angegeben werden wenn man z.b. DynDNS verwendet. Falls der Rechner keine feste Adresse hat, kann man die Address-Zeile auch weglassen. In den unteren Teil der Datei muss der öffentliche Schlüssel aus rsa_key.pub kopiert werden.

Wenn diese Dateien für jeden Host angelegt sind müssen auf alle Hosts verteilt werden sodass jeder Host nicht nur seine eigene Datei hat sondern auch die Dateien von allen anderen Hosts.

Nun muss noch eine Konfigurationsdatei für des VPN auf jedem Host in /etc/tinc/mynet/tinc.conf angelegt werden:

Mode=switch
Name=host1
ConnectTo=host2
ConnectTo=host3

Unter Name muss der Name des eigenen Hosts angegeben werden. Für alle anderen Hosts zu denen aktiv eine Verbindung hergestellt werden soll müssen ConnectTo-Zeilen eingefügt werden. Das geht aber bei den Hosts die eine Zeile mit Address haben, sonst ist die Adresse nicht bekannt.

Durch die P2P-Technologie müssen nicht alle Hosts aktiv Verbindungen zueinander aufbauen, es reicht wenn sie mit dem gleichen Host verbunden sind, dann tauschen sie ihre aktuellen Adressen aus und versuchen eine Verbindung herzustellen. Wenn keine direkte Verbindung hergestellt werden kann (z.B. wegen NAT) dann werden die Daten über einen anderen Host umgeleitet.

Jetzt können wir Tinc starten:

$> /etc/init.d/tinc start

Wenn alles funktioniert hat, haben wir nun ein neues Netzwerk-Interface namens mynet das wir wie gewohnt konfigurieren können:

$> ifconfig mynet 172.16.45.1 netmask 255.255.255.0 up

Wenn Tinc auf allen Hosts läuft, können wir nun die anderen Hosts über Tinc erreichen.

Hier noch ein paar Tipps und Tricks:

...
172.16.45.1 host1.tinc
172.16.45.2 host2.tinc
172.16.45.3 host3.tinc

Software Info

Autor:
Guus Sliepen
Lizenz:
GPL 2+
Programmiersprache:
C
Betriebssystem:
Linux, Windows, MacOS, Unix, …
Beschriebene Version:
1.0.21