back 2017-02-15 2017-05-10 LinuxFreifunkNetworkKVM
  1. Freifunk Router als virtuelle Maschine
    1. Einführung
      1. Annahmen
      2. Was ist eine Bridge?
    2. Server Setup
      1. Installation der Pakete
      2. Netzwerk Setup
    3. Freifunk VM
      1. Vorbereitungen
      2. VM Startscript
      3. Freifunk Setup
      4. Anpassung der Netzwerk Konfiguration
      5. Mesh Setup
      6. Kontrolle

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 Netzwerk
  • br-client für das Freifunk Client Netzwerk
  • br-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 eintragen
  • Erweiterte 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.


Interesting posts

Integration von eines Freifunk-Gast-Netzes in ein Unifi WLAN Setup
Nginx reverse proxy setup to host multiple applications using Docker
Installation and configuration of PsiTransfer