Freifunk-Gluon-VM in KVM/libvirt

Veröffentlicht am

Zielsetzung

Eine Virtuelle Maschine, in der Gluon läuft und die über virtuelle Netzwerkschnittstellen das Freifunk-Netz und das Mesh-Netzwerk zu Verfügung stellt.

Motivation

Die VM kann dann als VPN-Offloader für Freifunk-Access Points dienen, oder als Gateway für andere VMs um Dienste im Freifunk-Netz anzubieten. Und man kann Hostapd dran klemmen und Freifunk ohne extra Access Point anbieten. Oder Freifunk über WLAN-Accesspoints ohne Freifunk-Firmware anbieten. Oder was auch immer.

So geht’s – prinzipiell

Ich setzte voraus dass libvirt und Virt-Manager installiert sind.

Die Gluon-VM erhält drei virtuelle Netzwerkschnittstellen mit folgenden Funktionen:

  • Internetzugang
  • Freifunk-Client-Netzwerk: Für den direkten Zugang in’s Freifunk-Netz
  • Freifunk-Mesh-Netzwerk: Zum Anschluss von anderen Freifunk-Access Points, VM dient als Offloader

Alle drei Netzwerkschnittstellen werden der Einfachheit halber auf dem Server (der Rechner, auf dem die VM läuft) als Bridges ausgeführt:

  • br-internet
  • br-ff-client
  • br-ff-mesh

So geht’s – Schritt für Schritt

  1. Bridges auf dem Server anlegen
    /etc/network/interfaces:

    # Internet ###
    # Prämisse: Internetzugang erfolgt bislang über eth0
    # Achung: Alles was bisher über eth0 gemacht wurde (Firewall? Serverdienste?)
    # muss danach auf br0 umgestellt werden!
    auto br-internet
    iface br-internet inet dhcp
        bridge_stp on
        bridge_fd 3
        bridge_ports eth0
    auto eth0
    iface eth0 inet manual
    
    # Freifunk Clientnetzwerk ###
    auto br-ff-client
    iface br-ff-client inet static
        address 0.0.0.0
        bridge_ports none
        bridge_fd 0
        bridge_stp off
        bridge_waitport 0
        
    # Freifunk Meshnetzwerk ###
    auto br-ff-mesh
    iface br-ff-mesh inet static
        address 0.0.0.0
        bridge_ports none
        bridge_fd 0
        bridge_stp off
        bridge_waitport 0
  2. Anschließend am Besten den Server neu starten um zu prüfen, ob alle Dienste die Umstellung von eth0 auf br-internet verkraftet haben.
  3. Von deiner Freifunk-Community ein passendes Image runterladen und nach /var/lib/libvirt/images kopieren (Daumenregel: Dateiname enthält “x86” und “img”, z.B. “gluon-ffin-v2017.1.7-10+4-x86-64.img.gz”. Wenn das Image, wie hier, noch gepackt ist, gleich noch entpacken.
  4. Virt-Manager starten
    1. “Neue Virtuelle Maschine erstellen”
    2. “vorhandenes Festplatten-Abbild importieren” -> Gluon-Image auswählen
    3. Betriebssystemtyp: “Linux”, Version: “Wheezy (or later)”
    4. Speicher: 64 MByte, CPU: 1
    5. Name: Gluon-VM, “Konfiguration bearbeiten vor Installation”: Ja
    6. “Abschließen”
    7. Disk 1: Unter “Erweiterte Optionen” den Festplattenbus auf VirtIO sellen
    8. NIC: “Namen des gemeinsam verwendeten Geräts angeben”: br-internet
    9. “Installation beginnen”
  5. In der VM sollte nach wenigen Sekunden Gluon laufen und auf die Ersteinrichtung per Browser warten. Standardmäßig lauscht Gluon dazu auf der IP-Adresse 192.168.1.1. Da mein Heimnetzwerk aber im Bereich 192.168.3.xxx liegt ändere ich diese Adresse in der VM auf irgendwas in meinem Adressbereich ab: ifconfig br-setup 192.168.3.200
  6. Mit dem Browser auf 192.168.3.200 gehen und Gluon einrichten. Hier unbedingt Mesh-VPN einschalten, der Rest ist egal.
  7. Nach der Ersteinrichtung die VM ausschalten und im Virt-Manager zwei neue Netzwerkschnittstellen zur VM hinzufügen. Auf diese wird später das Freifunk-Clientnetz und das Mesh-Netzwerk gelegt.
    1. „Hardware hinzufügen“, „Network“, „Network Source“: br-ff-client
    2. „Hardware hinzufügen“, „Network“, „Network Source“: br-ff-mesh
  8. Die VM starten
  9. In der Gluon-VM das Mesh-Netzwerk über eth1 raus leiten:
    uci set network.client.ifname='bat0'
    uci set network.mesh_lan=interface
    uci set network.mesh_lan.ifname="eth1"
    uci set network.mesh_lan.mesh=bat0
    uci set network.mesh_lan.proto=batadv
    uci commit network
  10. …und das Freifunk-Client-Netzwerk über eth2 raus leiten:

    uci set network.client.ifname="bat0 eth2"
    uci commit network
  11. Die Gluon-VM neu starten.
  12. Prüfen, ob die Netzwerkschnittstellen in Gluon in Virt-Manager den richtigen Bridges zugeordnet sind. Dazu am Besten in der Gluon-VM mit brctl show nachsehen, welche Netzwerkschnittstelle welcher Bridge zugeordnet ist (z.B. eth2 zu br-client). Dann mit ifconfig schauen, welche MAC-Adresse die Netzwerkschnittstelle hat. In Virt-Manager kann dann die Netzwerkschnittstelle anhand der MAC-Adresse der passenden Bridge (z.B. eth0 -> br-internet, eth1 -> br-ff-mesh, eth2 -> br-ff-client) zuordnen.
  13. Nochmal die Gluon-VM neu starten, fertig.