Tinc auf Linux einrichten

Beitragsbild aus Wikipedia (Ludovic.ferre)

Ich fühle mich mal wieder gezwungen, ein VPN, also ein Virtuelles-Privates-Netzwerk einzurichten. Was das ist, erkläre ich gleich noch. Wobei eigentlich, die, die hier her gelangt sind, wissen es mit Sicherheit. Egal, eine kurze Erklärung kann ja nicht schaden.

Ich fühle mich deshalb genötigt, ein VPN aufzubauen, weil ich ein Linux in einer virtuellen Box laufen habe und mir nicht den Stress machen will, mit Brücken und was weiss ich zu arbeiten, nur um auf meine realen Rechner zugreifen zu können. Warum auch immer Android das einfach so kann, Linux, Windows und auch AROS finden keinen Weg zueinander.

Was ist ein VPN?

Eigentlich ist es ein Router, wie man ihn normalerweise ja auch für sein heimisches Netzwerk verwendet. Eine Stelle, über die sich Rechner miteinander verbinden können. Das heisst, die Rechner bekommen eine IP zugewiesen, über die sie sich miteinander verbinden können. Auch quer durch das Internet, hinter einen heimischen Router!

Als Beispiel, sagen wir man hat einen Desktop-PC zuhause und einen Laptop für unterwegs. Man sitzt irgendwo und denkt sich, eine Datei auf dem Desktop könnte man jetzt aber sowas von gut gebrauchen!

Wie war das noch? Der Desktop hat die IP 192.180.0.12. Also versucht man, diese IP zu erreichen und scheitert. Warum? Weil das die IP im eigenen Netzwerk ist und nicht im Internet. Dort hat das heimische Netzwerk vielleicht eine Adresse wie 80.76.21.12.

Gut, dann muss es ja mit dieser IP klappen, oder? Nö. Tut es nicht! Denn damit erreicht man quasi den heimischen Router und nicht den Desktop-PC. Man könnte den Router nun so konfigurieren, dass er Anfragen über einen bestimmten Port direkt an den Desktop schickt usw. Es geht aber eben auch mit einem VPN.

Hat man das korrekt eingerichtet, bekommt jeder Rechner eine eigene IP zugewiesen. Sagen wir der Desktop hat die Adresse 4.7.11.1 und der Laptop 4.7.11.2. Schon spielt es keine Rolle mehr, wo man ist. Ist das VPN aktiv, kann man IMMER mit diesen IPs den jeweiligen Rechner erreichen!

Das ist aber nur eine Fähigkeit von VPN, aber um die soll es hier jetzt gehen.

Warum Tinc?

Ich sehe es direkt vor mir, wie die Frage gestellt wird. Es gibt garantiert viele, die für ein VPN direkt an OpenVPN denken und genau das ist auch das Problem. OpenVPN ist quasi Mainstream!

Das macht es jedoch keines Wegs schlecht und ich will auch niemandem davon abraten, ganz sicher nicht! Ich habe sogar selbst ein VPN mit OpenVPN laufen und denke auch, ich werde auch dazu noch eine Hilfestellung wie diese hier schreiben. Aber derzeit ist es eben so, ich benutze Tinc. Das ist der ganze Grund!

Installation

Wie immer sage ich dazu nichts. Wieder aus dem einfachen Grund, es gibt so viele Distributionen von Linux, ich kann und will nicht jede einzelne davon berücksichtigen und denke auch, wer sich mit VPN befasst, der sollte auch von sich aus dazu in der Lage sein, Tinc zu installieren.

Der Server

Beitragsbild von Ludovic.ferre

Also quasi den ersten Rechner, auf dem man Tinc einrichtet. Soweit ich weiss kann Tinc auch ganz ohne einen Server auskommen, aber wie das gehen soll ist mir noch nicht ganz klar. Wenn ich es mal herausgefunden habe, werde ich dazu auch was schreiben. Solange benutze ich einen Server als Vermittlungsstelle für die Knoten.

In Tinc kann man netterweise Profile verwenden. Das tut man einfach, indem man in dem Ordner

/etc/tinc

ein neues Verzeichnis einfügt. Um dem Projekt hier Rechnung zu tragen nenne ich es einfach hinfrei.

So. Da kommt jetzt alles rein, was man zur Einrichtung so braucht. Angefangen mit der tinc.conf Datei.

Name = server
AddressFamily = ipv4
Device = /dev/net/tun

In der Tat, genau das reicht schon! Klar, damit bekommt man nur die rudimentärste Form zustande, aber das reicht mir im Moment absolut aus.

Dann kommt als nächstes die Datei tinc-up.

#!/bin/sh
ip link set $INTERFACE up
ip addr add  4.7.11.1/32 dev $INTERFACE
ip route add 4.7.11.0/24 dev $INTERFACE

Das kann man einfach so kopieren. Wichtig ist nur die “4.7.11.1/32”. Damit legt man fest, unter welcher IP der Server im VPN erreichbar sein wird. Für die Route nimmt man einfach die IP und lässt diese mit 0 enden. Bei der IP kann man natürlich auch gängigere Dinge nehmen, beispielsweise “192.168.1.1”, oder so. Das ist dem eigenen Geschmack überlassen. Für dieses Beispiel nehme ich eben 4.7.1.11.1.

Weiter zur Datei tinc-down.

#!/bin/sh
ip addr del 4.7.11.1/32 dev $INTERFACE
ip link set $INTERFACE down

Hier ist eigentlich auch nur wichtig, dass man die selbe IP verwendet, wie bei tinc-up.

Die beiden Dateien tinc-up und tinc-down müssen ausführbar sein. Deshalb noch schnell ein

sudo chmod 0755 tinc-*

und fertig. Da kriege ich jetzt bestimmt wieder Kritik, da man es doch nicht mit 0755 machen soll. Funktioniert aber!

Soweit wäre die Konfiguration dann abgeschlossen. Aber nützen tut sie nichts, denn man muss Tinc noch erklären, welche Geräte alle so in dem Netz herumhängen. Dafür wird erst das Verzeichnis hosts erstellt. Da kommen die ganzen Geräte dann rein.

Da rein kommt jetzt der Server selbst. Ja, den muss man da auch einbauen. Also einfach eine Datei mit dem bezeichnenden Namen server erstellen und das einfügen:

Address = xxx.xxx.xxx.xxx
Port = 655
Subnet = 4.7.11.1/32

Anstelle der xxx.xxx.xxx.xxx muss man natürlich die echte IP des Servers angeben.

Prima. Damit ist der Server soweit fertig konfiguriert. Aber, er soll ja auch noch verschlüsseln! Dafür brauchen wir auch Schlüssel! Einen öffentlichen und einen privaten. Die generiert man so:

sudo tincd -n hirnfrei -K4096

anstelle von hirnfrei muss man natürlich den Namen angeben, den man für das Profil verwendet hat.

Die Schlüssel werden erstellt und man wird gefragt, wo man sie gerne hätte. Das kann man bedenkenlos durchwinkeln, also einfach Enter drücken.

Damit ist die Konfiguration des Servers abgeschlossen.

Ein Knoten

Ja, EIN Knoten. Denn auf genau die Art, wie dieser Knoten eingerichtet wird, werden auch alles anderen eingerichtet!

Hier muss zunächst wieder in das Verzeichnis /etc/tinc/ das Verzeichnis hirnfrei angelegt werden. Man könnte da auch einen anderen Namen wählen, oder auf ein Profil verzichten, es macht aber durchaus Sinn, diese zu nutzen und die Profile gleich zu benennen.

Ist das erledigt, kommt wieder die Datei tinc.conf

Name = knoten1
AddressFamily = ipv4
Device = /dev/net/tun
ConnectTo = server

Wie beim Server. Jedoch ist hier eine neue Zeile: “ConnectTo = server”. Die besagt nichts anderes, als wohin der Knoten sich verbinden soll. Dabei bezieht sich der Name auf die entsprechende Datei in hosts/.

Natürlich geht es dann weiter mit tinc-up und tinc-down in dieser Reihenfolge!

#!/bin/sh
ip link set $INTERFACE up
ip addr add  4.7.11.2/32 dev $INTERFACE
ip route add 4.7.11.0/24 dev $INTERFACE
#!/bin/sh
ip addr del 4.7.11.2/32 dev $INTERFACE
ip link set $INTERFACE down

Da ist aber jetzt was anders! Die IP ist natürlich die IP, die der Knoten im VPN haben soll. 4.7.11.1 ist ja schon vom Server belegt, also bekommt der erste Knoten die Adresse 4.7.11.2. Der nächste Knoten würde die 4.7.11.3 bekommen usw.

Jetzt muss wieder das Verzeichnis /hosts erstellt werden und da muss nun die Datei knoten1 rein.

Subnet = 4.7.11.2/32

Kaum zu glauben, aber mehr braucht man da nicht! Die IP muss natürlich die Gleiche sein, wie auch in tinc-up!

Dann muss wieder ein Schlüsselpaar erstellt werden. Das ist genau das Gleiche wie beim Server!

sudo tincd -n hirnfrei -K4096

Damit wäre die Konfiguration von knoten1 abgeschlossen!

Bekannt machen

Würde man nun so versuchen, Tinc zu starten, würde man nicht weit kommen! Vielleicht startet Tinc sogar, aber da ist nichts mit einem VPN!

Das hat auch seinen Grund. Server und knoten sind zwar konfiguriert, die kennen sich aber noch nicht! Denn, auf allen Rechnern, die mit Tinc verbunden werden sollen, müssen ALLE dazugehörogen Knoten im Verzeichnis hosts/ vorhanden sein!

Warum das so ist, sieht man in meinen Augen dann am eindrucksvollsten, wenn man sich mal in hosts/ zum Beispiel die Datei server anschaut!

Address = xxx.xxx.xxx.xxx
Port = 655
Subnet = 4.7.11.1/32

-----BEGIN RSA PUBLIC KEY-----
.
.
.
-----END RSA PUBLIC KEY-----

Krass, oder? Als die Schlüssel generiert wurden, wurde der private Schlüsse ins Verzeichnis des Profils gespeichert und der Öffentliche direkt in die Datei des Servers! Aus diesem Grund müssen auch alle Rechner die gleichen Dateien in hosts/ haben, um die entsprechenden öffentlichen Schlüssel und IPs zu kennen! Logisch, oder?

Also. Die Dateien müssen nun kopiert werden. Nur wie?

Ich weiss jetzt nicht, ob das ein kluger Weg ist, oder ob man auf diese Weise Risiken eingeht. Echt, ich habe keine Ahnung. Aber, ich für meinen Teil habe einen Weg für mich gefunden, der super einfach ist!

Dazu sei gesagt, ich konfiguriere meine Rechner immer im heimischen Netzwerk mittels ssh. Hat was mit Bequemlichkeit zu tun. Sprich, ich habe in dem einen Terminal den einen Rechner, in dem anderen ein anderer Rechner. Öffne ich nun zum Beispiel mit Nano auf dem Server die Datei server, kann ich einfach den Inhalt markieren, kopieren und auf knoten1 einfügen.

Natürlich geht das auch über ssh, sshfs, ftp, mittels einem USB-Stick, man könnte es auch von Hand abtippen. Es gibt viele Wege, ich nutze den.

Ist nun die Datei server auf knoten1 und die Datei knoten1 auf dem Server, ist die Geschichte abgeschlossen!

Starten

Jetzt kann man einfach mal sein Glück versuchen und folgendes auf dem Server eintippen:

sudo systemctl start tinc@hirnfrei

ACHTUNG: Auf verschiedenen Distributionen scheint es da verschiedene Schreibweisen zu geben! So kann es auch durchaus sein, dass man folgendes eingeben muss:

sudo systemctl start tincd@hirnfrei

Also tincd und nicht tinc. Ich weiss jetzt aber nicht, wo es wie ist. Muss man ausprobieren!

Wenn keine Fehlermeldung kommt, kann man ja mal nachschauen:

ip addr

24: hirnfrei: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet 4.7.11.1/32 scope global hirnfrei
       valid_lft forever preferred_lft forever
    inet6 fe80::16f2:d108:a777:5736/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

Tada! Läuft. Jetzt auf knoten1 das selbe Spiel. Also einfach noch einmal von oben nach unten und dann sagt ip addr folgendes auf knoten1:

7: hirnfrei: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none 
    inet 4.7.11.2/32 scope global hirnfrei
       valid_lft forever preferred_lft forever
    inet6 fe80::ec5:c9c5:da94:1008/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

Jetzt kann man mal schauen, ob man den Server anpingen kann. Hat alles geklappt, sollte das ja kein Problem sein.

ping 4.7.11.1

PING 4.7.11.1 (4.7.11.1) 56(84) bytes of data.
64 Bytes von 4.7.11.1: icmp_seq=1 ttl=64 Zeit=36.9 ms
64 Bytes von 4.7.11.1: icmp_seq=2 ttl=64 Zeit=36.4 ms
64 Bytes von 4.7.11.1: icmp_seq=3 ttl=64 Zeit=36.6 ms
64 Bytes von 4.7.11.1: icmp_seq=4 ttl=64 Zeit=35.7 ms
64 Bytes von 4.7.11.1: icmp_seq=5 ttl=64 Zeit=36.1 ms
64 Bytes von 4.7.11.1: icmp_seq=6 ttl=64 Zeit=36.2 ms

Ich doch prima! Der Server lässt sich über die vorgegebene IP anpingen. Es hat also alles funktioniert!

Will man jetzt bei jedem Start das VPN automatisch mitstarten, muss man folgendes eingeben:

sudo systemctl enable tinc
sudo systemctl enable tinc@hirnfrei

Ja, man muss wirklich auch tinc auf diese Weise beim booten aktivieren! Nun sollte das VPN bei jedem Start automatisch mitgestartet werden und von nun an hat man auch, egal wo man ist, immer direkten und verschlüsselten Zugriff auf seine Rechner!

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert