Contents
DIESES HOWTO WAR NUR FÜR EINEN TESTBETRIEB UND FUNKTIONIERT NICHT MEHR
Grundlegendes
Wozu ein Tunnel?
Primär, um anders nicht erreichbare Teile des Netzes, über das Internet anzubinden, z.B. funkmäßig nicht erreichbare Inseln. Aber auch, um redundante Verbindungen zu schaffen.
Was wird eingesetzt?
Tinc (http://www.tinc-vpn.org/) ist die Implementierung der Wahl. Es kann alles, was man brauchen kann, ist leidlich einfach aufgesetzt und es existieren Implementierungen für alle relevanten Betriebssysteme. Als Routing-Deamon wird olsrd (http://www.olsr.org/) eingesetzt. Das hat mit Tinc nur insoweit etwas zu tun, als dass wir "tap" Interfaces verwenden (müssen), damit der olsrd (http://www.olsr.org/) drüber broadcasten kann.
Wie funktioniert das?
Tinc baut im Gegensatz zu OpenVPN keine Tunnelverbindungen im herkömlichen Sinn auf. Es bildet eine VPN Wolke innerhalb dessen der gesamte Traffic verläuft. Wird ein Paket von einem VPN Knoten zum anderen geschickt, geschieht das sofern möglich immer direkt und nicht über den Tunnel-Konzentrator. Das entlastet unseren Tunnelendpunkt und somit unseren Uplink. Ein weiterer Vorteil von tinc ist das jeder Knoten sich zu einem beliebigen Knoten in der VPN Wolke verbinden kann und somit dem VPN beitritt. Man kann sich auch zu mehr als nur einem Knoten verbinden wodurch bei Ausfall eines Knotens nicht alle anderen Knoten voneinander getrennt sind. (Letzteres macht noch ein wenig Probleme und muss noch genauer untersucht werden)
Was ist zu beachten?
Ist der Tunnel einmal aufgebaut und OLSR aktiviert am Tunnel Interface routet OLSR nach einigen Sekunden den gesamten Traffic über den Tunnelserver. Inklusive der Tinc Packete - das ist fatal da der Tunnel somit abreissen muss. Bei der früheren Tunnellösung OpenVPN reichte es eine Hostroute zum Tunnelendpunkt einzutragen um dies zu beheben. Leider funktioniert das mit Tinc nicht so gut weil ja alle Daten direkt geschickt werden. Man müsste also eine Hostroute für jeden Knoten eintragen der in der VPN Wolke ist. Dies wäre zwar möglich da Tinc bei jedem hinzukommenden oder wegfallenden Knoten einen Script aufruft allerdings steckt in der neuen Freifunk Firmware eine viel schönere Lösung des Problems: Policy Routing. Diese Option muss im Webinterface aktiviert sein. Allerdings fehlt für unser Netz noch eine Kleinigkeit ohne der unsere offiziellen IP's nicht funktionieren. Hier ein Initscript der das behebt:
vi /etc/init.d/S55fixpolicy
Folgendes reinkopieren:
#!/bin/sh ip rule add from 10.0.0.0/8 lookup olsr ip rule add to 10.0.0.0/8 lookup olsr ip rule add from 193.33.150.0/23 lookup olsr ip rule add to 193.33.150.0/23 lookup olsr
und ausführbar machen:
chmod +x /etc/init.d/S55fixpolicy
Wenn der Linksys auf dem Tinc laufen soll hinter NAT/Firewall läuft muss ein Portforwarding eingerichtet werden. Falls man sich nur zu dem Netz verbinden will und keine Initialverbindungen zulassen will (macht nur bei einem Internetzugang mit statischer IP Sinn) reicht es den Port '655' für' UDP zu öffnen. Ansonsten muss auch noch Port '655' TCP geöffnet werden.
Sonstiges
Der Tunnel ist ein unverschlüsselter IP-Tunnel, d.h. man kann darüber alles mitsniffen. Das liegt daran, dass auf einem typischen Linksys/Buffalo Router nicht genug Rechenpower für einen verschlüsselten Tunnel zur Verfügung steht (wenn man auf nennenswerte Bandbreite nicht verzichten will) und ein verschlüsselter Tunnel ein falsches Gefühl der Sicherheit erzeugen könnte: Der Tunnel terminiert am anderen Tunnelendpunkt und nicht erst am Zielserver, zu dem man eigentlich will. D.h. man muß sowieso zusätzlich sichere/verschlüsselte Protokolle verwenden oder einen sicheren IP-Tunnel vom eigenen Desktop bis zum Zielserver legen. Für beides bringt ein weiterer "teilweiser" Tunnel drunter nur mehr Latenz (jedes Paket will einmal zusätzlich verschlüsselt und entschlüsselt werden) und verbraucht CPU-Leistung, aber ansonsten (insbesondere Security-mäßig) gar nichts
Installation
Zunächst muss Tinc installiert werden:
ipkg install tinc ipkg install kmod-tun
Konfiguration
Das Verzeichnis /etc/tinc und darin eine Konfigurationsdatei anlegen.
mkdir -p /etc/tinc/ff cd /etc/tinc/ff vi tinc.conf
Hier eine Beispielkonfiguration:
Name = <name> Device = /dev/net/tun Interface = tap1 Mode = switch ConnectTo = mkl ConnectTo = algo
<name> Muss dabei durch einen frei wählbaren Namen ersetzt werden. Am besten man nimmt dafür den Namen des Standortes um im Fehlerfall leichter debuggen zu können. Ausserdem benötigt man noch einen Script der von tinc aufgerufen wird um das Interface zu konfigurieren:
vi tinc-up
Hier ein Beispiel dafür:
#!/bin/sh ip addr add 10.12.11.<n>/24 broadcast 10.12.11.255 dev $INTERFACE ip link set $INTERFACE up
Anstatt <n> die von uns zugewiesene IP Adresse eintragen. Danach muss der Script ausführbar markiert werden und im Unterverzeichnis 'hosts' eine Konfigurationsdatei für den eigenen Knoten und jeden Knoten mit dem eine initiale Verbindung aufgebaut werden soll angelegt werden:
chmod +x tinc-up mkdir hosts touch hosts/<name> touch hosts/mkl touch hosts/algo vi hosts/mkl
In die Konfigurationsdatei für das mkl bitte folgendes eintragen:
Address = tinc-mkl.ffgraz.net Cipher = none Compression = 0 Digest = none Subnet = 10.12.11.1 -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAN9ipCC0BSb0f3O0TRxk+64MDSllgcIlkam1/Qf1p4VLGy/pEXyiEMoL fp9r9z9+wF7cWwXRC8Qvr7M/eEKIbpwFja9tMwgD1S9jbkMYTGp3pYge1t2F9B19 3pwhNuiyarCo4hm0e4quF348ym5TX/4qvmtULiTkK3RskwPvKempAgMBAAE= -----END RSA PUBLIC KEY-----
In die Konfigurationsdatei für algo bitte folgendes eintragen:
Address = tinc-algo.ffgraz.net Cipher = none Compression = 0 Digest = none Subnet = 10.12.11.4 -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOzUgS5BR/HLaidPRoab4VFcBEys3zonGwxTP1j1TAdlvbMdZ5sXp9fr TxYUBZFm7njraH7VsqZnvabpIXJgn7A1KLAji2keTrYWGvGnGsLYVMPRRbuKSKSV e02CEY60afL5mJVGUCpgCb4yuuuvRbj8uPNS3l3bnpo6ga4nwkJpAgMBAAE= -----END RSA PUBLIC KEY-----
und in die eigene Konfigurationsdatei:
Cipher = none Compression = 0 Digest = none Subnet = 10.12.11.<n>
Wobei <n> wieder durch die von uns zugewiesene IP Addresse ersetzt werden muss. Danach muss noch ein Schlüssel generiert werden. Das muss auch passieren wenn so wie bei uns keine Verschlüsselung und keine Authentifizierung stattfindet.
tincd -n ff -K
Die beiden fragen einfach mit Ja beantworten und fertig ist die Konfiguration. Danach müssen alle Knotenpunkte mit denen direkt eine initiale Verbindung aufgebaut wird die fertige Datei 'hosts/<name>' erhalten. Wenn diese Datei dort installiert wurde kann man Tinc schon mal ausprobieren. Dieser sollte sich nun mit folgendem Kommando starten lassen:
tincd -n ff
Das muss natürlich nach jedem Reboot neu gemacht werden. Am besten erledigt man das mit einem init.d Script.
vi /etc/init.d/S47tinc
Anmerkung: Falls man mit copy&paste im vi probleme hat, funktioniert auch der Befehl cat > /etc/init.d/S47tinc. Abschließen tut man mit Ctrl-d Ctrl-c.
Und dann das hineinkopieren
#!/bin/sh case $1 in start) tincd -n ff ;; stop) killall tincd ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 start|stop|restart" ;; esac
und ausführbar machen:
chmod +x /etc/init.d/S47tinc
Danach fehlt nur noch dem OLSR beizubringen auch auf dem Tunnel Interface zu arbeiten und fertig!
rm /etc/local.olsrd.conf cp /rom/etc/local.olsrd.conf /etc/ vi /etc/local.olsrd.conf
und folgendes hineinkopieren:
Interface "tap1" { HelloInterval 6.0 HelloValidityTime 108.0 TcInterval 4.0 TcValidityTime 324.0 MidInterval 18.0 MidValidityTime 324.0 HnaInterval 18.0 HnaValidityTime 108.0 LinkQualityMult default 0.6 }
nach einen Reboot sollte der Tunnel aufgebaut werden.