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.
[TOC]
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.