Ich werde regelmäßig gefragt, welches VPN sich am besten eignet, um mehrere Computer miteinander zu verbinden. Meistens um darüber Fernwartung und Monitoring zu betreiben, oder um auf andere Dienste zugreifen zu können, ohne das diese Dienste dabei "von außen" erreichbar sind.

Ich nutze dafür sehr gerne Tinc.
Warum ich Tinc mag, und wie man TINC einrichtet, möchte ich euch hier zeigen.

  • Der größte Vorteil von Tinc ist die einfache Grundkonfiguration.
  • Der Daemon benötigt nur wenig Ressourcen.
  • Das VPN ist performant.
  • Es gibt wenig Probleme mit Firewall Konfigurationen oder den diversen NAT Spielarten.
  • So lange einer der Knoten erreichbar ist, funktioniert die Verbindung zwischen allen Knoten.

  • Die größte Schwäche ist die fehlende Schlüsselverwaltung.
    Um einen Knoten aus dem Netz wieder auszuschließen, müssen an allen Rechnern die Schlüssel neu erstellt und verteilt werden.
    Für dynamische VPN-Szenarien ist Tinc daher nur eingeschränkt zu empfehlen.

UPDATE
Für Szenarien in denen eine Kontrolle über alle VPN-Knoten nicht möglich ist (Smartphone, Notebook, ...) setze ich mittlerweile bevorzugt WireGuard als VPN ein.

Wenn wir aber, wie in diesem Beispiel, die Kontrolle über alle Knoten haben und sich die Teilnehmer des VPN normalerweise nicht ändern, ist Tinc eine gute Wahl.

Was wir zum starten brauchen, ist ein Schlüsselpaar für jeden Netzknoten eine Konfigurationsdatei und ein Startskript um das Netzwerk zu installieren.

in diesem Beispiel wollen wir 2 PCs (clt01 und clt02) mit einem Server (vps01) verbinden, der eine feste IP im Internet hat. Das VPN soll später für das Management und Monitoring des vps01 genutzt werden können.

Die Befehle werden alle als root ausgeführt.
Also zuerst mit su - root werden, oder allen Befehlen ein sudo voranstellen.

vps01 ist der wichtigste Knoten. Er dient als zentraler Knoten, zu dem sich alle anderen verbinden.
Für die Konfiguration benötigen wir seine öffentliche IP-Adresse (im Beispiel: 12.34.56.78)

Installation unter CentOS
Das Paket für tinc befindet sich im EPEL-Repository, das wir mit dem ersten Befehl installieren (falls erforderlich).

yum -y install epel-release 
yum -y install tinc

Als nächstes erstellen wir die Konfigurationsverzeichnisse und -dateien. Dabei verwenden wir "vpn01" als Netznamen, für unser VPN.

mkdir -p /etc/tinc/vpn01/hosts
touch /etc/tinc/vpn01/tinc{-up,-down,.conf}
chmod +x /etc/tinc/vpn01/tinc{-up,-down}
touch /etc/tinc/vpn01/hosts/{vps01,clt01,clt02}

Dann füllen wir unsere Konfigurationsdateien mit Inhalt. /etc/tinc/vpn01/tinc.conf

Name = vps01
AddressFamily = ipv4
Interface = tun0

/etc/tinc/vpn01/tinc-up

#!/bin/sh
ifconfig $INTERFACE 192.168.125.1 netmask 255.255.255.0

/etc/tinc/vpn01/tinc-down

#!/bin/sh
ifconfig $INTERFACE down

/etc/tinc/vpn01/hosts/vps01
Hier bitte hinter Address = die öffentliche IP-Adresse des Servers eintragen.

Address = 12.34.56.78
Subnet = 192.168.125.1/32

/etc/tinc/vpn01/hosts/clt01

Subnet = 192.168.125.101/32

/etc/tinc/vpn01/hosts/clt02

Subnet = 192.168.125.102/32

Schlüsselpaar erstellen
Jetzt erstellen wir das Schlüsselpaar für vps01.

tincd -n vpn01 -K4096

Ausgabe
Wir werden nach dem Dateinamen für die beiden Schlüsseldateien gefragt. Hier können wir einfach den Vorschlag übernehmen.

Generating 4096 bits keys:
................................................................................++ p
...++ q
Done.
Please enter a file to save private RSA key to [/etc/tinc/vpn01/rsa_key.priv]: 
Please enter a file to save public RSA key to [/etc/tinc/vpn01/hosts/vps01]: 

Jetzt kopieren wir uns noch den öffentlichen Schlüssel in das tmp-Verzeichnis.
(Erklärung siehe: Öffentliche Schlüssel austauschen)

cp /etc/tinc/vpn01/hosts/vps01 /tmp

Als letztes müssen wir in der Firewall noch die Ports für tinc freischalten.

firewall-cmd --add-port=655/tcp
firewall-cmd --add-port=655/udp

Auch hier installieren wir als erstes tinc.

yum -y install epel-release
yum -y install tinc

Dann erstellen wir die Konfigurationsverzeichnisse und -dateien. Dabei verwenden wir auch "vpn01" als Netznamen, für unser VPN.

mkdir -p /etc/tinc/vpn01/hosts
touch /etc/tinc/vpn01/tinc{-up,-down,.conf}
chmod +x /etc/tinc/vpn01/tinc{-up,-down}
touch /etc/tinc/vpn01/hosts/{vps01,clt01}

Als nächstes füllen wir wieder unsere Konfigurationsdateien mit Inhalt.

/etc/tinc/vpn01/tinc.conf

Name = clt01
AddressFamily = ipv4

/etc/tinc/private/tinc-up

#!/bin/sh
ifconfig $INTERFACE 192.168.125.101 netmask 255.255.255.0

/etc/tinc/private/tinc-down

#!/bin/sh
ifconfig $INTERFACE down

/etc/tinc/private/hosts/vps01
Hier bitte hinter Address = die öffentliche IP-Adresse des Servers eintragen.

Address = 12.34.56.78
Subnet = 192.168.125.1/32

/etc/tinc/private/hosts/clt01

Subnet = 192.168.125.101/32

Schlüsselpaar erstellen
Jetzt erstellen wir das Schlüsselpaar für clt01 und übernehmen wieder die vorgeschlagenen Namen für die Schlüsseldateien.

tincd -n vpn01 -K4096

Damit sich die beiden Knoten miteinander unterhalten können, müssen wir jetzt noch die öffentlichen Schlüssel des jeweils anderen Knoten kopieren.

Dazu nehmen wir den folgenden Textblock, inclusive des Textes zwischen den beiden Zeilen, und kopieren diesen in die hosts-Datei des anderen Knotens.

-----BEGIN RSA PUBLIC KEY-----                                  

-----END RSA PUBLIC KEY-----                                    

Am einfachsten geht das per scp, wenn wir uns per ssh von Konten 2 zu Knoten 1 verbinden können.

Beispiel scp auf dem Knoten 2

scp user@12.34.56.78:/tmp/vps01 /tmp
scp /etc/tinc/vpn01/hosts/clt01 user@12.34.56.78:/tmp
cp /tmp/vps01 /etc/tinc/vpn01/hosts/vps01

Anschließend müssen auf beiden Knoten die Dateien /etc/vpn01/hosts/vps01 und /etc/vpn01/hosts/clt01 mit dem zugehörigen Public Key-Eintrag vorhanden sein.

Das VPN starten wir auf beiden Knoten mit dem folgenden Befehl:

systemctl start tinc@vpn01.service

Anschließend können wir die beiden IP-Adressen anpingen.

ping 192.168.125.1
ping 192.168.125.101

Zusätzliche Knoten können wir nach der Anleitung für den Knoten 2 erstellen, müssen dabei nur den Namen und die IP-Adresse des Knotens ändern.

Auf den neuen Knoten brauchen wir jeweils nur die Schlüsseldatei des Knoten 1 und auf dem Knoten 1 müssen die Schlüsseldateien aller Knoten liegen.

Die neuen Knoten können sich ohne weitere Anpassungen auch anpingen (z.B. Knoten 2 zu Koten 3). Die Verbindung läuft dabei über den Konten 1.

Funktioniert alles, wie gewünscht, können wir tinc beim booten automatisch mit starten lassen.
Das sollten wir mindestens auf dem Knoten 1 machen.

systemctl enable tinc@vpn01.service

Außerdem müssen wir auf dem Knoten 1 noch die Firewall-Konfiguration dauerhaft einrichten.
(siehe auch: TINC Service für firewalld)

firewall-cmd --permanent --add-port=655/tcp
firewall-cmd --permanent --add-port=655/udp

Statt des alten ifconfig-Befehls können wir auch den moderneren ip-Befehl verwenden, um unser Interface zu konfigurieren.

/etc/tinc/private/tinc-up

#!/bin/sh                                                        
/usr/sbin/ip link set dev $INTERFACE up mtu 1280 txqueuelen 1000
/usr/sbin/ip addr add 192.168.125.1/24 dev $INTERFACE         

/etc/tinc/private/tinc-down

#!/bin/sh                                             
/usr/sbin/ip addr del 192.168.125.1 dev $INTERFACE 
/usr/sbin/ip link set $INTERFACE down                

Mit dieser service-Definition werden die Ports für bis zu 5 TINC Instanzen in der Firewall freigeschaltet.

/etc/firewalld/services/tinc.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>tinc VPN</short>
  <description>tinc is a Virtual Private Network (VPN) daemon that uses tunnelling and encryption to create a secure private network between hosts on the Internet.</description>
  <port protocol="tcp" port="655-659"/>
  <port protocol="udp" port="655-659"/>
</service>  
firewall-cmd --reload
firewall-cmd --add-service=tinc
firewall-cmd --permanent --add-service=tinc

In der Standardkonfiguration erstellt Tinc ein eigenes Interface, das mit beenden des Daemons gelöscht wird.
Das wird dann zu einem Problem, wenn wir andere Dienste an dieses Interface binden wollen.

Die Lösung dafür ist recht einfach.

Als erstes kommentieren wir alle Befehle in den Dateien tinc-up und tinc-down aus.

Dan erstellen wir für unser Interface (hier bsw. tun0) eine Konfigurationsdatei und starten unser Netzwerk neu, damit das Interface erstellt wird.

/etc/sysconfig/network-scripts/ifcfg-tun0

DEVICE=tun0
TYPE=Tap
IPADDR=192.168.125.1
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
ARPCHECK=no
ARPUPDATE=no

Jetzt haben wir ein tun0 Interface mit unserer Konfiguration und können unsere Dienste an die IP binden, ohne das ein Neustart von Tinc diese Dienste beeinträchtigt.