Tinc

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Programme kompilieren

  3. Ein Terminal öffnen

  4. Root-Rechte

  5. Einen Editor öffnen

  6. Dateien ausführbar machen

Inhaltsverzeichnis
  1. Installation
  2. Konfiguration
  3. Beispiele
  4. Problembehebung
  5. Links

tinclogo.png 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.

Hinweis:

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.254 beinhaltet.

Experten-Info:

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.

Installation

Tinc kann direkt aus den den offiziellen Paketquellen installiert [1] werden:

Wiki/Vorlagen/Installbutton/button.png 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.

Manuell

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 (Abschnitt „usr“)) verschoben wird. Dieses Verhalten kann wie in Programme kompilieren (Abschnitt „Weitere-Optionen“) 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.

Konfiguration

Konfigurationsdateien

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

tinc.conf

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

Hinweis:

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.

hosts

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

Schlüssel generieren

Dazu wird der folgende Befehl ausgeführt:

tincd -n NETZWERK -K 

Hinweis:

Dieser Schritt entfällt ab Version 1.1

tinc-up

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.

Weitere Knoten

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.

Hinweis:

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 

Experten-Info:

Es gibt noch einige weitere Konfigurationsmöglichkeiten, u.a. kann Tinc auch ein auf Layer-2-basiertes Netzwerk erstellen oder IPv6 und ECDSA nutzen. Hier sei auf die umfangreichen Manpages von Tinc verwiesen.

Tinc starten

Tinc wird mit dem Kommando tincd bedient. Zum Starten dient die Option start:

tincd -n NETZWERK start 

Hinweis:

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.

Optional: Symbolische Namen

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

Beispiele

Tinc als Default-Gateway

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".

Server

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.

Client

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
    

Problembehebung

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.

Firewall

UDP Pakete werden blockiert

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

Port wird blockiert

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

Virtualisierte Systeme

TUN/TAP

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 

iptables masquerading

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.

Hinweis:

Oftmals reicht eine Anfrage an die Administratoren des Servers, um die benötigten Module zu laden.