Freifunk-Gateway aufsetzen/babeld: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
(interface-config)
(Richtlinien für Babel Penalty)
Zeile 181: Zeile 181:
* Die Option 'wired true' gibt es nicht mehr, dafür gibt es jetzt Interface-Typen. Am sinnvollsten für GRE-Tunnel ist wohl 'type tunnel'
* Die Option 'wired true' gibt es nicht mehr, dafür gibt es jetzt Interface-Typen. Am sinnvollsten für GRE-Tunnel ist wohl 'type tunnel'
* Die neueste Version von BabelWeb (0.4.0) ist nicht mit Babel 1.8.0 kompatibel. Daher muss BabelWeb aus dem [https://github.com/kerneis/babelweb develop Branch] installiert werden.
* Die neueste Version von BabelWeb (0.4.0) ist nicht mit Babel 1.8.0 kompatibel. Daher muss BabelWeb aus dem [https://github.com/kerneis/babelweb develop Branch] installiert werden.
== Richtlinien für Babel Penalty bei dezentralen Hoods ==
* Ethernet: 96
* Richtfunk
** >100Mbit: 256
** 30-100Mbit: 512
** 10-30Mbit: 1024
** bis 10Mbit: 4096
* VPN: 4096 - 16384
Man kann Links auch schlechter bewerten als oben angegeben, aber nicht besser.
Pro Link sollte aber nicht über 16384 verwendet werden, weil man sonst bei vielen Hops u.U. auf über 65535 kommen kann.


== WebUI für Babel ==
== WebUI für Babel ==

Version vom 19. März 2018, 20:57 Uhr

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


IP Adressen für Peering

IPv4

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

Dabei ist es am sinnvollsten, die Adresse als /32 an das Interface zu hängen und Babel die Routen übernehmen zu lassen. Hierbei ist es dann auch egal, aus welchem der beiden Prefixe die Adresse stammt (10.83.x.y bzw. 10.50.x.y). Außerdem ist es bei dieser Konfiguration ebenfalls nicht nötig, die Adresse des Partners als Pointopoint anzuhängen.

ACHTUNG: Es ist dann ebenfalls (erstmal) nicht möglich, den Partner direkt zu pingen, da bei dieser Konfiguration keine passende Route in der main-Tabelle existiert!

IPv6

Für IPv6 gilt in etwas das gleiche. Für das Routing ist eine Link Local Adresse nötig. Bei Ethernet und Layer2 Tunneln wird diese automatisch aus der Mac Adresse gebildet. Bei Layer3 Tunneln muss diese ggf. manuell generiert und als /64 an das Interface gehangen werden.

Damit ein Router sinnvoll auf ICMPv6 antworten kann, ist außerdem eine Adresse aus dem fc00::/7 oder eine öffentliche IPv6 nötig. Dafür kann beispielsweise eine IP aus diesem Netz verwendet werden.

Sollte das Netz nicht alleine für diese Verbindung existieren, bietet es sich auch hier an, die Adresse einfach als /128 an das Interface zu hängen.


GRE

Interface anlegen

Da Babel über IPv6-Multicasts kommuniziert, müssen den GRE-Tunnel noch link-local Adressen gegeben werden, da GRE-Tunnel auf Layer3 arbeiten und somit keine MAC-Adresse haben -> link-local kann nicht aus MAC automatisch generiert 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/32

  #IPv4 GRE
  #pre-up ip -4 tunnel add $IFACE mode gre local EIGENEPUBLICIP remote REMOTEPUBLICIP ttl 255
  #IPv6 GRE
  pre-up ip -6 tunnel add $IFACE mode ip6gre local EIGENEPUBLICIP remote REMOTEPUBLICIP ttl 255

  up ip link set dev $IFACE multicast on

  post-up ip rule add iif $IFACE table fff
  post-down ip rule del iif $IFACE table fff

  post-down ip tunnel del $IFACE

iface DEVICENAME inet6 static
  address fd43:5602:29bd:ffff::x/128

  post-up ip -6 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-up ip -6 rule del iif $IFACE table fff

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 rules
## Filter für lokalen Routen, die im Babel announced werden.
redistribute local ip 10.50.0.0/16
redistribute local ip 10.83.0.0/16
redistribute local ip fd43:5602:29bd::/48
redistribute local deny
redistribute ip 10.50.0.0/16
redistribute ip 10.83.0.0/16
redistribute ip fd43:5602:29bd::/48

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!


Änderungen in Babel 1.8.0

  • Die Option 'wired true' gibt es nicht mehr, dafür gibt es jetzt Interface-Typen. Am sinnvollsten für GRE-Tunnel ist wohl 'type tunnel'
  • Die neueste Version von BabelWeb (0.4.0) ist nicht mit Babel 1.8.0 kompatibel. Daher muss BabelWeb aus dem develop Branch installiert werden.


Richtlinien für Babel Penalty bei dezentralen Hoods

  • Ethernet: 96
  • Richtfunk
    • >100Mbit: 256
    • 30-100Mbit: 512
    • 10-30Mbit: 1024
    • bis 10Mbit: 4096
  • VPN: 4096 - 16384

Man kann Links auch schlechter bewerten als oben angegeben, aber nicht besser. Pro Link sollte aber nicht über 16384 verwendet werden, weil man sonst bei vielen Hops u.U. auf über 65535 kommen kann.

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

Remote Server einbinden

Es muss ein SSH forwarding zu dem remote Gerät eingerichtet werden, gut erklärt in der Babel Doku: https://github.com/kerneis/babelweb/blob/develop/README.md unter "Monitoring remote babel instances". Danach die Datei server.js anpassen z.b.

[...]
    "routers" : "[::1]:33123,[::1]:33124,[::1]:33125",
[...]

Achtung, keine Leerzeichen vor oder nach dem Komma benutzen!

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...

28.06.17: Heute nur eine Ersetzung in policyfile/lib/server.js:254 notwendig gewesen (user:rola)

https://github.com/LearnBoost/websocket.io/issues/55

Animation los werden

Ohne Animation lädt die Seite wesentlich schneller und auf schwachen Rechnern/Handys läuft die nicht gut. In

/usr/local/lib/node_modules/babelweb/static/index.html

folgende Zeilen auskommentieren:

  </head>
  <body>
      <h1>BabelWeb</h1>
<!--      
      <h2>Routers</h2>
      <div id="fig">
      <p class="legend">
      <span class="legend-title">Legend</span>
      <span class="legend-current">Current</span>
      <span class="legend-neighbour">Neighbours</span>
      <span class="legend-other">Others</span>
      </p>
      </div>
-->
    <h3>Configuration</h3>