[[Vorlage(Archiviert)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme kompilieren:] [:Terminal: Ein Terminal öffnen] [:sudo: Root-Rechte] [:Editor: Einen Editor öffnen] [:chmod: Dateien ausführbar machen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(tinclogo.png, 100, align=left)]] [https://tinc-vpn.org/ Tinc] {en} ist eine dezentrale [wikipedia:Virtual_Private_Network: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 [wikipedia:Asymmetrisches Kryptosystem:asymmetrische Verschlüsselung] und dezentrales [wikipedia:Vermaschtes_Netz: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. {{{#!vorlage 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. }}} {{{#!vorlage Experten Vor Version 1.1 unterstützt Tinc das sogenannte [wikipedia:Hole Punching:] nicht, wie etwa die VPN-Software [http://www.ntop.org/products/n2n/ n2n] {en}. 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: {{{#!vorlage Paketinstallation tinc, universe }}} 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 [https://tinc-vpn.org/download/ Homepage] {en} {dl} 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#usr:]) verschoben wird. Dieses Verhalten kann wie in [:Programme_kompilieren#Weitere-Optionen:] beschrieben geändert werden. Meist müssen neben den von über [3][4]: {{{#!vorlage Befehl 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 [wikipedia: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 }}} {{{#!vorlage Hinweis Ab Tinc 1.1 lässt sich dieser Schritt komfortabel mit {{{#!vorlage Befehl tinc -n NETZWERK init ersterknoten \}}} und {{{#!vorlage Befehl 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: {{{#!vorlage Befehl tincd -n NETZWERK -K }}} {{{#!vorlage Hinweis Dieser Schritt entfällt ab Version 1.1 }}} === tinc-up === Zuletzt wird noch das ausführbare [6] Skript '''tinc-up''' angelegt. {{{#!code bash #!/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. {{{#!vorlage 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: {{{#!vorlage Befehl tinc -n netname export | ssh foobar.example.org tinc -n netname exchange | tinc -n netname import \}}} }}} {{{#!vorlage Experten Es gibt noch einige weitere Konfigurationsmöglichkeiten, u.a. kann Tinc auch ein auf Layer-2-basiertes Netzwerk erstellen oder IPv6 und [wikipedia:ECDSA:] nutzen. Hier sei auf die umfangreichen [:man:Manpages] von Tinc verwiesen. }}} == Tinc starten == Tinc wird mit dem Kommando `tincd` bedient. Zum Starten dient die Option `start`: {{{#!vorlage Befehl tincd -n NETZWERK start }}} {{{#!vorlage 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: {{{#!vorlage Befehl 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 [:rc.local:/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 [#Virtualisierte-Systeme 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): {{{#!code bash #!/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''': {{{#!code bash #!/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 }}} ##=== Proxy === == 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: {{{#!vorlage Befehl lsmod | grep tun }}} Sollte dies nicht der Fall sein (der Befehl gibt nichts zurück), so muss man das Gerät selbst erstellen: {{{#!vorlage Befehl 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. {{{#!vorlage Hinweis Oftmals reicht eine Anfrage an die Administratoren des Servers, um die benötigten Module zu laden. }}} = Links = * [https://tinc-vpn.org/ Projektseite] {en} * [https://tinc-vpn.org/docs/ Dokumentation] {en} * [heise:-785436:Dezentrales VPN mit Tinc - Tinc vermascht Rechner sicher übers Internet] - heise Netze, 09/2009 * [https://www.admin-magazin.de/Das-Heft/2009/02/Virtual-Private-Networks-mit-Tinc Tunnelbau - Virtual Private Networks mit Tinc] - Artikel ADMIN Magazin, 02/2009 * [:Serverdienste#VPN:VPN] {Übersicht} Programmübersicht * [youtube:V-fhXawtQXQ?t=38m50s: Tunneling 101 – von überall ins Netz (SSH, Tinc, Socks, Krypto)] {de} - Vortrag, Ubucon Berlin 2015 #tag: Netzwerk, Sicherheit, Server, VPN