Virtuelles privates Netz (VPN)

Da wir (noch) nicht genug Teilnehmer haben um die einzelnen Inseln mit Funkstrecken miteinander verbinden zu können, werden wir einstweilen die Router über das Internet mit einem virtuellem privaten Netzwerk (VPN) verbinden. Dazu kommt die Software tinc zum Einsatz.

Adressbereich

Ich habe für die VPN-Verbindungen Adressen aus dem noch reservierten Adressbereich 10.50.192.0/24 verwendet. Die Adressen für WLAN-Router beginnen mit 10.50.192.64 und werden fortlaufend vergeben.

Konfiguration

Die Konfiguration soll in etwa folgendes bewerkstelligen: Die VPN-Server bilden eine Art virtuellen Switch. Jeder VPN-Server konfiguriert zwar auch eine IP-Adresse auf dem Interface, notwendig für die Funktion ist das aber nicht. Alle WLAN-Router, die eine Verbindung zum VPN haben, erhalten ein Interface, tinc0, das sich so verhält als wäre der Router mit anderen Routern über einen Switch verbunden. Der Routing-Daemon olsrd verwendet in diesem Fall zwei Schnittstellen, beispielsweise wl0 und tinc0.

/etc/tinc/freifunk/

Die gesamt Konfiguration für tinc liegt im Verzeichnis /etc/tinc/freifunk. Verzeichnisstruktur muss man selbst anlegen:

# mkdir -p /etc/tinc/freifunk/hosts

/etc/tinc/freifunk/tinc.conf

# Freifunk Franken tinc configuration file.

# The name of this tinc host. Required.
Name = susan

Mode = switch
Interface = tinc0

AddressFamily = any
#BindToAddress = verplant.org

# The internet host to connect with.
ConnectTo = vpn1
ConnectTo = vpn4

# The tap device tinc will use.
Device = /dev/net/tun

Anzupassen: Name, bei VPN-Servern eventuell BindToAddress einkommentieren und anpassen.

/etc/tinc/freifunk/tinc-up

#!/bin/sh

TINCADDR="10.50.192.64"
TINCBRDC="10.50.192.255"

# Set up the virtual tinc interface.
ip addr add $TINCADDR broadcast $TINCBRDC dev $INTERFACE
ip link set $INTERFACE up

Anzupassen: TINCADDR auf eigene IP-Adresse ändern.

Diese Datei muss ausführbar sein:

# chmod 0775 /etc/tinc/freifunk/tinc-up

/etc/tinc/freifunk/tinc-down

#!/bin/sh

# Take down the interface.
ip link set $INTERFACE down

Diese Datei muss ausführbar sein:

# chmod 0775 /etc/tinc/freifunk/tinc-down

/etc/tinc/freifunk/hosts/

In dem Verzeichnis /etc/tinc/freifunk/hosts müssen die öffentlichen RSA-Keys der VPN-Server liegen. Das Verzeichnis wurde im ersten schritt mit „mkdir -p” gleich mitangelegt. Jetzt müssen die öffentlichen RSA-Schlüssel der VPN-Server hierhin kopiert werden. Den Inhalt der Dateien findet man im Abschnitt Öffentliche RSA-Schlüssel / VPN-Server.

RSA-Schlüssel (/etc/tinc/freifunk/rsa_key.priv)

Um ein RSA-Schlüsselpaar für einen WLAN-Router zu erzeugen, muss zuerst die Konfigurationsdatei /etc/tinc/freifunk/tinc.conf angelegt und angepasst sein. Insbesondere die Konfigurationsoption Name muss stimmen! Dann kann ein Schlüsselpaar mit folgendem Kommando erzeugt werden:

tincd --net=freifunk --generate-keys

Der öffentliche Schlüssel befindet sich anschließend in der Datei /etc/tinc/freifunk/hosts/name. Diese Datei muss den Betreibern der VPN-Server zugänglich gemacht werden, zum Beispiel indem man den Inhalt auf diese Wiki-Seite kopiert, siehe Abschnitt Öffentliche RSA-Schlüssel / WLAN-Router. VPN-Server werden betrieben von: dreieinhalb, tokkee und octo. Der private Schlüssel befindet sich in der Datei /etc/tinc/freifunk/rsa_key.priv und muss geheim bleiben. Am besten, er verlässt den Router nie.

Zur Kontrolle

Wenn tinc auf einem WLAN-Router fertig konfiguriert ist und die RSA-Schlüssel erzeugt wurden, müssen die folgen Dateien existieren. Dabei steht die Datei susan stellvertretend für den eigenen Router-Namen.

# find /etc/tinc/freifunk/
/etc/tinc/freifunk/
/etc/tinc/freifunk/tinc.conf
/etc/tinc/freifunk/tinc-down
/etc/tinc/freifunk/tinc-up
/etc/tinc/freifunk/rsa_key.priv
/etc/tinc/freifunk/hosts
/etc/tinc/freifunk/hosts/huhu
/etc/tinc/freifunk/hosts/casella
/etc/tinc/freifunk/hosts/susan   <--- eigener Name

tinc starten

tinc kann jetzt mit diesem Befehl gestartet werden:

# tincd -n freifunk

Anschließend muss das tinc0 Interface existieren und eine IP-Adresse zugewiesen haben:

# ip addr list tinc0
24: tinc0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 500
    link/ether 56:99:55:18:cd:e1 brd ff:ff:ff:ff:ff:ff
    inet 10.50.192.64/32 brd 10.50.192.255 scope global tinc0

Interface bekanntmachen

Damit LuCI mit dem neuen Interface, tinc0, umgehen kann, muss man es noch in die Konfiguration eintragen. Das geht zwar bestimmt auch mit dem Web-Interface, m. E. ist es aber einfacher folgende Zeilen in die Datei /etc/config/network einzutragen:

config 'interface' 'vpn'
        option 'ifname' 'tinc0'

Anschließend kann das Interface zum Beispiel bei der OLSR-Konfiguration oder den Firewall-Regeln ausgewählt werden.

OLSRd konfigurieren

Um dem Routing-Daemon zu sagen, dass er seine Routen auch über das VPN-Interface bekanntgeben soll, werden folgende Optionen in die Datei /etc/config/olsrd eingetragen:

config 'Interface'
        option 'ignore' '0'
        option 'interface' 'vpn'
        option 'Ip4Broadcast' '10.50.192.255'

Öffentliche RSA-Schlüssel

Bei tinc müssen der oder die zentralen Server im Internet einen RSA-Schlüssel von jedem WLAN-Router haben, die Router brauchen die entsprechenden Schlüssel der zentralen Server. Hier soll eine Liste aller dieser öffentlichen Schlüssel entstehen. Unter Umständen wäre es sinnvoll, diese Dateien auch als Tarball anzubieten.

Die Schlüssel müssen als die Dateien /etc/tinc/freifunk/hosts/name im Dateisystem liegen. WLAN-Router, die an das VPN angeschlossen werden sollen, benötigen (nur) die RSA-Keys der VPN-Server, also zur Zeit huhu und casella.

Die VPN-Server benötigen hingegen die Schlüssel aller WLAN-Router, die direkt an das VPN angeschlossen werden sollen. Wie man Schlüssel erzeugt, steht unter RSA-Schlüssel (/etc/tinc/freifunk/rsa_key.priv).

VPN-Server

Wir haben vier VPN-Server:

Hostname Externe IP Interne IP Betrieben von
vpn1.fffranken.de 213.95.10.27 10.50.192.1 octo
vpn2.fffranken.de 91.190.183.225 10.50.192.2 tokkee
vpn3.fffranken.de (down) 81.89.107.196 10.50.192.3 dreieinhalb
vpn4.fffranken.de 84.23.73.200 10.50.192.4 patrik
Address = vpn1.fffranken.de
Subnet = 10.50.192.1/32
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAODIjlkNcH5Zq1j4Lg06FIyaUSpZGGG1PPLsrb6sZ8QsJmwo9W/DNXlS
VcW+6f1JGQpFXkoDmchibYTjicNdt1nILJcAXw3jkI5dNKrfOmhMkvVIEbRFAQ3o
p0yPjyNepKzoF9rG3pz8AZQob9o+gSAjiid7FjztfDGsXklfeCGZAgMBAAE=
-----END RSA PUBLIC KEY-----
Address = vpn2.fffranken.de
Port = 656
Subnet = 10.50.192.2/32
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAMkmu/MI097a9z4Ns2bQW+U8Y5IbQo/Dh204AE9LjlLJsdS9hJ3l9UTI
eCc4lV1LPHBeC7uRMwVYS8mXHUeWjzlD/51Saf/jqotvXQ/5wkCNx6+yOILf/YY2
qr1IyV8x7dRsjcmgCTAe/BP+xKhY8vVUtiex4Pgd9kqJnknim4RfAgMBAAE=
-----END RSA PUBLIC KEY-----
Address = vpn3.fffranken.de (down)
Port = 656
Subnet = 10.50.192.3/32
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKtElJJZMVshogkU01pl/NmsaD4CHi0XyJoQDCFtOk/B1XbI+RufTctn
9GK/GKPo5RDYzb8oYVheKfjnKz6SLX1wZkJjxwfwZm+VdIf8u2U/v1FozG/+B8Ai
CLyzlnBRl5s4dWF39QWDp2pZ09KlAi2+dqYKEUGcNABU9HP7I5nxAgMBAAE=
-----END RSA PUBLIC KEY-----
Address = vpn4.fffranken.de
Subnet = 10.50.192.4/32
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAPg9AHaJAEzKx0XBdo/kZVI4g/F97aWebcx46BsboWZrdge8C2aU9z+g
BHJGBTJgYfbW3y/44C/VVrKdg1bJIDWThGbCBPyVMoJxwLh+IUMN0S8ZV90tKmQ8
6JEqBnMnpz++Q9bZWhNF6j0bQP9j/9Kz0uPiA/MZDdv3snlWHtpHAgMBAAE=
-----END RSA PUBLIC KEY-----

WLAN-Router

# Name: jimbeam / 10.50.192.65
# User: Froggy
# Standort: Erlangen
Subnet = 10.50.192.65
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAN2qTL36iVxIg89OyTFeNsa7fKcdtrmfKqXgEDCxiPOadVXLIqxrkHtn
Pt6Cx8B3rvIg7qRshlncot/g/rGYFZY4yR/IS/kKj/WG/idTGBCMzZ3zOAoFjA3G
p885ONQwWNuG/dSEeYiWGzd4xolLsf7D7awk9/fGJ0ZtANzXpQ9RAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: muddywaters / 10.50.192.66
# User: delphin
# Standort: 
Subnet = 10.50.192.66
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALKCHLc69vWncBliEsrk3es4xg7mI/uvDh3MqrBrXz9hkRFBDuccNGKh
6wZNld6SjZHVHFT+Dvwh+0OVtlwjSPMVciwELMpSpTAI8hmQh9tBz2/U9ZutL+hH
VSLerYSyVmaVHlYkCsCaDBYqb19wmu6aWoEeNlzRF5moPuKryAAlAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: che / 10.50.192.67
# User: andrenarchy
# Standort: 
Subnet = 10.50.192.67
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAK1wAumG3JUQjtOcYpuVIlbRyEwv9e24ihy4g6gvCRBKeYWuHZz9F0AM
n6S4qaZ6IaGpEojtE7NqfDaWUYaj25j+RyiYeDybTRqjcdbTVAQxsoGVFqgIPL9r
BJIuhx/On4PNniTyLf5k7bEuA5z70dxme2rNHVCDGjPxsOYym/1pAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: jblenoir / 10.50.192.68
# User: delphin
# Standort: K4
Subnet = 10.50.192.68
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALpcl1g56wZe6YBaM7Rk7I3AobrTag7sun8JniVgLlalznVW/vKxY8q2
TRQ6KypTRio+YBHhF/aYXKALSKpa3zioo73P8uXbSbWO8lbja0GjQgpJrwwkWAMq
m9NVfJD2eFGdx+nMZRxE85ykpW+9iBclltHsna5IrkuxaCngvtuFAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: friesoythe / 10.50.192.69
# User: TheFroggy
# Standort: friesoythe ligusterstrasse
Subnet = 10.50.192.69
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
 noch nicht vorhanden=
-----END RSA PUBLIC KEY-----
# Name: decline / 10.50.192.70
# User: kltrg
# Standort: Tetzelgasse, Nürnberg
Subnet = 10.50.192.70
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAMpKVFe/KWvskQvQqcgdGz9HVjEuI+PrcDJEZE7gFj844Yc9hs7WRT16
WvohNhD0prB12WF4phWvpI770RuoZsX9rKu2vEKWRYxxPuRyHSEWxuhZ2IFGXQ3Y
/xmKPp6pw94ynYvj7kBXo/jyUUR0RP2oJ9UAST4Jf4magi014O9vAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: LaForge/ 10.50.192.71                                 
# User: patrik                                                      
# Standort: Rothenburg, Wolffstrasse
Subnet = 10.50.192.71
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA0HS8zBYc9zvAiePnTaVOFd9uOBO+iVaR8h2lsDsHQ1d2Ain/xG1L
Ghk+Ouv+VWESwMhKj4oD739al4IDVcgE05JAsD3qq1LItftuHJzBlFAJRbHxj9Eu
qcyjIS4rtBubojOgAk1uPNb4RuwcHCElL6Ofm13DixL5m8J/Fi5SYXcpCHPofDcq
tyRGA2mYu5a37vS2yg7yRHhDEELoZKCnpq+tsnzTGACAKrwhJOsqskyETq1jbp6a
SwlRJmxcDir2MnU0c0x8tPB7YMDhrBF7w0PE3P5spQA3cdZZILZrY1U3tt0vx86z
SYqQgCss0rgBJ0F+S0veyOCSIC5K+cBXtwIDAQAB
-----END RSA PUBLIC KEY-----
#Name: Spes / 10.50.192.72
#User: Spes
#Standort: Oberasbach
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALg5xTFG/IHJcA9A1iSMaSATcY5KXiVqduMszyMKrll/oXy93j1Il9QH
iDhdIHUMaO6jR0jQfB4v9eQh//fWHJDpZsMz59BuV1lAvqPaWRAeSE7/cfgPobx4
25T485OILFjkmOyhcScq7FIxQXxJFR0sjq0NBFF78iIKJn2Idx5tAgMBAAE=
-----END RSA PUBLIC KEY-----
#Name: casandro / 10.50.192.73
#User: Casandro
#Standort: Langenzenn
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAPBWjvvSfkfnT2QduQ/oIXunqTfBJDP2OW+gDJzm/xGxyv96xc4JnIf5
hiFIcAXjEMkqvB0t+txQwyeP95sip1eGGFBcq3ASseR9bGa8aAlM1BbfKgjGskV3
m1duGKx/n0/xzZC+2eLu04HPkvThoLQP257ITGFP+IGXJ6QbO4aBAgMBAAE=
-----END RSA PUBLIC KEY-----
#Name: kalkutta / 10.50.192.74
#User: wolf
#Standort: Moltkestr. nbg
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOAV7y3jfuCciPcbWGC9MpNhY19emTFi3hmu8vFZ7Hj1o3kKdKhzhCd1
xudMr/m6XUfLWteO4q2lVp0yXp0fLAQpFcqThS/NI3RtziSfmCsfBmoHYMJ/U+AY
F/7r57jbA2Y8Xa43AoeFF6t6Be9fm61hBUTxG+qL51XJbDoaTbEZAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: plaptop / 10.50.192.75
# User: Patrik
# Standort: mobil
Subnet = 10.50.192.75
TCPOnly = yes
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAN2qTL36iVxIg89OyTFeNsa7fKcdtrmfKqXgEDCxiPOadVXLIqxrkHtn
Pt6Cx8B3rvIg7qRshlncot/g/rGYFZY4yR/IS/kKj/WG/idTGBCMzZ3zOAoFjA3G
p885ONQwWNuG/dSEeYiWGzd4xolLsf7D7awk9/fGJ0ZtANzXpQ9RAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: Psion / 10.50.192.76
# User: Patrik
# Standort: Rechenzentrum
Address = vpn4.fffranken.de
Port = 655
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOhMD0JQVpMU6yFeAxAGf8e9xFRJBFsWyqLwRUybPkqRnp0+a+myolge
Lkt/4utiTTbceOnqjZlWAqyA81k60912AFzTh7P5w6zNFiiIQYPFJN1Rt5bxpYQI
R36ynrTkjMRbSqFREamEngTnLAjudrf3xn6PC9fzDp6LoriODL2RAgMBAAE=
-----END RSA PUBLIC KEY-----
# Name: ares / 10.50.192.77
# User: siffiejoe
# Standort: Sieglitzhofer Str., Erlangen
Subnet = 10.50.192.77
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAvRJfLotY0aRWGD586CxjHygf9Ww7CaF6S3YaJzx37aiUzXt0LGLk
Zx+av/CVButTStjb6fEJJQbDWpL5n5b0Z4cQdVwhV2L03g2W7NQEs49QDmXBp1P6
blk3idqvKAtinJ1+dYBNO581xoEL6wiCP8uxYIkI5IVO1itPfxPvLvhevQzMPYQr
gpny5ozCakIYx2O1ojl3vOIP+m3sEe9grbRD4O02X3DxorxkIrALAMTKMpTJ55Ol
iVm5C6olf67phTIuRE5w3wX+0/DDmXW1IAKujaRsIcS3ZjBBiFH807GUAu75KlqB
8595lVWxU3PDVClbbRiczAhhnSKi3WKJEQIDAQAB
-----END RSA PUBLIC KEY-----

Halbautomatische Konfiguration

Mithilfe eines kleinen Skripts kann die Konfiguration von tinc jetzt sehr einfach erfolgen:

# cd /tmp
# wget http://verplant.org/freifunk/tinc-config.tar.bz2
# cd /etc
# tar jxf /tmp/tinc-config.tar.bz2
# cd /etc/tinc
# ./configure

Die Schritte sind im Einzelnen:

  1. Herunterladen eines Tarballs mit der Basiskonfiguration von http://verplant.org/freifunk/tinc-config.tar.bz2
  2. Entpacken des Tarballs nach /etc/tinc
  3. Ausführen des Shell-Skripts, das die Basiskonfiguration anpasst. Das Skript macht folgendes:
    1. Abfragen von Hostname und IP-Adresse vom Benutzer. Default-Werte sind in eckigen Klammern angegeben.
    2. Anpassen der Konfigurationsdateien
    3. Gegebenenfalls RSA-Schlüsselpaar erzeugen. Falls dies geschieht, wird ausgegeben welche Information im Wiki veröffentlicht werden soll.
    4. (Neu) Starten des Daemons

Ein Beispielaufruf des Skripts sieht so aus:

root@susan:/etc/tinc# ./configure
######################################
# tinc Konfigurationsskript von octo #
######################################

Name [susan]:
IP-Adresse []: 10.50.192.64

Konfigurationsparameter:

  Hostname:   susan
  IP-Adresse: 10.50.192.64

Angaben korrekt [ja]:
Generiere freifunk/tinc.conf... fertig
Generiere freifunk/tinc-up... fertig
Anpassen der Berechtigungen... fertig
Die Datei /etc/tinc/freifunk/hosts/susan existiert nicht.
Generating 1024 bits keys:
..............++++++ p
.................++++++ q
Done.
Please enter a file to save private RSA key to [/etc/tinc/freifunk/rsa_key.priv]:
Please enter a file to save public RSA key to [/etc/tinc/freifunk/hosts/susan]:

Bitte veroeffentliche deinen oeffentlichen Schluessel im Wiki:
 http://freifunk-franken.de/vpn#wlan-router
-- 8< --
# Name = susan / 10.50.192.64
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBANbYzxjlhbFyGWlzdGGN+YmOc1fKKHlrgxFV1IiP9BeabOahPvy0JCHF
4BosdlsXQHkenQLpv+FwZqmFnqRGpeiaN6OtRCBRQnfMw5VRuzsGujiJsY2njoIB
GVQwoiAMZ/KlJrG1omC0Vektw9ae4jXqxe8cV/HlT03sirmYC0FjAgMBAAE=
-----END RSA PUBLIC KEY-----
-- >8 --

Beende tinc Prozess 6411... fertig
Starte tinc Prozess... fertig

Ich habe fertig! Viele Spaesse!
                           -octo

Automatischer Start von tinc beim Neustart des Routers

Ich hatte immer wieder das Problem, dass die Fonera mit tinc einen Neustart gemacht hat ohne das ich in angemessener Zeit die VPN Verbindung wieder herstellen konnten. Im Netz hab ich dafür folgende Lösung gefunden:

 vi /etc/rc.local
 tincd -n freifunk -> einfügen  -> ESC Taste -> :wq eingeben -> Enter Taste

und schon läuft tinc nach dem Neustart automatisch und muss nicht per Hand gestartet werden.

Init-Skript für tincd

Das Init-Script muss /etc/init.d/tinc heißen und ausführbar sein:

 root@sybil:~# ls -l /etc/init.d/tinc 
 -rwxr-xr-x    1 root     root          167 May 31 13:43 /etc/init.d/tinc

Der Inhalt schaut so aus:

 #!/bin/sh /etc/rc.common
 # Copyright (C) 2006 OpenWrt.org
 # Copyright (C) 2009,2010 Florian Forster
 
 START=60
 start() {
     /usr/sbin/tincd --net=forster-bb
 }
 
 stop() {
     /usr/sbin/tincd --net=forster-bb --kill
 }

Die Berechtigungen setzt man anschließend mit chmod:

 root@sybil:~# chmod 0755 /etc/init.d/tinc
vpn.txt · Zuletzt geändert: 28.04.2012, 11:26 von patrik  (Ältere Versionen)
Letzte Änderungen Letzte Änderungen