ACHTUNG!! In Bearbeitung!!!


Datenquelle https://wiki.leipzig.freifunk.net/
und Emailverkehr der Infra-ffdo Gruppe
Anpassung von Marcel

APU mit Debian 10  
Laptop mit Mate 20  

#**Anleitung für die Installation und Konfiguration für die Verwendung in unserem "Labor- Betrieb"**  

## Installation von Tinc
   
sudo apt-get update  
sudo apt-get install tinc  

## Lan Verbindung herstellen

Per Netzwerkkabel miteinander verbinden ;)

## Feste IP Adresse Anlegen 

Um Fehler auszuschließen am besten statische IP-Adressen benutzen, die außerhalb des Bereiches vom lokalen DHCP-Servers (zB. F!Box) liegen.Default route dann manuell zum lokalen uplink gateway (zB zur F!Box) setzen.  
Konfiguration rebootfest machen (/etc/rc.conf bei BSD, /etc/network/interfaces bei Debian). Die im Folgenden als Beispiel verwendeten private-IP-Adressen natürlich durch die real konfigurierten ersetzen. Wenn man die Netzwerkkonfiguration der APU versemmelt und nicht mehr per ssh drankommt, gibt's ja zum Glück noch die serielle
Verbindung:-)

In meinem Fall habe ich mich entschieden für die Adressen:
 
Apu (Debian)  : 192.168.1.100  
Laptop        : 192.168.1.99  

## Verzeichnisstruktur anlegen 

sudo mkdir -p /etc/tinc/lan/hosts/  

Anmerkung: der Parameter -p bewirkt keinen Fehler, wenn /lan/ und/oder /hosts/ schon vorhanden sind; sonst werden die Verzeichnisse lan und hosts erzeugt.

## Konfigurationsdateien "lan" anlegen 

Nun müssen eine Reihe von Konfigurationsdateien und -scripten angelegt werden damit Tinc ordnungsgemäß
seinen Dienst verrichtet.

- /etc/tinc/lan/tinc.conf
- /etc/tinc/lan/rsa_key.priv (wird mit tincd erzeugt)
- /etc/tinc/lan/tinc-up
- /etc/tinc/lan/hosts/apu
- /etc/tinc/lan/hosts/laptop  
Dabei sind hosts/apu und hosts/laptop auf beiden Geräten identisch, die anderen gerätespezifisch.

## Tinc-Konfigurationsdatei 

vi /etc/tinc/lan/tinc.conf  
tinc Instanz aufsetzen (Beschreibung für tinc 1.0.x) Tipp! Für das Übertragen der Einstellungen am besten jeweils mit dem Befehl "cat" arbeiten.  
Für die tinc-Instanz mit dem Namen "lan" ungefähr Folgendes in die config Datei vi etc/tinc/lan/tinc.conf schreiben:

 Name = apu  
 Device = /dev/net/tun  
 Mode = switch  
 AddressFamily = ipv4  
 BindToAddress = 192.168.1.100  
 Port = 10001  
 MaxTimeout = 30  
 GraphDumpFile = /var/run/tinc.lan.dot  
 #LocalDiscovery = yes  
 ConnectTo = laptop  

Und auf dem Laptop ähnliche Daten, bis auf: "Name,BindToAddress und ConnectTo".

Name = laptop  
Device = /dev/net/tun  
Mode = switch  
AddressFamily = ipv4  
BindToAddress = 192.168.1.99  
Port = 10001  
MaxTimeout = 30  
GraphDumpFile = /var/run/tinc.lan.dot  
#LocalDiscovery = yes  
ConnectTo = apu  

## Auf beiden Geräten die Schlüsselpaare generieren:
Anmerkung: bei mir funktionierte der Befehl nur mit Angabe des Pfades.

tincd -n lan -K 4096 oder mit Pfad  
/usr/sbin/tincd -n lan -K 4096

## Die IP-Adressen eintragen  
Dann in den public key Dateien ..  
vi etc/tinc/lan/hosts/apu  
und  
vi etc/tinc/lan/hosts/laptop  
die IP-Adresse des hosts oben ergänzen:
hier zum Beispiel die Änderung für den Apu

Address = 192.168.1.100  
Port = 10001

-----BEGIN RSA PUBLIC KEY-----  
MIICCgKCAgEAwirLKOYuwraf+MneMpzWqKhv8qCcZCC7yFAN2y+OnT5lXzV/LgwQ  
[...]  

Nun die Datei .../tinc/lan/hosts/apu von der APU an die gleiche Stelle
auf dem Laptop kopieren.  
Und umgekehrt .../laptop auf die APU.  
  
##Zusatzinfos zu den einzelnen Parametern  

 # Festlegen, mit welchen anderen Tinc-Daemons sich bei Programmstart verbunden werden soll, die entsprechende Host-Konfigurations-Dateien in "hosts/" müssen vorhanden sein.  
 ConnectTo = apu  

 # Name des Tunnelinterfaces, der vergeben werden soll z.B. tun0
Das zu verwendende virtuelle Netzwerkgerät. tinc erkennt automatisch, um welche Art von Gerät es sich handelt.
Beachten Sie, dass Sie nur ein Gerät pro Dämon verwenden können.  
Device = /dev/net/tun   

 # Diese Option wirkt sich auf die Adressfamilie der abhörenden und ausgehenden Sockets aus. 
Wenn "any" ausgewählt ist, werden je nach Betriebssystem sowohl IPv4- als auch IPv6- oder nur IPv6-Listening-Sockets erstellt.  
 AddressFamily = ipv4  
 
 # Mit dieser Option wird festgelegt, wie Pakete an andere Daemons weitergeleitet werden   
switch = In diesem Modus werden die MAC-Adressen der Pakete im VPN verwendet, um wie bei
einem Ethernet-Switch dynamisch eine Routing-Tabelle zu erstellen  
 Mode = switch  

 # Wenn Ihr Computer mehr als eine IPv4- oder IPv6-Adresse hat, überwacht tinc standardmäßig alle auf eingehende Verbindungen. 
Es können mehrere BindToAddress- Variablen angegeben werden. In diesem Fall werden Abhörsockets für jede angegebene Adresse erstellt.  
BindToAddress =   

 # Wenn kein Port angegeben ist, wird der Socket an den durch die Option Port angegebenen Port oder an Port 655 gebunden, wenn keiner angegeben ist. Um nur Bindung an einen bestimmten Port aber nicht an eine bestimmte Adresse, * für die Adresse verwenden.  
Port = 10001    

 # Dies ist die maximale Verzögerung, bevor versucht wird, die Verbindung zu anderen Tinc-Daemons wiederherzustellen.  
MaxTimeout = 30  

 # Wenn diese Option vorhanden ist, speichert tinc das aktuelle Netzwerkdiagramm jede Minute in den Dateinamen der Datei, es sei denn, es wurden keine Änderungen am Diagramm vorgenommen. Die Datei hat ein Format, das von graphviz-Tools gelesen werden kann.  
Wenn der Dateiname mit einem Pipe-Symbol | beginnt, wird der Rest des Dateinamens als Shell-Befehl interpretiert, der ausgeführt wird. Das Diagramm wird dann an stdin gesendet.  
GraphDumpFile = /var/run/tinc.lan.dot  

 # Wenn diese Option aktiviert ist, versucht tinc, Peers zu erkennen, die sich im selben lokalen Netzwerk befinden. 
Dies ermöglicht eine direkte Kommunikation über LAN-Adressen, selbst wenn sich beide Peers hinter einem NAT befinden und sich nur mit einem dritten Knoten außerhalb des NAT verbinden, was normalerweise verhindern würde, dass die Peers die LAN-Adresse des anderen lernen.  
LocalDiscovery = yes  

 # Gibt an, zu welchem ​​anderen Tinc-Daemon beim Start eine Verbindung hergestellt werden soll. Es können mehrere ConnectTo-  Variablen angegeben werden. In diesem Fall werden ausgehende Verbindungen zu jedem angegebenen tinc-Daemon hergestellt.
Die Namen sollten diesem tinc-Daemon bekannt sein (dh es sollte eine Host-Konfigurationsdatei für den Namen in der 
ConnectTo- Zeile vorhanden sein). Wenn Sie mit ConnectTo keinen Host angeben, versucht tinc überhaupt nicht, eine Verbindung zu anderen Daemons herzustellen, sondern wartet stattdessen nur auf eingehende Verbindungen.  
ConnectTo = laptop  


## Testen von Tinc 

Anfangs am besten manuell mit debugging, ist unschädlich, wenn man's
mal gesehen hat. Und wenn (wie üblich:) was schief geht, hilft's:

tincd -n lan -D -d 3 &  

Stoppen zB mit "killall tincd". Wenn alles OK ist, verwendet man für den
Normalbetrieb das mit dem tinc package installierte script zum Starten
und Stoppen. Aber das hängt vom jeweiligen OS bzw. der Distribution ab.
Ebenso, wie man den daemon/service/Dienst (tincd) rebootfest macht.

## Tinc Konfigurieren
Dazu konfiguriert man auf beiden Geräten das in der 

vi etc/tinc/lan/tinc.conf  
angegebene Interface (tun) in ein gemeinsames IP-Netz, in meinem Fall
der IP Adressbereich 192.168.39.0/24.   
Die APU kriegt die BindToAddress = 192.168.39.1, der Laptop die BindToAddress = 192.168.39.2  .

##IP Adressenliste für unser Netz
[Die bislang vergebenen tinc-Namen und IP-Adressen](IP-Adressen)

##Testvorgehen
Dann versucht man, von einem Gerät auf die Adresse das anderen zu
pingen. Die Route für die Adresse des Gegenübers liegt auf dem tun
Interface (prüfen!), deshalb gehen die (ICMP ECHO_REQUEST-)Pakete an
den (für dieses Interface zuständigen) tincd. Der verschlüsselt die
Pakete und schickt sie (via kernel) übers LAN an die IP-Adresse (und
den Port) des anderen Geräts an den anderen tincd. Der entschlüsselt
wieder und übergibt das ursprüngliche Paket dem lokalen kernel.
Der antwortet mit einem (ICMP ECHO_RESPONSE-)Paket, und der Film läuft
genau wie gerade nochmal ab, nur in Gegenrichtung.

Wenn das funktioniert, kann man (endlich;-) Traffic zwischen APU und
Laptop verschlüsselt durch die F!Box schicken. Dafür muss man
natürlich die Adressen der tun Interfaces benutzen. Zum Überprüfen der
Konstruktion gleichzeitig ein tcpdump -X auf dem "äußeren" (dem LAN-)
Interface (eth0, igb0, o.dgl.) und auf dem "inneren" Interface (tun)
laufen lassen. Dann ein paar pings auf die "innere" Gegenstelle
(192.168.39.2 bzw. .1) machen und deren Spuren in den beiden tcpdumps
vergleichen. Auf dem LAN-Interface sollte der Klartext aus den
ursprünglichen ping-Paketen nicht mehr zu sehen sein.




AB HIER NICHT MEHR ÜBERPRÜFT 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 vi /etc/tinc/lan/tinc-up

 #!/bin/sh
 # This file is for tinc startup
 
 # -- Konfiguration Start --
 TINCPRT=655
 TINCADR=104.61.2.'''''12'''''       # <-- diese IP auch anpassen! (siehe "Teilnehmer")
 TINCBRC=104.61.2.255
 TINCPRE=24
 TINCDEV=$INTERFACE
 # -- Konfiguration Ende --
 
 # Netzparameter laden
 eval $(/usr/bin/netparam)
 
 # Tinc Interface konfigurieren
 ip addr add $TINCADR/$TINCPRE brd $TINCBRC dev $TINCDEV
 
 # Input auf den Tinc-Port aus dem WAN erlauben
 iptables -I INPUT -i $WANDEV -p udp --dport $TINCPRT -j ACCEPT
 iptables -I INPUT -i $WANDEV -p tcp --dport $TINCPRT -j ACCEPT
 
 # Input / Output auf dem Tinc-Interface
 iptables -I INPUT  -d $WIFIADR -i $TINCDEV -j ACCEPT
 iptables -I INPUT  -d $TINCADR/$TINCPRE -j ACCEPT
 iptables -I OUTPUT -s $WIFIADR -o $TINCDEV -j ACCEPT
 iptables -I OUTPUT -s $TINCADR/$TINCPRE -j ACCEPT
 
 # Weiterleitungen zwischen Wifi- und Tinc-Interface erlauben
 iptables -I FORWARD -i $WIFIDEV -o $TINCDEV -j ACCEPT
 iptables -I FORWARD -i $TINCDEV -o $WIFIDEV -j ACCEPT
 
 # Weiterleitungen zwischen LAN- und Tinc-Interface erlauben
 iptables -I FORWARD -i $LANDEV -o $TINCDEV -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
 iptables -I FORWARD -i $TINCDEV -o $LANDEV -m state --state RELATED,ESTABLISHED -j ACCEPT
 
 # LAN Richtung Tinc natten
 iptables -t nat -A POSTROUTING -o $TINCDEV -s $LANNET/$LANPRE -j MASQUERADE
 
 # Interface aktivieren
 ip link set dev $TINCDEV up

==== Shutdownscript "tinc-down" ====

 vi /etc/tinc/'''''12_7'''''/tinc-down

 #!/bin/sh
 # This file closes down the tunnel device und removes corresponding firewall rules.
 
 # -- Konfiguration Start --
 TINCPRT=655
 TINCADR=104.61.2.'''''12'''''       # <-- diese IP auch anpassen!
 TINCBRC=104.61.2.255
 TINCPRE=24
 TINCDEV=$INTERFACE
 # -- Konfiguration Ende --
 
 # Netzparameter laden
 eval $(/usr/bin/netparam)
 
 # Tinc Interface deaktivieren
 ip link set $TINCDEV down
 
 # Input auf den Tinc-Port aus dem WAN verbieten
 iptables -D INPUT -i $WANDEV -p udp --dport $TINCPRT -j ACCEPT
 iptables -D INPUT -i $WANDEV -p tcp --dport $TINCPRT -j ACCEPT
 
 # Input / Output auf dem Tinc-Interface verbieten
 iptables -D INPUT  -d $WIFIADR -i $TINCDEV -j ACCEPT
 iptables -D INPUT  -d $TINCADR/$TINCPRE -j ACCEPT
 iptables -D OUTPUT -s $WIFIADR -o $TINCDEV -j ACCEPT
 iptables -D OUTPUT -s $TINCADR/$TINCPRE -j ACCEPT
 
 # Weiterleitungen zwischen Wifi- und Tinc-Interface verbieten
 iptables -D FORWARD -i $WIFIDEV -o $TINCDEV -j ACCEPT
 iptables -D FORWARD -i $TINCDEV -o $WIFIDEV -j ACCEPT
 
 # Weiterleitungen zwischen LAN- und Tinc-Interface verbieten
 iptables -D FORWARD -i $LANDEV -o $TINCDEV -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
 iptables -D FORWARD -i $TINCDEV -o $LANDEV -m state --state RELATED,ESTABLISHED -j ACCEPT
 
 # LAN-Nat-Regel löschen
 iptables -t nat -D POSTROUTING -o $TINCDEV -s $LANNET/$LANPRE -j MASQUERADE
 
 # Interface dekonfigurieren
 ip addr del $TINCADR/$TINCPRE brd $TINCBRC dev $TINCDEV

==== Scripte ausführbar machen ====

Die up- und down-Scripte ausführbar machen:
 chmod +x /etc/tinc/'''''12_7'''''/tinc-up
 chmod +x /etc/tinc/'''''12_7'''''/tinc-down

==== OLSR-Konfiguration für das Tinc-Interface ====

 vi /etc/local.olsrd.conf-tinc0

 Interface "tinc0"
 {
        HelloInterval		15.0
        HelloValidityTime	180.0
        TcInterval		10.0
        TcValidityTime		270.0
        MidInterval		30.0
        MidValidityTime		180.0
        HnaInterval		30.0
        HnaValidityTime		180.0
        Ip4Broadcast		104.61.2.255
 
        LinkQualityMult default 0.2
 }

==== Hinweis für den Betrieb hinter einem NAT ====

Wenn der Rechner oder das Gerät, auf dem Tinc installiert ist hinter einer Firewall
hängt, muss zudem der TCP-Tunnelmodus aktiviert werden.

Dazu sollten die Zertifikate der anderen Nodes bearbeitet werden:
 vi /etc/tinc/'''''12_7'''''/hosts/*

Dort wird zusätzlich zu den Optionen für Adresse und Port folgende Zeile
vor dem Schlüssel eingefügt:
 TCPOnly = yes

=== Schlüssel erzeugen ===

 tincd -n '''''12_7''''' -K

Der generierte öffentliche Schlüssel sollte ungefähr so aussehen:
 cat /etc/tinc/'''''12_7'''''/hosts/'''''12_7'''''

 -----BEGIN RSA PUBLIC KEY-----
 MIGJAoGBAKHymf+vQFBJzKUswWgCqfz9y0vCAtsH68ejWYwo2HUxEW3OZoPpEAb4
 belX9d9xs4PCU22O6lUvIbmUl4UGXXFKiWxhbY15K0+rzrJfdw1mfwo5uveaCGwu
 gzQ0hFpactWfL3EufX/fBG4tRreYQH3hDA2nLqam6ee0Gp46ZWr5AgMBAAE=
 -----END RSA PUBLIC KEY-----

==== Die Schlüsseldateien austauschen ====

Beispiel für einen Schlüsselaustausch per ssh:

Zertifikate von anderem Node auf den eig. Node kopieren
 scp root@104.61.x.y:/etc/tinc/'''''x_y'''''/hosts/* tinc/'''''12_7'''''/hosts/ 

Eigenes Zertifikat auf anderen Node kopieren
 scp /etc/tinc/'''''12_7'''''/hosts/'''''12_7''''' root@104.61.x.y:/etc/tinc/'''''x_y'''''/hosts

*Hinweis: Keys müssen mit anderen Nodes ausgestauscht werden (mind. 2 - mit Angabe der Nodes unter /etc/tinc/x_y/tinc.conf und ConnectTo = a_b, sowie ablegen deren Schlüssel unter tinc/x_y/hosts/a_b), ansonsten kann Tinc keine Verbindung aufbauen - hierzu hilft euch ein wenig das [http://wiki.leipzig.freifunk.net/Projekt2 Projekt 2], dort könnt ihr euch die Schlüssel von den anderen Tinc-Nodes kopieren und auch eure erzeugten '''öffentlichen'''-Schlüssel (in der Node unter /etc/tinc/x_y/hosts/x_y zu finden x_y = wieder eure Node-IP) ablegen. Nun müsst ihr nur noch die Tinc-Nodeadmins um Aufname eurer im Wiki abgelegten Keys  bitten, am besten über E-Mail oder im [http://wiki.leipzig.freifunk.net/Jabber Jabber].

=== Tinc beim Booten automatisch starten ===

Damit Tinc beim Booten automatisch gestartet wird, muss nun
eine Datei mit dem Namen der verwendeten Konfiguration angelegt werden:
 vi /etc/tinc/nets.boot
Dort wird der Name der Konfiguration eingetragen:
 '''''12_7'''''

=== Konfiguration überprüfen ===

Nach dem Anlegen der Konfiguration sollte jetzt folgendes Verzeichnis-Layout existieren:
 /etc/tinc/
 /etc/tinc/nets.boot
 /etc/tinc/'''''12_7'''''/
 /etc/tinc/'''''12_7'''''/tinc.conf
 /etc/tinc/'''''12_7'''''/tinc-up
 /etc/tinc/'''''12_7'''''/tinc-down
 /etc/tinc/'''''12_7'''''/rsa_key.priv
 /etc/tinc/'''''12_7'''''/hosts/
 /etc/tinc/'''''12_7'''''/hosts/'''''12_7'''''
 /etc/tinc/'''''12_7'''''/hosts/...

=== Tinc-VPN starten ===

Nachdem die Konfiguration beendet wurde kann nun Tinc gestartet werden:
 /etc/init.d/S52tinc start

OLSR muss auch neu gestartet werden damit das neue Tinc-Interface aufgenommen wird:
 /etc/init.d/S53olsrd restart

In den Logdateien sollten sich nun Meldungen vom Tinc-Daemon finden:
 logread -f

=== Tinc-VPN-Installation sichern/wiederherstellen ===

In der Node unter [Verwalten] > [Backup] > Backup-Muster:
       /etc/tinc/*
       /etc/local.olsrd.conf*

ergänzen und auf "Jetzt sichern" drücken. 
*vor einem Firmewareupdate wieder/nochmal "Jetzt sichern" wählen (evtl. die Pfade für die Kabelkopplung oder andere Pakete/Verzeichnisse ergänzen) 
*Firmwareupdate durchführen, anschließend bei der IP-Vergabe den '''''Expertenmodus''''' wählen und dort das Häckchen bei '''''gesicherte Daten wiederherstellen''''' (evtl. noch LAN-/WAN-Einstellungen beibehalten) setzen und neustarten
*anschließend noch unter '''Software 2''' wieder das Paket freifunk-tinc-de installieren und Node mit dem einfachen Neustart starten
*nun sollten alle Tinc-VPN-Nachbarn wieder vorhanden sein (sofern ihr keinen Pfad beim Sichern vergessen habt - Beachtung liegt bei Kabelkopplungen und Firewallregeln für neue Interfaces wie z.B. bei WAN-LAN-Kopplungen, bei WAN-WAN könnt ihr das mit den Häcken drunter (Http / Https / Ssl / Ping) setzen)
