Freifunk mit FreeNAS, bhyve und Ubiquiti UniFi APs
Prolog
Ich bin ein großer Freund von Freifunk, möchte mir hier aber so wenig Plasterouter wie möglich hinstellen, da die Performance alles andere als gut ist (VPN auf 20€ Chinaroutern bringt's einfach nicht) und ich einige Ubiquiti Access Points und einen FreeBSD-Server in Betrieb habe. Mit bhyve gibt es seit kurzem eine libvirt ähnliche Virtualisierung unter FreeBSD und damit sind alle Grundvoraussetzungen gegeben. Das Endergebnis kann sich durchaus sehen lassen, je nach Tageszeit ist auch noch mehr drin:
An's Werk
Freifunk Bremen bietet kein vorkompiliertes x86-64
-Image an und in x86-generic
fehlt der VirtIO-Support (auf den bhyve baut), wir müssen uns also das Image selbst bauen. Ich habe mir wie empfohlen ein frisches Debian Wheezy geklickt, beim Kompilieren gab es überhaupt keine Probleme oder Stolperfallen. Der Einfachheit halber hier die benötigten Tools für eine neue Installation:
apt-get install git subversion python build-essential gawk unzip libncurses-dev libz-dev libssl-dev
Natürlich brauchen wir das freifunk-gluon
-Repo, die neueste Version ist v2016.2.1 und die läuft bei mir seit Monaten stabil.
git clone https://github.com/freifunk-gluon/gluon.git gluon -b v2016.2.1
Außerdem die Anpassungen für die Bremer Freifunk Firmware:
cd gluon
git clone https://github.com/FreifunkBremen/gluon-site-ffhb site -b v2016.2+bremen2
Damit können wir das Image für x86-64
bauen, welches die benötigten VirtIO-Treiber mitbringt:
make update
make GLUON_TARGET=x86-64
Das Image landet unter output/images/factory
(in meinem Fall gluon-ddorf-v1.2.X-exp-20161205-x86-64.img
) und muss von dort aus auf den FreeBSD-Rechner kopiert werden. Falls iohyve
noch nicht eingerichtet wurde, muss das nun nachgeholt werden.
Die VM erstellen wir folgendermaßen (im Beispiel ist der Name gluon
, 100MB reichen dicke aus, boot=1
sorgt dafür, dass die VM mit dem Host gestartet wird, die VM startet via grub
):
iohyve create gluon 100MB
iohyve set gluon loader=grub-bhyve
iohyve set gluon boot=1
Und jetzt ganz sneaky und hacky das im letzten Schritt erstellte .img
drüber bügeln (der Pfad muss an den Namen des ZFS-Pools angepasst werden, im Beispiel ist es zfs
):
dd if=./gluon-ffhb-2016.2+bremen1-x86-64.img of=/dev/zvol/zfs/iohyve/gluon/disk0
Sobald der Vorgang abgeschlossen ist, kann die VM gestartet werden:
iohyve start gluon
Wie bei Freifunk Routern üblich, müsst ihr euch jetzt eine Adresse aus dem 192.168.1.0/24er Netz zuweisen und die Ersteinrichtung vornehmen. Wichtig hier: Use internet connection (mesh VPN) anhaken, den Rest nach Gusto eintüten.
Weiter geht's dann nach Reboot auf der Console:
iohyve console gluon
Da die VM ja kein WLAN und nur ein Netzwerkinterface besitzt, müssen wir uns das client-Netz (Was später über das WLAN verteilt wird) über ein VLAN taggen. In meinem Fall ist das 42, uci ist das Tool, mit dem man alles konfigurieren kann, ohne an Konfigurationsdateien rumzufrickeln:
uci add_list network.client.ifname='bat0'
uci add_list network.client.ifname='eth0.42'
uci commit network`
Reboot tut gut.
reboot
Das war's im Prinzip auch schon. Das VLAN muss im Ubiquity Controller auf irgendein WLAN gemappt werden, bei mir sieht das folgendermaßen aus:
Wenn alles gut gegangen ist, gibt's ein bremen.freifunk.net
-Netz:
Und darüber keine Spur mehr vom eigentlichen Provider:
➜ ~ traceroute6 google.de
traceroute6 to google.de (2a00:1450:4014:800::2003) from 2a06:8782:ffbb:1337:5d:11e6:b32f:8f6d, 64 hops max, 12 byte packets
1 2a06:8782:ffbb:1337::6 67.643 ms 30.644 ms 30.950 ms
2 2a06:8782:ff00::1 46.117 ms 54.155 ms 46.469 ms
[...]
prg03s01-in-x03.1e100.net 79.128 ms
➜ ~ traceroute google.de
traceroute to google.de (216.58.201.67), 64 hops max, 52 byte packets
1 10.196.0.5 (10.196.0.5) 25.690 ms 24.100 ms 26.968 ms
2 10.255.255.254 (10.255.255.254) 35.607 ms 28.915 ms 29.541 ms
3 po-42.ce21.fra-10.de.leaseweb.net (46.165.246.254) 37.824 ms 28.503 ms 29.987 ms
[...]
12 prg03s01-in-f3.1e100.net (216.58.201.67) 42.999 ms 43.999 ms 44.363 ms