Tinc ist ein Open-Source Virtual Private Network (VPN)-Daemon mit nützlichen Funktionen wie Verschlüsselung, optionaler Komprimierung und automatischem Mesh-Routing, der VPN-Verkehr opportunistisch direkt zwischen Servern routen kann. Diese Funktionen unterscheiden tinc von anderen VPN-Lösungen und machen es zu einer guten Wahl für die Erstellung eines VPN aus vielen kleinen, geografisch verteilten Netzwerken.
In diesem Tutorial gehen wir darauf ein, wie Sie mit tinc ein sicheres VPN erstellen, in dem Ihre Server kommunizieren können, als ob sie sich in einem lokalen Netzwerk befinden würden. Wir werden auch demonstrieren, wie man mit tinc einen sicheren Tunnel in einem privaten Netzwerk einrichtet. Wir verwenden Ubuntu-18.04-Server, aber die Konfigurationen können für die Verwendung mit jedem anderen Betriebssystem angepasst werden.
Um mehrere Anwendungsfälle abzudecken, beschreibt dieses Tutorial die Verbindung eines Client-Knotens mit dem VPN über eine private Netzwerkschnittstelle und eines anderen über eine öffentliche. Sie können diese Einrichtung jedoch an Ihre eigenen Bedürfnisse anpassen. Sie müssen nur planen, wie Ihre Server aufeinander zugreifen sollen, und die in diesem Tutorial vorgestellten Beispiele an Ihre eigenen Bedürfnisse anpassen. Achten Sie darauf, die in den Beispielen hervorgehobenen Werte durch Ihre eigenen Werte zu ersetzen, wenn Sie eine Anpassung an Ihre eigene Einrichtung vornehmen. Es könnte jedoch in Ihrem Interesse sein, zunächst dem Tutorial in der vorliegenden Form zu folgen, um sicherzustellen, dass Sie die beteiligten Komponenten und Prozesse verstehen, bevor Sie diese Anleitung modifizieren.
Um die Übersichtlichkeit zu wahren, wird in diesem Tutorial wie folgt auf die Server verwiesen:
Anmerkung: Tinc selbst unterscheidet nicht zwischen Servern (Rechnern, die VPN-Dienste hosten und bereitstellen) und Clients (Rechnern, die sich mit dem sicheren privaten Netzwerk verbinden und es verwenden). Es kann jedoch hilfreich sein, die Funktionsweise von tinc zu verstehen und zu visualisieren, indem Sie sich Ihre Server so vorstellen.
Hier ist eine Darstellung des VPN, das wir einrichten möchten:
Das blaue Feld steht für unser VPN und das rosa Feld für das zugrunde liegende private Netzwerk. Alle drei Server können über das VPN kommunizieren, obwohl das private Netzwerk ansonsten für client-02 nicht zugänglich ist.
Wenn Sie diesem Tutorial genau folgen möchten, stellen Sie zwei Ubuntu-18.04-Server (server-01 und client-01) in demselben Datencenter bereit und aktivieren Sie auf jedem das private Netzwerk. Erstellen Sie dann einen weiteren Ubuntu-18.04-Server (client-02) in einem separaten Datencenter. Jeder Server sollte über einen administrativen Benutzer und eine mit ufw
konfigurierte Firewall verfügen. Um dies einzurichten, folgen Sie unserem Leitfaden für die Ersteinrichtung des Servers für Ubuntu 18.04.
Zusätzlich müssen wir später in diesem Tutorial einige Dateien zwischen den einzelnen Rechnern mit scp
übertragen. Aus diesem Grund müssen Sie auf jedem Ihrer Server SSH-Schlüssel generieren, die SSH-Schlüssel von client-01 und client-02 zu der Datei authorized_keys
von server-01 und dann den SSH-Schlüssel von server-01 zu den Dateien authorized_keys
von client-01 und client-02 hinzufügen. Hilfe für das Einrichten finden Sie in unserem Leitfaden So richten Sie SSH-Schlüssel unter Ubuntu 18.04 ein.
Tinc ist aus den Standard-APT-Repositorys von Ubuntu verfügbar, d. h., wir können es mit nur wenigen Befehlen installieren.
Sofern Sie dies nicht kürzlich getan haben, führen Sie auf jedem Server den folgenden Befehl aus, um die jeweiligen Paketindizes zu aktualisieren:
- sudo apt update
Installieren Sie dann tinc auf jedem Server, indem Sie den folgenden Befehl ausführen:
- sudo apt install tinc
Damit haben Sie tinc auf jedem Ihrer Server installiert. Sie müssen jedoch einige Änderungen an der Konfiguration von tinc auf jedem Rechner vornehmen, damit Ihr VPN ausgeführt werden kann. Beginnen wir mit der Aktualisierung von server-01.
Tinc erfordert, dass jeder Rechner, der Teil des VPN sein wird, die folgenden drei Konfigurationskomponenten aufweist:
tinc.conf
, die den Netznamen, das Netzwerkgerät, über das VPN ausgeführt wird, und andere VPN-Optionen definiert;tinc-up
, ein Skript, das das in tinc.conf
definierte Netzwerkgerät nach dem Start von tinc aktiviert;tinc-down
, die das Netzwerkgerät deaktiviert, wenn tinc stoppt.Tinc verwendet einen Netznamen, um ein tinc-VPN von einem anderen zu unterscheiden. Dies ist hilfreich, wenn Sie mehrere VPNs einrichten möchten. Es wird jedoch empfohlen, einen Netznamen selbst dann zu verwenden, wenn Sie nur ein VPN konfigurieren wollen. Sie können Ihrem VPN einen beliebigen Netznamen geben, aber der Einfachheit halber nennen wir unser VPN netname
.
Erstellen Sie auf server-01 die Konfigurationsverzeichnisstruktur für das VPN:
- sudo mkdir -p /etc/tinc/netname/hosts
Verwenden Sie Ihren bevorzugten Texteditor, um eine Datei tinc.conf
zu erstellen. Wir verwenden hier nano
:
- sudo nano /etc/tinc/netname/tinc.conf
Fügen Sie der leeren Datei die folgenden Zeilen hinzu. Diese konfigurieren einen tinc-Knoten namens server_01
mit einer Netzwerkschnittstelle namens tun0
, die IPv4 verwenden wird:
Name = server_01
AddressFamily = ipv4
Interface = tun0
Warnung: Beachten Sie, dass der Wert nach der Anweisung Name
einen Unterstrich (_
) anstatt eines Bindestrichs (-
) enthält. Dies ist wichtig, da tinc verlangt, dass der Wert Name
nur alphanumerische oder Unterstrich-Zeichen enthält. Wenn Sie hier einen Bindestrich verwenden, werden Sie bei dem Versuch, das VPN später in diesem Leitfaden zu starten, auf einen Fehler stoßen.
Speichern und schließen Sie die Datei nach dem Hinzufügen dieser Zeilen. Wenn Sie nano
verwendet haben, drücken Sie STRG+X
, Y
, dann die EINGABETASTE
.
Erstellen Sie als Nächstes eine Host-Konfigurationsdatei namens server_01
im Unterverzeichnis hosts
. Letztendlich werden die Client-Knoten diese Datei zur Kommunikation mit server-01 verwenden:
- sudo nano /etc/tinc/netname/hosts/server_01
Auch hier ist zu beachten, dass der Name dieser Datei einen Unterstrich und keinen Bindestrich enthält. Auf diese Weise entspricht er der Anweisung Name
in der Datei tinc.conf
, was es tinc ermöglicht, den öffentlichen RSA-Schlüssel des Servers automatisch an diese Datei anzuhängen, wenn wir die Datei später generieren.
Fügen Sie die folgenden Zeilen in die Datei ein und stellen Sie sicher, dass die öffentliche IP-Adresse von server-01 enthalten ist:
Address = server-01_public_IP_address
Subnet = 10.0.0.1/32
Das Feld Address
gibt an, wie sich andere Knoten mit diesem Server verbinden werden, und Subnet
gibt an, welches Subnetz dieser Daemon bedienen wird. Speichern und schließen Sie die Datei.
Erzeugen Sie als Nächstes mit dem folgenden Befehl ein Paar öffentlicher und privater RSA-Schlüssel für diesen Host:
- sudo tincd -n netname -K4096
Nach Ausführung dieses Befehls werden Sie dazu aufgefordert, die Dateinamen einzugeben, unter denen tinc die öffentlichen und privaten RSA-Schlüssel speichern wird:
Output. . .
Please enter a file to save private RSA key to [/etc/tinc/netname/rsa_key.priv]:
Please enter a file to save public RSA key to [/etc/tinc/netname/hosts/server_01]:
Drücken Sie die EINGABETASTE
, um bei jeder Eingabeaufforderung die Standardspeicherorte zu akzeptieren; dadurch wird tinc angewiesen, den privaten Schlüssel in einer Datei namens rsa_key.priv
zu speichern und den öffentlichen Schlüssel an die Host-Konfigurationsdatei server_01
anzuhängen.
Als Nächstes erstellen Sie tinc-up
, das Skript, das bei jedem Start des VPNs netname
ausgeführt wird:
- sudo nano /etc/tinc/netname/tinc-up
Fügen Sie die folgenden Zeilen hinzu:
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.1/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE
Im Folgenden wird erläutert, was jede dieser Zeilen bewirkt:
ip link …
: setzt den Status der virtuellen Netzwerkschnittstelle von tinc auf up
ip addr …
: fügt der virtuellen Netzwerkschnittstelle von tinc die IP-Adresse 10.0.0.1
mit einer Netzmaske von 32
hinzu, wodurch die anderen Rechner im VPN die IP-Adressse von server-01 als 10.0.0.1
sehen.ip route …
: fügt eine Route (10.0.0.0/24
) hinzu, die über die virtuelle Netzwerkschnittstelle von tinc erreicht werden kann.Speichern und schließen Sie die Datei nach dem Hinzufügen dieser Zeilen.
Als Nächstes erstellen Sie ein Skript, um die virtuelle Netzwerkschnittstelle zu entfernen, wenn Ihr VPN gestoppt wird:
- sudo nano /etc/tinc/netname/tinc-down
Fügen Sie die folgenden Zeilen hinzu:
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down
Diese Zeilen haben die entgegengesetzte Wirkung wie die des Skripts tinc-up
:
ip route …
: Löscht die Route 10.0.0.0/24
ip addr …
: löscht die IP-Adresse 10.0.0.1
aus der virtuellen Netzwerkschnittstelle von tincip link …
: setzt den Status der virtuellen Netzwerkschnittstelle von tinc auf down
Speichern und schließen Sie die Datei und machen Sie dann diese beiden neuen Netzwerkskripte ausführbar:
- sudo chmod 755 /etc/tinc/netname/tinc-*
Fügen Sie als letzten Schritt der Konfiguration von server-01 eine Firewall-Regel hinzu, die den Datenverkehr über Port 655
, den Standardport von tinc, zulässt:
- sudo ufw allow 655
server-01 ist nun vollständig konfiguriert und Sie können mit der Einrichtung Ihrer Client-Knoten fortfahren.
Ihre beiden Client-Rechner benötigen eine etwas andere Konfiguration als der Server, obwohl der Prozess im Allgemeinen recht ähnlich ist.
Aufgrund der Einrichtung, die wir in diesem Leitfaden anstreben, werden wir client-01 und client-02 fast identisch, mit nur wenigen kleinen Unterschieden zwischen ihnen, konfigurieren. Daher müssen viele der in diesem Schritt gegebenen Befehle auf beiden Rechnern ausgeführt werden. Beachten Sie jedoch, dass, wenn client-01 oder client-02 einen bestimmten Befehl oder eine spezielle Konfiguration erfordern, diese Anweisungen in einem blauen bzw. roten Befehlsblock angezeigt werden.
Replizieren Sie sowohl auf client-01 als auch auf client-02 die auf server-01 erstellte Verzeichnisstruktur:
- sudo mkdir -p /etc/tinc/netname/hosts
Erstellen Sie dann eine Datei tinc.conf
:
- sudo nano /etc/tinc/netname/tinc.conf
Fügen Sie auf beiden Rechnern die folgenden Zeilen in die Datei ein:
Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01
Stellen Sie sicher, dass Sie node_name
durch den Namen des jeweiligen Client-Knotens ersetzen. Auch hier ist darauf zu achten, dass dieser Name einen Unterstrich (_
) und keinen Bindestrich verwendet.
Beachten Sie, dass diese Datei eine Anweisung ConnectTo
enthält, die auf server_01
verweist, während die Datei tinc.conf
von server-01 diese Anweisung nicht enthält. Indem Sie keine Anweisung ConnectTo
auf server-01 einbinden, bedeutet dies, dass server-01 nur auf eingehende Verbindungen lauscht. Dies funktioniert für unsere Einrichtung, da es keine Verbindung mit anderen Rechnern herstellt.
Speichern und schließen Sie die Datei.
Erstellen Sie als Nächstes auf jedem Client-Knoten eine Host-Konfigurationsdatei. Achten Sie auch hier darauf, dass der Dateinamen mit einem Unterstrich statt eines Bindestrichs geschrieben wird:
- sudo nano /etc/tinc/netname/hosts/node_name
Fügen Sie für client-01 diese Zeile hinzu:
Subnet = 10.0.0.2/32
Fügen Sie für client-02 diese Zeile hinzu:
Subnet = 10.0.0.3/32
Beachten Sie, dass jeder Client ein anderes Subnetz hat, das tinc bedienen wird. Speichern und schließen Sie die Datei.
Erzeugen Sie als Nächstes auf jedem Client-Rechner die Schlüsselpaare:
- sudo tincd -n netname -K4096
Wie auch bei server-01 drücken Sie bei der Aufforderung zur Dateiauswahl zum Speichern der RSA-Schlüssel die EINGABETASTE
, um die Standardauswahl zu akzeptieren.
Erstellen Sie anschließend das Startskript für die Netzwerkschnittstelle auf jedem Client:
- sudo nano /etc/tinc/netname/tinc-up
Fügen Sie für client-01 diese Zeilen hinzu:
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.2/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE
Fügen Sie für client-02 Folgendes hinzu:
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.3/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE
Speichern und schließen Sie jede Datei.
Erstellen Sie als Nächstes auf jedem Client das Stoppskript für die Netzwerkschnittstelle:
- sudo nano /etc/tinc/netname/tinc-down
Fügen Sie auf client-01 den folgenden Inhalt in die leere Datei ein:
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.2/32 dev $INTERFACE
ip link set $INTERFACE down
Fügen Sie auf client-02 Folgendes hinzu:
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.3/32 dev $INTERFACE
ip link set $INTERFACE down
Speichern und schließen Sie die Dateien.
Machen Sie Netzwerkskripte ausführbar, indem Sie auf jedem Client-Rechner den folgenden Befehl ausführen:
- sudo chmod 755 /etc/tinc/netname/tinc-*
Öffnen Sie zum Schluss Port 655
auf jedem Client:
- sudo ufw allow 655
Zu diesem Zeitpunkt sind die Client-Knoten fast, wenn auch nicht ganz, eingerichtet. Sie benötigen noch den öffentlichen Schlüssel, den wir im vorherigen Schritt auf server-01 erstellt haben, um die Verbindung zum VPN zu authentifizieren.
Jeder Knoten, der direkt mit einem anderen Knoten kommunizieren möchte, muss öffentliche Schlüssel ausgetauscht haben, die sich innerhalb der Host-Konfigurationsdateien befinden. In unserem Fall muss server-01 öffentliche Schlüssel mit den anderen Knoten austauschen.
Kopieren Sie auf client-01 seine Host-Konfigurationsdatei auf server-01. Da sich sowohl client-01 als auch server-01 im selben Datencenter befinden und beide über ein aktiviertes privates Netzwerk verfügen, können Sie hier die private IP-Adresse von server01 verwenden:
- scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp
Kopieren Sie dann auf server-01 die Host-Konfigurationsdatei von client-01
in das Verzeichnis /etc/tinc/netname/hosts/
:
- sudo cp /tmp/client_01 /etc/tinc/netname/hosts/
Kopieren Sie dann, während Sie sich noch auf server-01 befinden, dessen Host-Konfigurationsdatei nach client-01:
- scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp
Kopieren Sie auf client-01 die Datei von server-01 an den entsprechenden Ort:
- sudo cp /tmp/server_01 /etc/tinc/netname/hosts/
Bearbeiten Sie auf client-01 die Host-Konfigurationsdatei von server-01, damit das Feld Address
auf die private IP-Adresse von server-01 gesetzt wird. Auf diese Weise verbindet sich client-01 über das private Netzwerk mit dem VPN:
- sudo nano /etc/tinc/netname/hosts/server_01
Ändern Sie die Anweisung Address
so, dass sie auf die private IP-Adresse von server-01 verweist:
Address = server-01_private_IP
Subnet = 10.0.0.1/32
Speichern und beenden. Gehen wir jetzt zu unserem verbleibenden Knoten, client-02.
Kopieren Sie auf client-02 seine Host-Konfigurationsdatei auf server-01:
- scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp
Kopieren Sie dann auf server-01 die Host-Konfigurationsdatei von client_02
an den entsprechenden Ort:
- sudo cp /tmp/client_02 /etc/tinc/netname/hosts/
Kopieren Sie dann die Host-Konfigurationsdatei von server-01 nach client-02:
- scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp
Kopieren Sie auf client-02 die Datei von server-01 an den entsprechenden Ort:
- sudo cp /tmp/server_01 /etc/tinc/netname/hosts/
Angenommen, Sie richten nur zwei Client-Knoten ein, dann sind Sie mit der Verteilung der öffentlichen Schlüssel fertig. Wenn Sie jedoch ein größeres VPN erstellen, ist jetzt ein guter Zeitpunkt, um die Schlüssel zwischen diesen anderen Knoten auszutauschen. Denken Sie daran, dass, wenn zwei Knoten direkt miteinander kommunizieren sollen (ohne einen Weiterleitungsserver dazwischen), sie ihre Schlüssel/Host-Konfigurationsdateien ausgetauscht haben müssen und auf die realen Netzwerkschnittstellen des jeweils anderen zugreifen können müssen. Es ist außerdem in Ordnung, die Konfigurationsdatei jedes Hosts einfach auf jeden Knoten im VPN zu kopieren.
Starten Sie tinc auf jedem Knoten, beginnend mit server-01, mit dem folgenden Befehl:
- sudo tincd -n netname -D -d3
Dieser Befehl enthält das Flag -n
, das auf den Netznamen für unser VPN netname
verweist. Dies ist nützlich, wenn Sie mehr als ein VPN eingerichtet haben und Sie angeben müssen, welches Sie starten möchten. Es enthält auch das Flag -D
, das die Gabelung und Trennung von tinc verhindert sowie den automatischen Neustartmechanismus von tinc deaktiviert. Schließlich enthält es das Flag -d
, das tinc anweist, im Debug-Modus mit einem Debug-Level von 3
zu laufen.
Anmerkung: Wenn es um den tinc-Daemon geht, zeigt ein Debug-Level von 3
jede zwischen zwei beliebigen Servern ausgetauschte Anfrage, einschließlich Authentifizierungsanforderungen, Schlüsselaustausch und Aktualisierungen von Verbindungslisten. Höhere Debug-Level zeigen mehr Informationen über den Netzwerkverkehr an, aber im Moment geht es nur darum, ob die Knoten miteinander kommunizieren können. Daher ist ein Level von 3
ausreichend. In einem Produktivszenario würden Sie jedoch zu einem niedrigeren Debug-Level wechseln wollen, um die Festplatten nicht mit Protokolldateien zu füllen.
Sie können mehr über die Debug-Level von tinc erfahren, indem Sie die offizielle Dokumentation durchsehen.
Nachdem der Daemon auf jedem Knoten gestartet wurde, sollten Sie eine Ausgabe mit den Namen der einzelnen Knoten sehen, wenn sie sich mit server-01 verbinden. Testen wir jetzt die Verbindung über das VPN.
Pingen Sie in einem separaten Fenster auf client-02 die VPN IP-Adresse von client-01 an. Dieser haben wir zuvor 10.0.0.2
zugewiesen:
- ping 10.0.0.2
Der Ping sollte korrekt funktionieren und Sie sollten in den anderen Fenstern einige Debug-Ausgaben über die Verbindung im VPN sehen. Dies zeigt an, dass client-02 über das VPN über server-01 mit client-01 kommunizieren kann. Drücken Sie STRG+C
, um den Ping zu beenden.
Sie können die VPN-Schnittstellen auch für jede andere Netzwerkkommunikation verwenden, z. B. für Anwendungsverbindungen, das Kopieren von Dateien und SSH.
Beenden Sie in jedem Debug-Fenster des tinc-Daemons den Daemon durch drücken von STRG+\
.
Ubuntu-Server verwenden systemd
als standardmäßigen Systemmangager, um das Starten und Ausführen von Prozessen zu steuern. Aus diesem Grund können wir das VPN netname
so aktivieren, dass es beim Booten mit einem einzigen systemctl
-Befehl automatisch gestartet wird.
Führen Sie den folgenden Befehl auf jedem Knoten aus, um das tinc-VPN so einzustellen, dass es bei jedem Booten des Rechners startet:
- sudo systemctl enable tinc@netname
Tinc ist so konfiguriert, dass es auf jedem Rechner beim Booten startet, und Sie können es mit dem Befehl systemctl
steuern. Wenn Sie es jetzt starten möchten, führen Sie den folgenden Befehl auf jedem Ihrer Knoten aus:
- sudo systemctl start tinc@netname
Anmerkung: Wenn Sie mehrere VPN haben, aktivieren oder starten jedes sofort, so wie hier:
- sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n
Damit ist Ihr tinc-VPN vollständig konfiguriert und wird auf jedem Ihrer Knoten ausgeführt.
Nachdem Sie dieses Tutorial durchgearbeitet haben, sollten Sie nun eine gute Grundlage haben, um Ihr VPN entsprechend Ihren Bedürfnissen auszubauen. Tinc ist sehr flexibel und jeder Knoten kann so konfiguriert werden, dass er sich mit jedem anderen Knoten (auf den er über das Netzwerk zugreifen kann) verbindet, sodass er als Mesh-VPN fungieren kann, ohne sich auf einen einzelnen Knoten zu verlassen.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!