Freifunk Router als virtuelle Maschine
Ein Freifunk Router erledigt viele Dinge.
- Er spannt ein WLAN Netz für die Clients auf.
- Er spannt ein Mesh WLAN Netz auf um andere Freifunk Router anzubinden.
- Er schickt den Internet Traffic durch einen VPN Tunnel. Dies nennt man auch Uplink oder Offloading.
Anstelle eines Hardware-Routers kann es sinnvoll sein die Software auf einem Server zu betreiben. Neben der höheren Leistungsfähigkeit hat man hier auch bessere Kontrolle über die einzelnen Netzwerke. Für das letztens konzipierte UniFi Netzwerk sind die beiden Freifunk-Netze (Client und Mesh) als VLANs nötig weshalb sich hier eine VM gut eignet.
Einführung
Annahmen
- Server OS: CentOS
- Server IP:
192.168.0.2
- WAN Gateway (FritzBox) IP:
192.168.0.1
- Internes Netz: VLAN 1, Bridge
br-lan
- Freifunk-Client: VLAN 21, Bridge
br-client
- Freifunk-Mesh: VLAN 22, Bridge
br-mesh
Was ist eine Bridge?
Eine Bridge ist anschaulich dargestellt ein virtueller Switch. Über ihn werden (virtuelle) Interfaces verbunden, ähnlich dem Einstecken eines Netzwerkkabels. Zum Beispiel kann man eine Bridge nutzen um eine virtuelle Maschine im Netzwerk wie einen eigenständigen Server aussehen zu lassen.
Server Setup
Installation der Pakete
Für die Freifunk VM wird KVM als Virtualisierung genutzt. Hierfür stellen die meisten Freifunk-Communities Images bereit, ähnliche wie die Firmware für die Router. KVM ist zudem eine sehr performante und leichtgewichtige Lösung.
yum install bridge-utils qemu-kvm qemu-kvm-common
Netzwerk Setup
Wir benötigen 3 Bridges:
br-lan
für das interne Netzwerkbr-client
für das Freifunk Client Netzwerkbr-mesh
für das Freifunk Mesh Netzwerk
Die br-lan
Brücke bekommt außerdem die IP-Konfiguration des Servers.
Bei CentOS 7 wird die Konfiguration über Dateien in
/etc/sysconfig/network-scripts/
gemacht.
# /etc/sysconfig/network-scripts/ifcfg-br-lan
DEVICE="br-lan"
BOOTPROTO="static"
IPADDR="192.168.0.2"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
DNS1=192.168.0.1
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"
# /etc/sysconfig/network-scripts/ifcfg-br-client
DEVICE="br-client"
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"
# /etc/sysconfig/network-scripts/ifcfg-br-mesh
DEVICE="br-mesh"
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"
Nachdem die Bridges erstellt sind werden die entsprechenden Interfaces
angesteckt. Im Server steckt nur ein einziges Netzwerkkabel worüber der
Traffic aller drei Netze läuft (intern, Client, Mesh). Dies ist im Switch
so eingestellt. Innerhalb des Servers werden die VLANs auf eth0
nun
aufgeschlüsselt und an die jeweilige Bridge weitergeleitet. Unter Linux
ist das relativ einfach durch ethX.NN
Devices zu lösen wobei NN für
die VLAN ID steht.
Folgend die Konfig-Dateien für die Interfaces inklusive Zuweisung zu den Bridges.
# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
BRIDGE=br-lan
# No VLAN necessary
# /etc/sysconfig/network-scripts/ifcfg-eth0.21
DEVICE=eth0.21
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br-client
VLAN=yes
# /etc/sysconfig/network-scripts/ifcfg-eth0.22
DEVICE=eth0.22
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br-mesh
VLAN=yes
Nun kann die Konfiguration aktiviert und überprüft werden.
systemctl network restart
brctl show
# bridge name bridge id STP enabled interfaces
# br-client 8000... no eth0.21
# br-lan 8000... no eth0
# br-mesh 8000... no eth0.22
Freifunk VM
Das Hostsystem ist nun soweit vorbereitet und es kann die virtuelle Maschine für den Freifunk aufgesetzt werden.
Vorbereitungen
KVM bringt ein Script qemu-bride-helper
mit was den Umgang mit Bridges sehr
erleichtert. Die verwendeten Bridges müssen dafür in der Datei
/etc/qemu-kvm/bridge.conf
erlaubt werden:
allow br-lan
allow br-client
allow br-mesh
Als nächstes kann der Download der KVM-Firmware gestartet werden.
Folgend ist die URL durch die aktuelle Version deiner Community zu ersetzen!
mkdir /opt/freifunk
cd /opt/freifunk
wget https://site.freifunk-....de/firmware/stable/factory/gluon-ff...-x86-kvm.img.gz
gunzip gluon-ff...-x86-kvm.img.gz.img.gz
mv gluon-ff...-x86-kvm.img.gz.img gluon-ff-community.img
Aus Sicherheitsgründen wird die VM später als qemu
Benutzer gestartet weshalb
noch die Berechtigungen angepasst werden müssen:
chown -R qemu /opt/freifunk
VM Startscript
Die VM wird über systemd
gestartet. Das ist der Standard Init Dienst bei den
meisten Linux Distributionen. Dafür wird ein Unit-File erstellt unter/etc/systemd/system/freifunk.service
[Unit]
Description=Freifunk Offloader
After=network.target
[Service]
Type=simple
User=qemu
Group=qemu
ExecStart=/usr/bin/qemu-system-i386 \
-boot once=c,menu=off \
-enable-kvm -machine type=pc,accel=kvm \
-hda /opt/freifunk/gluon-ff-community.img \
-name freifunk \
-cpu host \
-netdev bridge,br=br-lan,id=net0 -device virtio-net-pci,netdev=net0 \
-netdev bridge,br=br-client,id=net1 -device virtio-net-pci,netdev=net1 \
-netdev bridge,br=br-mesh,id=net2 -device virtio-net-pci,netdev=net2
[Install]
WantedBy=multi-user.target
Aus den Startparametern von quemu
kann man unter anderem die Netzwerk-Zuweisungen lesen.
Zusätzlich kann man -vnc :1
anhängen, was einen VNC-Server auf Port 5901
startet.
Freifunk Setup
Das initiale Setup verläuft sehr ähnlich einer normalen Router Installation.
Alternativ kann an die Freifunk-VM ein virtueller Monitor angeschlossen werden
um auf das Terminal zuzugreifen. Dazu muss der Parameter -vnc :1
an das qemu
Startscript angehängt werden. Dann kann per VNC-Viewer über den Port 5901
zugegriffen werden. Die Einrichtung per Browser ist einfacher weshalb diese
Variante bevorzugt werden sollte.
Start der VM über systemctl start freifunk
Initial bekommt die Freifunk-VM die IP 192.168.1.1
über die das Setup
durchgeführt werden kann.
Es reicht die IP-Konfiguration eines PCs im internen Netz um eine Adresse aus
192.168.1.0/24
zu erweitern, zum Beispiel 192.168.1.10
. Damit kann
man über den Browser auf http://192.168.1.1 die initiale Konfiguration
durchführen.
Hierbei sind folgende Punkte wichtig:
Erweiterte Einstellungen => Remotezugriff
Passwort und/oder SSH-Key eintragenErweiterte Einstellungen => Netzwerk
Es empfiehlt sich eine statische IPv4 aus dem internen Netz zu vergeben.- Mesh wird später per Terminal konfiguriert, hier keine Haken setzen!
Wizard
Mesh-VPN aktivieren, die VM soll ein Offloader sein.- VPN-Key wie beschrieben bei deiner Community eintragen.
Anpassung der Netzwerk Konfiguration
Es müssen noch die Interfaces entsprechend ihrer Funktion zugewiesen werden,
was auch updatesicher sein muss. Innerhalb der VM ist standardmäßig eth0
das
Client-Netz und eth1
das WAN (also unser internes Netz). Wie man dem
Systemd-Unit-File von oben entnehmen kann also genau vertauscht, weshalb nun
hier die Netzwerkkabel umgesteckt werden. Man passt also
/etc/systemd/system/freifunk.service
entsprechend an und vertauscht br_lan
und br_client
:
ExecStart=/usr/bin/qemu-system-i386 \
-boot once=c,menu=off \
-enable-kvm -machine type=pc,accel=kvm \
-hda /opt/freifunk/gluon-ff-community.img \
-name freifunk \
-cpu host \
-netdev bridge,br=br-client,id=net0 -device virtio-net-pci,netdev=net0 \
-netdev bridge,br=br-lan,id=net1 -device virtio-net-pci,netdev=net1 \
-netdev bridge,br=br-mesh,id=net2 -device virtio-net-pci,netdev=net2 \
Nun wird die Freifunk-VM neu gestartet, damit die Änderungen übernommen werden:
systemctl daemon-reload
systemctl restart freifunk
Nun sollte man auch per SSH auf die VM kommen.
Mesh Setup
Zuletzt muss noch die Mesh Funktionalität bereit gestellt werden. Da der Auto-Update
Mechanismus sehr viele Einstellung überschreibt nutzen wir hier weder Mesh-on-LAN
noch
Mesh-on-WAN
sondern konfigurieren das Interface eth2
direkt für gluon_mesh
. Eine
Bridge brauchen wir an dieser Stelle nicht, da wir nur über ein Interface meshen.
Folgende Anpassungen werden über das Terminal auf der VM gemacht, entweder per SSH Login oder per VNC. Auf https://wiki.freifunk.net/Konsole werden die gebräuchlichsten Befehle erklärt.
Die neue Konfiguration von eth2
wird der /etc/config/network
hinzugefügt:
config interface 'mesh_eth2'
option transitive '1'
option fixed_mtu '1'
option proto 'gluon_mesh'
option ifname 'eth2'
option auto '1'
Damit die Konfiguration aktiv wird reboot
‘en wir die VM noch einmal.
Kontrolle
Per SSH kann man sich nun den Zustand anzeigen lassen. Der Aufbau des VPNs kann einige Zeit dauern, da der VPN Key erst an die Gateways übermittelt werden muss.
Es sollte jeweils eine Netzwerkbrücken für Client und WAN (internes Netz) existieren.
brctl show # bridge name bridge id STP enabled interfaces # br-client 7fff.525... no eth0 # bat0 # br-wan 7fff.da2... no eth1
br-wan
sollte eine IP-Adresse aus dem internen Netz haben.ifconfig br-wan # br-wan Link encap:Ethernet # inet addr:192.168.0.3
Mesh für LAN und WAN sollte deaktiviert sein.
uci show | grep mesh | grep auto # network.mesh_wan.auto='0' # network.mesh_lan.auto='0' # network.mesh_eth2.auto='1' batctl if # mesh-vpn: active # eth2: active # primary0: active
Nach einiger Zeit sollten Verbindungen zu den Gateways und Routern (Nachbarn) hergestellt werden.
batctl o # [B.A.T.M.A.N. adv 2013.4.0, MainIF/MAC: primary0/xx:xx:xx:xx:xx:xx (bat0)] # Originator last-seen (#/255) Nexthop [outgoingIF]: Potential nexthops ... # xx:xx:xx:xx:xx:xx 5.750s (217) xx:xx:xx:xx:xx:xx [ mesh-vpn]: xx:xx:xx:xx:xx:xx (217) # xx:xx:xx:xx:xx:xx 0.740s (218) xx:xx:xx:xx:xx:xx [ mesh-vpn]: xx:xx:xx:xx:xx:xx (218) # xx:xx:xx:xx:xx:xx 4.320s (218) xx:xx:xx:xx:xx:xx [ eth2]: xx:xx:xx:xx:xx:xx (218) # xx:xx:xx:xx:xx:xx 2.410s (218) xx:xx:xx:xx:xx:xx [ eth2]: xx:xx:xx:xx:xx:xx (218)
Abschließend möchte ich noch ein großes Dankeschön an neoraider
aus der Freifunk Community für seine Hilfe aussprechen.