Dezentrales VPN mit Tinc

Die VPN-Software Tinc braucht keinen zentralen Einwahl-Server, sondern verbindet mehrere Tinc-Rechner gleichzeitig. Fällt eine der Verbindungen aus, liefert die Software die Netzwerkpakete auf dem kürzesten Weg über die verbleibenden ans Ziel.

In Pocket speichern vorlesen Druckansicht 16 Kommentare lesen
Lesezeit: 12 Min.
Von
  • Reiko Kaps
Inhaltsverzeichnis

Tinc baut über das Internet ein virtuelles privates Netz auf, das den Datenverkehr zwischen zwei oder mehr Rechnern verschlüsselt und komprimiert. Die Software benötigt dafür keinen zentralen Server, der die Zugänge verwaltet und der die Einwahl übernimmt. Stattdessen erzeugt Tinc gleichzeitig mehrere Verbindungen zu anderen VPN-Knoten. Wird eine dieser Verbindungen gekappt, erreicht der Knoten das VPN über die verbleibenden Verbindungen. Unabhängig vom eigentlichen Aufbau des VPN sorgt Tinc dafür, dass Netzwerkpakete dabei möglichst den kürzesten Weg zum Ziel finden (Mesh-Routing).

Um einen neuen Rechner in ein Tinc-VPN einzubinden, braucht die Software keine neuen VPN-Dienste oder Schnittstellenzuweisungen. Es genügt eine zusätzliche Konfigurationsdatei, die man allerdings auf den Knoten verteilen muss. Die Software verbindet einzelne Ethernet-Segmente, sodass fürs LAN geschriebene Spiele oder Anwendungen wie gewohnt funktionieren. Tinc versteht zudem das Internet Protokoll Version 6 (IPv6), über das es VPNs aufbauen und das die Software im VPN als Transport-Protokoll einsetzen kann.

Tinc läuft auf Linux, Solaris, Free- und OpenBSD und steht als Paket für Windows ab Version 2000 bereit. Bei den BSD-Unixen und den meisten Linux-Distributionen lässt sich Tinc über die Paketverwaltung nachinstallieren. Für andere wie etwa Fedora und Red Hat Linux findet sich ein RPM-Paket auf der Projekt-Website. Fertige Pakete für Mac OS X stehen nicht bereit, laut Dokumentation lässt sich Tinc jedoch auf Apples Betriebssystem aus den Quelltexten übersetzen. Auf allen Betriebssystemen benötigt die Software einen TUN/TAP-Treiber, den aktuelle Linuxe meist mitbringen und den der Windows-Installer mitliefert. Ob ein TUN/TAP-Treiber unter Linux vorhanden ist, verrät das Kommando modinfo tun. Mit lsmod | grep tun sieht man, ob er geladen wurde, was sich notfalls über den Befehl modprobe tun nachholen lässt.

Auf Windows-Systemen wechselt man nach der Tinc-Installation als Administrator ins Verzeichnis tap-win32/, das sich im Tinc-Programmverzeichnis findet. Dort startet die Batchdatei addtab.bat die Treiberinstallation. Unter Vista und Windows 7 nickt man den folgenden UAC-Dialog ab. Anschließend besitzt das Windows-System eine neue Netzwerkverbindung für das Gerät „TAP-Win32 Adapter V8“.

Soll der Tinc-Knoten Verbindungen von anderen Knoten annehmen können, benötigt er entweder eine offizielle IP-Adresse oder eine Portweiterleitung am Netzwerkrouter, der TCP- und UDP-Pakete für den frei wählbaren Tinc-Port ins LAN durchschleift. Wenn sich das lokale Tinc ausschließlich zu anderen Knoten verbinden soll, aber hinter einem NAT-Router arbeitet, der sich nicht derart manipulieren lässt, kann der jeweilige Tinc-Knoten die VPN-Daten über TCP transportieren. Verknüpft Tinc beispielsweise mehrere Firmennetze, schaltet man am Router die Port-Weiterleitung an. Von außerhalb können Mitarbeiter solche Vorgaben nicht setzen – diese Tinc-Knoten müssen daher die VPN-Daten per TCP transportieren.

Seine Einrichtungsdateien sucht Tinc unter Linux im Ordner /etc/tinc. Auf Windows erwartet es sie im Programmverzeichnis, das sich in der Regel unter c:\Programme\tinc\ findet. Die Einstellungen lassen sich als Profile zusammenfassen und später gezielt aufrufen: Dazu erzeugt man ein neues Verzeichnis mit einem frei wählbaren Namen – beispielsweise MeinTincVPN – und erstellt darin das Unterverzeichnis hosts/ sowie die Da-tei tinc.conf, in der der Tinc-Knoten einige grundlegende Parameter erwartet:

Device=/dev/net/tun
Interface=MeinTincVPN-dev
AddressFamily=ipv4
Mode=switch
Name=TincKnoten1
PrivateKeyFile=/etc/tinc/MeinTincVPN/rsa_key.priv

Wer die VPN-Verbindung unter Windows explizit angeben will, gibt ihr einen eindeutigen Namen und teilt ihn Tinc über die Konfigurationsvariable Interface mit.

Der Eintrag Device gibt das TUN/TAP-Pseudo-Device vor, Interface benennt das VPN-Interface. Fehlt diese Option unter Linux, benennt Tinc das Interface nach dem Profilnamen. Windows benötigt den Eintrag Device nicht, es sucht sich das passende Interface automatisch. Wer die VPN-Schnittstelle jedoch vorgeben will, kann die zum "TAP-Win32 Adapter V8" gehörende Netzwerkverbindung beispielsweise in TINC-VPN umbenennen und die Option Interface=TINC-VPN setzen. Mit AddressFamily=ipv4 hört tinc ausschließlich an den IPv4-Adressen des Rechners und Mode legt fest, wie Tinc Pakete zum Ziel leitet. Über den Wert switch erzeugt Tinc anhand der Hardware-Adressen (MAC) eine Routing-Tabelle. Ähnlich wie ein echter Switch leitet die Software Unicast-, Broadcast- und Multicast-Anfragen weiter, sodass sich einzelne Ethernet-Segmente überbrücken lassen. Nutzt Tinc dagegen hub, erstellt die Software keine Routing-Tabelle und alle Pakete werden per Broadcast an alle anderen Tinc-Knoten verschickt. Per Vorgabe arbeitet Tinc jedoch als Router, der nur die Subnetz-Angaben der einzelnen Knoten für die Routing-Tabelle auswertet.

In dieser Betriebsart funktionieren jedoch keine Broad- oder Multicast-Anfragen. Der Parameter Name benennt den Tinc-Knoten, der sich gegenüber anderen mittels eines Schlüsselpaares ausweist. PrivateKeyFile zeigt dabei auf den absoluten Pfad der privaten Schlüsseldatei, die Tinc gemeinsam mit dem öffentlichen Schlüssel über den Befehl tincd -K -n MeinTincVPN erzeugt. Das Programm legt den privaten Schlüssel per Vorgabe in der Datei rsa_key.priv im Profilverzeichnis (MeinTincVPN) ab. Den öffentlichen Schlüssel sichert es standardmäßig in einer Datei im hosts-Verzeichnis. Wenn nicht anders gewünscht, benennt Tinc die Datei mit dem Knotennamen, den man zuvor in der Datei tinc.conf festgelegt hat.

In der Datei TincKnoten1 steht danach nur der öffentliche Schlüssel des Rechners, es fehlen einige weitere Angaben zum Subnetz sowie zur öffentlichen Adresse und zum Port, über die der Knoten aus dem Internet erreichbar ist.

Address=tincknoten1.example.net
Port=54321
Subnet=192.168.0.0/16
Compression=9
----BEGIN RSA PUBLIC KEY----
MIG...JAgMBAAE=
----END RSA PUBLIC KEY----

Nun muss Tinc wissen, wie es der VPN-Schnittstelle eine Adresse verpassen kann. Dabei hilft Tincs Skript-Mechanismus, mit dem sich beim Starten und Stoppen des VPN oder beim Anmelden einzelner Subnetze oder Tinc-Knoten Aktionen ausführen lassen.

Soll der Knoten beim VPN-Start die Adresse 192.168.98.1 mit der Maske 255.255.0.0 erhalten, erzeugt man im Profilverzeichnis die Datei tinc-up, macht sie unter Linux mit chmod +x tinc-up ausführbar und füllt sie mit folgender Zeilen:

#!/bin/sh
/sbin/ifconfig $INTERFACE 192.168.98.1 netmask 255.255.0.0

Tinc ruft Skripte ohne Optionen auf, übergibt ihnen jedoch Umgebungsvariablen. Neben der Variable INTERFACE gehören dazu NETNAME, NAME, DEVICE, NODE, REMOTEADDRESS, REMOTEPORT und SUBNET. Auch unter Windows führt Tinc Skripte aus, wenn sie auf .bat enden. Die Variablen lassen sich dann Shell-typisch mit $INTERFACE oder unter Windows mit %INTERFACE% ansprechen. Weitere Details zu Tinc-Skripten verrät die Dokumentation.

Der zweite Tinc-Knoten benötigt eine ähnliche Einrichtung. Man legt das Profilverzeichnis, die Datei tinc.conf sowie die Schlüsseldateien an und erweitert die Datei mit dem öffentlichen Schlüssel um Einträge für das Subnetz, die echte Adresse des Knotens sowie um die Portnummer:

Address=tincknoten2.example.net
Port=54321
Subnet=192.168.0.0/16
Compression=9
----BEGIN RSA PUBLIC KEY----
AuS...sEnsTElle=
----END RSA PUBLIC KEY----

Der Subnetz-Eintrag wird hier auf 192.168.0.0/16 gesetzt, was auch das lokale Netz des zweiten Knotens mit der Adresse 192.168.99.0/24 abdeckt. Das Tinc-Skript tinc-up kümmert sich beim VPN-Aufbau wieder um die Vergabe einer IP-Adresse für die lokale VPN-Schnittstelle.

#!/bin/sh
/sbin/ifconfig $INTERFACE 192.168.99.1 netmask 255.255.0.0

Tinc erstellt dank der Netzwerkmaske 255.255.0.0 passende Routing-Einträge auf allen anderen VPN-Knoten, weitere per Hand einzutragende Einträge sind unnötig.

Abschließend teilt die Zeile „ConnectTo=tincknoten1“ in der Datei tinc.conf dem Rechner mit, dass er sich zum ersten Tinc-Knoten verbinden soll. Beide Seiten benötigen für eine korrekte Authentifizierung sowie für die Routing-Informationen jedoch die Datei mit dem öffentlichen Schlüssel der Gegenseite, die man im hosts-Verzeichnis des VPN-Profils ablegt. Besteht das VPN bereits aus mehreren Knoten, kann sich der Rechner parallel zu den anderen verbinden, wenn die Konfigurationsdatei mehrere ConnectTo-Zeilen enthält.

Soll ein weiteres LAN ins VPN gelangen, wiederholt man diese Schritte. Dabei muss man jedoch beachten, dass die Adress- und Netzwerkbereiche der einzelnen Knoten sich nicht überlappen.

Soll ein Mitarbeiter von unterwegs ins Tinc-VPN gelangen, muss er nicht gleich ein eigenes Subnetz mitbringen. Dem Mobilknoten reicht eine einzelne Adresse, was sich über die Notation 192.168.99.100/32 ausdrücken lässt und die man so in den Subnet-Eintrag der eigenen Hosts-Datei einträgt.

Address=tincclient.example.net
Port=54321
Subnet=192.168.99.100/32
Compression=9
ConnectTo=tincknoten2
----BEGIN RSA PUBLIC KEY----
HIS...LaqMMBBE=
----END RSA PUBLIC KEY----

Mobile Rechner verbinden sich zumeist aus einem lokalen Netz ins Internet, dessen Router keine Port-Weiterleitungen ins LAN erlaubt. Baut dieser Computer eine VPN zu einem Knoten auf, melden beide Seiten zwar einen erfolgreichen VPN-Aufbau, allein die per UDP transportierten VPN-Pakete finden nicht ihren Weg zum Ziel. Tinc kann die eigentlichen VPN-Daten jedoch über TCP-Verbindungen tunneln, was sich mit der Zeile TCPOnly=yes in der Datei tinc.conf auf dem Client einschalten lässt.

Mode=switch 
Name=mobiltincknoten1
PrivateKeyFile=c:/Programme/tinc/MeinTincVPN/rsa_key.priv
ConnectTo=tincknoten2
TCPOnly=yes

Nach den ersten Aufruf registriert sich Tinc mit dem passenden Profil als Windows-Dienst, der beim Booten automatisch startet.

Windows-Nutzer setzen die Adresse des VPN-Adapters über die Eigenschaften des Netzwerk-Interfaces. Da das VPN aus mehreren lokalen Netzen aus dem Bereich 192.168.0.0/16 besteht, erhält die Schnittstelle die Netzwerkmaske 255.255.0.0. Die Einträge für das Standard-Gateway und die DNS-Server bleiben leer.

Sind diese Vorarbeiten erledigt, tauscht der mobile Knoten mit seinen Verbindungspartnern die Dateien mit den öffentlichen Schlüsseln und den Einstellungen untereinander aus.

Anschließend starten alle beteiligten Knoten auf einer Administrator-Konsole das VPN mit dem Kommando tincd -D -d3 -n MeinTincVPN. Der Parameter -D verhindert dabei, dass sich Tinc als Hindergrund-Prozess absetzt. Die Option -d3 erhöht das Debug-Level der Software, sodass sie beispielsweise auch übertragene Pakete meldet, und über die Option -n findet Tinc das gewünschte VPN-Profil.

Ohne zusätzliche Parameter gibt sich Tinc äußerst schweigsam und zeigt keinerlei Infos über den Verbindungsaufbau an. Abhilfe schafft die zusätzliche Option -d.

Da unter Windows die Programmdatei tincd nicht automatisch im Suchpfad liegt, wechselt man auf einer Administrator-Eingabeaufforderung ins Programmverzeichnis, meist c:\Program Files\tinc, und startet dort das Kommando.

Auf Windows beendet die Tastenkombination Strg+c diesen Testlauf. Unter Linux stoppen die gleichen Tasten das Programm jedoch nicht, sondern erhöhen bis zur nächsten Eingabe der Tastenkombination nur das Debug-Level auf den maximalen Wert von 5. Zum ordnungsgemäßen Beenden setzt man hier den Befehl tincd -k -n MeinTincVPN ab, der den Tinc-Prozess für das gewünschte VPN-Profil geregelt beendet.

Auf Debian und Ubuntu lassen sich die Tinc-VPN-Profile beim Booten starten, wenn man deren Namen in die Datei /etc/tinc/nets.boot einträgt. Unter Windows erledigt eine Batch-Datei die Einwahl für Außendienstmitarbeiter oder die Software läuft als Systemdienst im Hintergrund. Tinc registriert sich als Windows-Dienst, dessen Eigenschaften sich über die Systemsteuerung einrichten lassen. Dazu wechselt man ins Programmverzeichnis und führt als Administrator das Kommando tincd -n Profilname aus. Der Befehl tincd -k -n Profilname löscht Tinc wieder aus der Liste der Windows-Dienste. (rek) (bb)