Diese Seite befindet sich noch im Entwurfsstadium.
Hilf mit sie zu verbessern!
(Erhoffte) Vorteile
- Metriken Anhand von Pings berechnen
- stabiler als Olsr
- kann ipv4 und ipv6 gleichzeitig
Was es leider nicht kann
- Anhand von Bandbreite/vorhandener Bandbreite die Metrik berechnen
Hier mal eben ein paar grundlegene Sachen für Babel.
Achtung
Das ganze ist komplett ungetestet und nur mal eben zusammen geschrieben, teils aus den Kopf, teils aus bestehenden Configs. Kann div. Fehler enthalten!
IP Adressen für Peering
Es sollte für jeden Server die selbe Adresse verwendet werden auf jedem Interface. Sinnvollerweise aus dem 10.83.252.X Netz: https://wiki.freifunk-franken.de/w/Portal:Netz#10.83.252.0.2F22_.28Master_IPs.29
GRE
Interface anlegen
Da Babel über ipv6-Multicasts kommuniziert, müssen den GRE-Tunnel noch link-local Adressen gegeben werden.
Siehe: http://wiki.hwmn.org/w/GRE_Tunnel#Babel_support
Die Schnittstellenkonfiguration sollte dann etwa so aussehen (ungetestet! Werte anpassen! Routingtables fehlen eventuell):
auto DEVICENAME iface DEVICENAME inet static address 10.83.252.X pre-up ip -4 tunnel add $IFACE mode gre local EIGENEPUBLICIP remote REMOTEPUBLICIP ttl 255 up ifconfig $IFACE multicast pointopoint 10.83.252.X post-up ip rule add iif $IFACE table fff post-up ip -6 addr flush dev $IFACE post-up ip -6 addr add fe80::IRGENDWAS dev $IFACE post-down ip rule del iif $IFACE table fff post-down iptunnel del $IFACE
macvtap
Ist das Interface in einer VM hinter einen macvtap muss auf den Host "allmulti" auf dem macvtap Interface angeschaltet werden (gilt nicht bei GRE in einer VM sondern nur wenn das physikalische Interface verwendet wird, also eth0 oder eth1.6 oder... in den meisten Standartfällen daher uninteressant):
/etc/libvirt/hook/qemu
#!/bin/bash if [ "$2" == "started" ]; then timestamp=$(date +"%Y-%m-%d %H:%M:%S") exists=$(ifconfig | grep macvtap0 | wc -l) if [ "$exists" -gt "0" ]; then ifconfig macvtap0 allmulti echo "$timestamp ALLMULTI set on macvtap0" >> /var/log/libvirt_hook_qemu.log fi fi
oder einfach
ifconfig macvtapX allmulti
jeweils auf dem Hostsystem
Babel Installation und Beispielkonfiguration
Babel kann direkt aus der Distribution installiert werden.
apt-get install babeld
/etc/babeld.conf
# For more information about this configuration file, refer to # babeld(8) #Defaultwerte für die Schnittstellen setzen: default wired true max-rtt-penalty 128 #Falls einzelne Schnittstellen abweichend konfiguriert werden müssen: #interface IF2 wired true max-rtt-penalty 128 #... einfach weiterführen für mehr Interfaces. export-table 10 import-table 10 # redistribute IPv4 default route into babel ## redistribute local ip 0.0.0.0/0 le 0 metric 128 # Babel refuses to redistribute routes with a protocol number of "boot"; # this is standard practice, and means that you cannot easily # redistribute the default route installed by dhcp. It is however # possible to redistribute such route by explicitly specifying "proto 3" # on the redistribute line. ## redistribute ip 0.0.0.0/0 le 0 proto 3 metric 128 # same but for IPv6 ## redistribute local ip ::/0 le 0 metric 128 redistribute metric 128 #grad nicht ganz sicher ob so richtig redistribute local ip 10.0.0.0/8 redistribute local deny local-port 33123 #local-port-readwrite 34567 #funktioniert anscheinend nicht!
/etc/default/babeld
... # List of interfaces on which the protocol should operate INTERFACES="" ...
WICHTIG: IF1 etc. müssen durch die Interfaces der GRE-Tunnel ersetzt werden! Pro GRE-Tunnel eine Zeile
Routen werden automatisch announced, es gibt hier kein HNA wie bei Olsr! Am WebUI ist alles gut zu sehen.
Die Interfaces, die babel verwenden soll (bei uns sind es meisten die GRE-Tunnel) müssen auch in der /etc/default/babeld eingetragen werden - durch Leerschläge getrennt.
Batman Interface muss auch leicht angepasst werden:
Änderung: "add"->"replace", +"proto static"
... post-up ip route replace 10.X.X.X/XX dev $IFACE proto static table fff ...
Wichtig ist proto static sonst announced Babel die Route nicht.
WICHTIG: Beide Änderungen müssen auch in den eventuellen
ip route add default blah
Zeilen bei den vpn-up Scripten gemacht werden!
WebUI für Babel
Für Babel gibt es ein WebUI. Quellen: https://github.com/kerneis/babelweb
Installation:
apt install nodejs-legacy npm npm install -g babelweb
/etc/systemd/system/babelweb.service:
[Unit] Description=babelweb [Service] ExecStart=/usr/local/bin/babelweb Type=simple [Install] WantedBy=multi-user.target
Der Dienst wird registriert und gestartet mit
systemctl enable babelweb systemctl start babelweb
Modifikationen (optional):
Die Dokumentation von Babelweb empfiehlt, das Programm nicht als "root" laufen zu lassen. Manche möchten die Webseiten lieber über einen anderen Port als 8080 erreichen, zum Beispiel über Port 80. Leider benötigt BabelWeb root Rechte, um auf Ports < 1024 zuzugreifen (ein Linux-Feature). Beispiel, hier für einen eingeschränkten Benutzer "normalo" und Port 7070:
[Unit] Description=babelweb [Service] ExecStart=/usr/local/bin/babelweb port=7070 User=normalo Type=simple [Install] WantedBy=multi-user.target
Die Webseite optisch umgestalten ist auch möglich, der Einstiegspunkt ist
vi /usr/local/lib/node_modules/babelweb/static/index.html
Nach Änderungen in der Datei "babelweb.service" muss diese neu eingelesen werden mit
systemctl daemon-reload systemctl restart babelweb
Probleme mit neuen Node*schrott
Mit der aktuellen Node Version startet das Babelweb leider nicht mehr. Es müssen diverse Dateien bearbeitet werden:
root@vm2-fff-gw-cd1:/home/christiand# babelweb /root/babelweb/node_modules/socket.io/lib/transports/websocket/hybi-07-12.js:449 Parser.prototype.__proto__ = EventEmitter.prototype; ^ TypeError: Cannot read property 'prototype' of undefined at Object.<anonymous> (/root/babelweb/node_modules/socket.io/lib/transports/websocket/hybi-07-12.js:449:42) at Module._compile (module.js:571:32) at Object.Module._extensions..js (module.js:580:10) at Module.load (module.js:488:32) at tryModuleLoad (module.js:447:12) at Function.Module._load (module.js:439:3) at Module.require (module.js:498:17) at require (internal/module.js:20:19) at Object.<anonymous> (/root/babelweb/node_modules/socket.io/lib/transports/websocket/index.js:7:6) at Module._compile (module.js:571:32)
man öffnet die Datei, die in der ersten Zeile angemeckert wird une ersetzt:
process.EventEmitter
durch
require('events')
meist sehen die Zeilen so aus:
var EventEmitter = process.EventEmitter
oder so
, EventEmitter = process.EventEmitter
ein oder 2x sieht es aber auch komplett anders aus. Betrifft am Ende etwa 10-12 Files ich hab nicht mitgezählt...