Raspberry Pi im Crypto-Mesh (Teil 2 - tinc)

Im ersten Teil dieses zweiteiligen Artikels haben wir die Einsatzmöglichkeiten eines Raspberry Pi in einem verschlüsselten Mesh-Netz beleuchtet. Nun soll es um die praktische Umsetzung basierend auf dem tinc-Protokoll gehen.

Ein Mesh-VPN basierend auf tinc könnte folgendermaßen aussehen:

Diagramm eines tinc-Netzes

Die Einrichtung eines tinc-Netzwerks ist denkbar einfach. Das hier beschreibene Netzwerk soll dabei den Namen media-share tragen und zwischen den beiden Knoten A und B aufgebaut werden. Mindestens einer der beiden Knoten (hier: Knoten A) muss dabei öffentlich erreichbar sein. Für diese Erreichbarkeit benötigst du eventuell einen dynamischen DNS-Eintrag (DynDNS) und eine Port-Weiterleitung auf deinem Router.

 
Einrichtung auf Knoten A
  1. apt-get install tinc
  2. mkdir -p /etc/tinc/media-share/hosts; cd /etc/tinc/media-share
  3. echo -e "name = node_A\n mode=switch" >tinc.conf
  4. Schlüssel für den Knoten erzeugen: tincd -n media-share -K
  5. echo -e '#!/bin/sh\n ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0' >tinc-up
  6. chmod +x tinc-up
  7. echo "media-share" >>/etc/tinc/nets.boot
  8. /etc/init.d/tinc restart

Nun läuft auf Knoten A ein tinc-Dienst.

Einrichtung auf Knoten B
Dieselbe Prozedur wiederholst du nun mit Knoten B. Dabei musst du lediglich in Schritt (3) den Knotennamen und in Schritt (5) die IP anpassen (z.B. 10.0.0.2).

Verbindung beider Knoten
Nun muss Knoten A noch erfahren, wie Knoten B zu erreichen ist. Und außerdem müssen beide Knoten ihre Schlüssel austauschen, damit sie einander vertrauen könnnen. Dies ist schnell erledigt:

  1. Knoten A: echo "ConnectTo = node_b" >>/etc/tinc/media-share/tinc.conf
  2. Knoten B: echo "Address = NAME_KNOTEN_B" >>/etc/tinc/media-share/hosts/node_B

NAME_KNOTEN_B ist dabei der DynDNS-Name oder die öffentliche IP-Adresse, unter der Knoten B erreichbar ist.

Als finalen Schritt musst du nun nun das Verzeichnis /etc/tinc/media-share/hosts auf beiden Rechnern synchronisieren. Freunde von rsync könnten beispielsweise auf Knoten A folgendes tun:
  1. rsync /etc/tinc/media-share/hosts/ NAME_KNOTEN_B:/etc/tinc/media-share/hosts/
  2. rsync NAME_KNOTEN_B:/etc/tinc/media-share/hosts/ /etc/tinc/media-share/hosts/

Damit werden die beiden Verzeichnisse in beide Richtungen abgeglichen. Mit scp oder anderen Werkzeugen deiner Wahl lässt sich das natürlich auch erreichen. Nutzer von Versionsverwaltungen (Subversion, Git, ...) können diese ebenfalls gut für die Verteilung der Host-Dateien verwenden.

Erster Test
Nach einem Neustart des tinc-Dienstes auf Knoten A (damit er die ConnectTo-Einstellung anwendet) beginnen beide Knoten miteinander zu reden. Im einfachsten Fall kannst du dies mit ping 10.0.0.x (jeweils die IP der Gegenstelle) prüfen. Bei Problemen findest du Hinweise auf mögliche Ursachen in der Datei /var/log/daemon.log.

Erweiterung
Weitere Knoten lassen sich beliebig hinzufügen. Du musst bei diesen lediglich immer mindestens eine ConnectTo-Zeile in der Konfiguration angeben, damit jede Node weiß, mit wem sie sich verbinden kann. Mehrere ConnectTo-Ziele helfen bei der Stabilisierung eines Netzes in dem nicht alle Knoten rund um die Uhr erreichbar sind.

Visualisierung
Das obige Beispieldiagramm kann automatisch von tinc erzeugt werden. Füge einfach folgende Zeile in die Datei /etc/tinc/media-share/tinc.conf ein:

  • GraphDumpFile= | circo -Tpng >/var/run/tinc_media-share.png

Nun fehlt nur noch die Installation des nützlichen Graphviz-Werkzeugs:

  • apt-get install graphviz

Nach einem Neustart des tinc-Service findest du nun im Verzeichnis /var/run/ eine minütlich aktualisierte Übersicht des aktuellen Zustands deines tinc-Netzes.

Nun kannst du abends beruhigt mit der Gewissheit zu Bett gehen, dass weder deine Urlaubsfotos noch deine Termine im Netz ungeschützt an neugierigen Augen vorbeiziehen.