/ unifi

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:
Speedtest
Freifunkknoten

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

gluon console

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:

UniFi Config

Wenn alles gut gegangen ist, gibt's ein bremen.freifunk.net-Netz:

alt

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