Ubuntu 16.04 Xenial Xerus
Ubuntu 14.04 Trusty Tahr
Ubuntu 12.04 Precise Pangolin
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Tinc ist eine dezentrale Virtual-Private-Network- oder kurz VPN-Software. Sie zeichnet sich durch eine sehr schlanke und einfache Konfiguration, plattformübergreifende Unterstützung (Linux, BSD, Solaris, Mac OS X und Windows), vollständige asymmetrische Verschlüsselung und dezentrales Mesh Routing aus.
Bei letzterem verbinden sich alle Teilnehmer (Knoten) miteinander, um jeweils die beste Verbindung zu erreichen. Gleichzeitig können aber beliebig viele Knoten ausfallen, ohne dass die Verbindung zwischen zwei Knoten beeinträchtigt wird, solange noch eine einzige indirekte Verbindung verbleibt. Das virtuelle Netzwerk wird dabei standardmäßig auf Layer 3 (IP) im OSI-Modell erstellt.
Um diesem Artikel folgen zu können, werden grundlegende Netzwerkkenntnisse vorausgesetzt. Als Beispiel wird das Subnet 10.8.0.0/16
verwendet, welches alle IP-Adressen von 10.8.0.1
bis 10.8.255.255
beinhaltet.
Vor Version 1.1 unterstützt Tinc das sogenannte Hole Punching nicht, wie etwa die VPN-Software n2n . D.h. bei mindestens einem Knoten muss der von Tinc verwendete Port 655
weitergeleitet werden, und über diesen Knoten fließt dann der komplette Netzwerkverkehr.
Tinc kann direkt aus den den offiziellen Paketquellen installiert [1] werden:
tinc (universe)
mit apturl
Paketliste zum Kopieren:
sudo apt-get install tinc
sudo aptitude install tinc
Allerdings ist die enthaltene Version nicht immer die aktuellste. Für die neueste Ausgabe der Produktiv- oder Entwicklungsversion empfiehlt sich daher die Kompilierung von Hand.
Den Quellcode findet man auf der Homepage des Projekts, die Kompilierung erfolgt wie in [2] beschrieben. Zu beachten gilt dabei, dass bei einer manuellen Kompilierung per Standard alles in das Verzeichnis /usr/local/ (siehe Verzeichnisstruktur) verschoben wird. Dieses Verhalten kann wie in Programme kompilieren beschrieben geändert werden. Meist müssen neben den von über [3][4]:
sudo apt-get build-dep tinc
gefundenen Bibliotheken noch die Pakete libreadline6-dev und libncurses5-dev nachinstalliert werden.
Tinc 1.1 unterscheidet sich von Version 1.0 u.a. durch eine vereinfachte Konfiguration und Unterstützung von Elliptic Curve Cryptography. Allerdings ist diese Version noch nicht als stabil gekennzeichnet und sollte somit nur zum Testen benutzt werden.
Die Konfigurationsdateien finden sich im Verzeichnis /etc/tinc/. Werden mehrere Netzwerke verwendet, so legt man für jedes ein Unterverzeichnis an, die später mit dem Parameter -n Netzwerkname
ausgewählt werden. Es wird empfohlen, auch für ein einzelnes Netzwerk ein Unterverzeichnis anzulegen.
Allgemeine Einstellungen werden in der Datei /etc/tinc/NETZWERK/tinc.conf festgelegt. Für jeden Knoten gibt es dann nochmals eine eigene Datei im Unterverzeichnis hosts. Das hosts-Verzeichnis ist dabei bei allen Knoten identisch. Diese Syntax in den Dateien folgt dem Schema Variablenname = Variablenwert
. Zudem gibt es die Skripte tinc-up und tinc-down, welche beim Starten bzw. Beenden von Tinc ausgeführt werden.
Beispielsweise existiert folgende Konfiguration:
/etc/tinc/NETZWERK/tinc.conf /etc/tinc/NETZWERK/hosts/ersterknoten /etc/tinc/NETZWERK/hosts/zweiterknoten /etc/tinc/NETZWERK/tinc-up /etc/tinc/NETZWERK/tinc-down
Zuerst wird der Name des eigenen Knotens definiert [5]:
Name = ersterknoten
Danach der Ort des TUN-Adapters (unter Linux /dev/net/tun):
Device = /dev/net/tun
Zuletzt die Angabe, zu welchen anderen Knoten verbunden werden soll (ohne diese Angabe wartet der Knoten nur auf eingehende Verbindungen):
ConnectTo = zweiterknoten
Ab Tinc 1.1 lässt sich dieser Schritt komfortabel mit
tinc -n NETZWERK init ersterknoten
und
tinc -n NETZWERK add connectto zweiterknoten
ausführen.
Man legt eine neue Datei mit dem Namen /etc/tinc/NETZWERK/hosts/ersterknoten, der in tinc.conf angegeben wurde, an. Zuerst wird die öffentliche IP-Adresse (oder eine darauf verweisende Domain) des Knotens angegeben.
Address = oeffentliche.ip.adresse.des.servers.org
Anschließend das Subnet des eigenen Knotens (angenommen, der Knoten besteht nur aus einem Rechner, hat das Subnet die Maske /32
):
Subnet = 10.8.0.1/32
Ebenso möglich wäre aber auch, jedem Knoten 255 Adressen zuzuweisen (z.B. von 10.8.1.0
bis 10.8.1.255
):
Subnet = 10.8.1.0/24
Dazu wird der folgende Befehl ausgeführt:
tincd -n NETZWERK -K
Dieser Schritt entfällt ab Version 1.1
Zuletzt wird noch das ausführbare [6] Skript tinc-up angelegt.
1 2 | #!/bin/sh ifconfig $INTERFACE 10.8.0.1 netmask 255.255.0.0 |
Die IP-Adresse gibt diejenige Adresse aus dem Knoten-Subnet an, unter der man später erreichbar sein wird. Die Netzmaske entspricht hierbei der des "kompletten" Tinc-Netzwerkes.
Diese Schritte werden für jeden Knoten ausgeführt, jeweils mit einem eigenen Subnet / eigener IP-Adresse. Als letztes werden die Dateien im host-Verzeichnis an jeden anderen Knoten weitergegeben.
Tinc 1.1 unterstützt hierbei die komfortablen Optionen import
, export
und exchange
. So kann man die Konfiguration via SSH mit dem Server foobar.example.org
synchronisieren:
tinc -n netname export | ssh foobar.example.org tinc -n netname exchange | tinc -n netname import
Tinc wird mit dem Kommando tincd
bedient. Zum Starten dient die Option start
:
tincd -n NETZWERK start
Ab Tinc 1.1 werden alle Kommandos mit dem Befehl tinc
(statt tincd
) durchgeführt. Außerdem gibt es eine Übersicht über das Netzwerk mit dem Parameter top
.
Man kann das eigene virtuelle Netzwerk in die Datei /etc/networks eintragen. Als Beispiel:
NETZWERK 10.0.0.0 # Netzwerkname und Subnet
Außerdem kann man in der Datei /etc/services dem Tinc-Service eine Port-Nummer (Standard: 655
) zuweisen, dadurch zeigen manche Programme statt der Portnummer den Namen des Services an:
tinc 655/tcp TINC tinc 655/udp TINC
Wenn man Tinc als Default-Gateway nutzt, so bestimmt man einen Knoten, über den dann der komplette eigene Internetverkehr geroutet wird - mit Ausnahme der Verbindung zu diesem Knoten. Dann benutzt man dieses Knoten als VPN, um z.B. Zensur zu umgehen oder Man-in-the-middle-Attacken in öffentlichen WLANs vorzubeugen. Bei OpenVPN ist dies als redirect-gateway
bekannt. Im Folgenden wird der Knoten, der das VPN bereitstellt, "Server" genannt, die Knoten, welche ihre Verbindung über den Server leiten, "Client".
Allgemein muss dazu in der Datei /etc/sysctl.conf die IP-Weiterleitung aktiviert sein. Dazu entfernt man das Kommentarzeichen vor der entsprechenden Zeile:
net.ipv4.ip_forward=1 # für IPv4 net.ipv6.conf.all.forwarding=1 # für IPv6
und übernimmt die Einstellungen mit:
sysctl -p
Dann ändert man in /hosts/server das Subnet auf Subnet = 0.0.0.0/0
(IPv4) bzw. ::/0
(IPv6). Zudem fügt man der Datei /etc/rc.local folgendes hinzu (eth0
muss durch den Netzwerkadapter mit der öffentlichen IP des Servers ersetzt werden, tun0
durch den Netzwerkadapters mit der VPN-internen IP, 10.8.0.0/16
gibt das Tinc-Subnet an):
iptables -A FORWARD -o eth0 -i tun0 -s 10.8.0.0/16 -m conntrack --ctstate NEW -j ACCEPT iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/16 -j MASQUERADE
Sollte dies nicht funktionieren, kann man teilweise auch Source-NAT verwenden, siehe Problembehebung.
Auf den Clients werden nun die host-up und host-down Dateien angepasst.
/etc/tinc/NETZWERK/hosts/server-up (INTERNE_SERVER_IP wird durch die VPN-interne Netzwerkadresse des Servers ersetzt):
1 2 3 4 5 6 7 8 | #!/bin/sh VPN_GATEWAY=INTERNE_SERVER_IP ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5` ip route add $REMOTEADDRESS $ORIGINAL_GATEWAY ip route add $VPN_GATEWAY dev $INTERFACE ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE |
/etc/tinc/NETZWERK/hosts/server-down:
1 2 3 4 5 6 7 | #!/bin/sh ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5` ip route del $REMOTEADDRESS $ORIGINAL_GATEWAY ip route del $VPN_GATEWAY dev $INTERFACE ip route del 0.0.0.0/1 dev $INTERFACE ip route del 128.0.0.0/1 dev $INTERFACE |
Sollte etwas nicht wie gewünscht funktionieren, so lässt sich Tinc mit den Parametern -D -d5
im Debug-Modus starten. Wird dadurch sehr viel ausgegeben, so kann man auch eine geringere Zahl als Parameter angeben.
Tinc lässt sich auch über eine TCP-Verbindung tunneln, was bei einigen Firewalls notwendig ist, allerdings die Geschwindigkeit beeinflussen kann. In der entsprechenden host-Datei wird folgendes eingefügt:
TCPonly = yes
Um den Port, über den ein Knoten erreichbar ist, zu ändern, müssen dessen tinc.conf und host-Datei angepasst werden:
tinc.conf:
BindToAddress = *:1234
Anstelle des Sternchens lässt sich auch eine spezielle Netzwerkadresse angeben.
hosts/knoten:
Port = 12345
Auf vielen virtuellen Servern teilt sich das virtualisierte Betriebssystem den Kernel mit dem Host, sodass einige benötigte Module nicht verfügbar sein können. Ob das TUN/TAP-Modul geladen wurde, erkennt man mit dem Befehl:
lsmod | grep tun
Sollte dies nicht der Fall sein (der Befehl gibt nichts zurück), so muss man das Gerät selbst erstellen:
sudo mkdir -p /dev/net sudo mknod /dev/net/tun c 10 200 sudo chmod 600 /dev/net/tun
Sollte das Masquerading-Modul von iptables nicht verfügbar sein, so kann man auch Source-NAT benutzen. Dazu ersetzt man in /etc/rc.local:
iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/16 -j MASQUERADE # das geht nur, wenn das Interface nicht venet0:0 (also keine Map) ist
durch
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -j SNAT --to-source EXT_IP
wobei EXT_IP
durch die öffentliche IP des Servers ersetzt wird.
Oftmals reicht eine Anfrage an die Administratoren des Servers, um die benötigten Module zu laden.
Dezentrales VPN mit Tinc - Tinc vermascht Rechner sicher übers Internet - heise Netze, 09/2009
Tunnelbau - Virtual Private Networks mit Tinc - Artikel ADMIN Magazin, 02/2009
VPN Programmübersicht
Tunneling 101 – von überall ins Netz (SSH, Tinc, Socks, Krypto) - Vortrag, Ubucon Berlin 2015
Diese Revision wurde am 25. März 2017 13:38 von aluso erstellt.