FunkFeuer Graz
FunkInselTinc

{i} 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.

last edited 2020-02-12 19:01:14 by ClemensPietsch