B.A.T.M.A.N.: Unterschied zwischen den Versionen

Aus Freifunk-Rheinbach Wiki
Zur Navigation springen Zur Suche springen
K (→‎Starten und Aktivieren: DHCPC ergänzt)
 
(46 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
B.A.T.M.A.N. (Abkürzung für Better Approach To Mobile Adhoc Networking) ist ein Routingprotokoll für mobile Ad-hoc-Netze. Siehe [https://de.wikipedia.org/wiki/B.A.T.M.A.N. WikiPedia]. heri wird beschrieben, wie B.A.T.M.A.N. auf einen Debian System eingerichtet wird.  
B.A.T.M.A.N. (Abkürzung für '''B'''etter '''A'''pproach '''T'''o '''M'''obile '''A'''dhoc '''N'''etworking) ist ein Routing-Protokoll für mobile Ad-hoc-Netze. Siehe [https://de.wikipedia.org/wiki/B.A.T.M.A.N. WikiPedia]. Im Freifunk wird unter anderem B.A.T.M.A.N. als Routing-Protokoll eingesetzt.


Die Verbindung zu den Servern im Internet erfolgt über einen Tunnel. Bei Freifunk Rheinbach wird der Tunnel mittels [[fastd]] aufgebaut. Router, die in WLAN Reichweite zueinander stehen, ein MESH-Netzwerk. Darüber hinaus können sich die Router auch über Kabel vermaschen. Auf diesen Verbindungen wird das Routingprotokoll B.A.T.M.A.N.verwendet.
== Abstrakt ==


Hier wird beschrieben, wie ein Rechner unter Debian direkt (ohne einen Router) mit den Servern im Internet verbunden wird.
In diesem Artikel wird beschrieben, wie B.A.T.M.A.N. zusammen mit [[fastd]] auf einem Rechner mit Debian eingerichtet wird und der Rechner direkt an das Netz des Freifunk Rheinland, Domäne Wupper, angebunden wird. Als Beispiel dient die Konfiguration der Freifunk Rheinbach Community.  


== Installation ==
Mit Stand Mai 2018 wird auch alfred installiert, aber nicht konfiguriert.


=== B.A.T.M.A.N. installieren ===
Die Verbindung der [[Node | Nodes]] (Router) zu den Servern im Internet erfolgt über einen verschlüsselten Tunnel. Bei Freifunk Rheinbach wird für die Tunnel ''fastd'' verwendet. Nodes, die in WLAN Reichweite zueinander stehen, verbinden sich untereinander über ein MESH-Netzwerk. Auch über Kabel (LAN oder WAN-Port) können sich Nodes vermaschen. Auf all diesen Verbindungen wird das Routing-Protokoll B.A.T.M.A.N. verwendet.


Die folgenden Befehle und Scripte wurden unter '''Debian 8.7.1''' entwickelt und getestet.
== Hinweise ==


Das folgende Script installiert auf einem Debian 8 die notwendige Software - einschließlich fastd. Je nach System kann es notwendig sein zusätzliche Pakete zu installieren. Das folgende Script wurde auf einem frischen Debian 8.7.1 getestet, auf dem nur ein Chipkartenleser unter Moneyplex vorher zum Laufen gebracht wurde.
Ich verwende als Shell die [[bash]]. Standard ist bei Debian 8.7.1 [[dash]]. Die Befehle in den Scripten sind so einfach, dass sie in beiden Shells funktionieren sollten.
 
Dieser Beitrag basiert auf zahlreichen Quellen und den Erfahrungen aus den Tests. Soweit möglich versuche ich ältere Befehle durch neuere, moderne Befehle zu ersetzen.
 
Der Beitrag  [https://www.freifunk-gera-greiz.de/wiki/-/wiki/Allgemein/Raspberry+Pi+mit+B.A.T.M.A.N.+und+fastd+unter+Raspbian Raspberry Pi mit B.A.T.M.A.N. und fastd unter Raspbian] liegt dieser Lösung teilweise zu Grunde. Ich habe jedoch '''brctl''' durch die Befehle von '''ip''' ersetzt.
 
== git ==
 
Die benötigten Dateien stehen für FF-Rheonbach / Freifunk Rhein-Sieg und die Domäne Wupper in [https://github.com/Byggvir/fastd-BATMAN/ Github].
 
Herunterladen mit


<pre>
<pre>
git clone https://github.com/Byggvir/fastd-BATMAN.git
</pre>
== Installation der Software ==
=== B.A.T.M.A.N. und fastd installieren ===
Die folgenden Befehle und Scripte wurden unter '''Debian 8''', '''Debian 9'''und '''Raspbian 2018-04''' entwickelt und getestet.
Das folgende Script installiert auf einem Debian 8 / 9 bzw. Raspbian die notwendige Software - einschließlich fastd. Je nach System kann es notwendig sein zusätzliche Pakete zu installieren. Das folgende Script wurde auf zwei relativ frischen, jungfräulichen Debian 8.7.1 getestet.
Achtung: Die Router verwenden B.A.T.M.A.N. 2017.2 (Stand: 03.02.2018, Gluon v2017.1.4); Aktuell ist 2018.1. Im Debian sind meist ältere Versionen. Deshalb empfiehlt sich eine Installation aus den Quellen


Vor der Installation mit dem nachfolgenden Script müssen die passenden linunx-header- Dateien für den Kernel installiert sein / werden.
Z.B.
'''Debian:''' Für Raspbian befinden sich die Linux-Headers in linux-headers-amd64.
'''Raspbian:''' Für Raspbian befinden sich die Linux-Headers in raspberrypi-kernel-headers.
<pre>
#!/bin/bash
#!/bin/bash


VBAT="2016.5"
# Installation B.A.T.M.A.N.
# Version festlegen
 
VBAT="2018.1"
SRC="https://downloads.open-mesh.org/batman/releases/batman-adv-${VBAT}"
 
# Installation der linux-headers für den Kernel.
 
MACHINE=$(uname -m)
 
case "$MACHINE" in
 
x86_64)
    apt install linux-headers-amd64 # Debian
    ;;
armv7l)
    apt install raspberrypi-kernel-headers  # Raspian
    ;;
*)
echo -e "Unbekannte Architektur ${MACHINE}"
exit 1
;;
esac
 
# Wir brauchen ein paar Repos, die nicht im Default einhalten sind.


grep 'http://repo.universe-factory.net/debian/' /etc/apt/sources.list || echo  'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list
grep 'http://repo.universe-factory.net/debian/' /etc/apt/sources.list || echo  'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list


gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
# Und den Schlüssel für das Paket. Aktuell: 16EF3F64CB201D9C
gpg -a --export 16EF3F64CB201D9C | apt-key add -
 
KEY=16EF3F64CB201D9C
gpg --keyserver pgpkeys.mit.edu --recv-key $KEY
gpg -a --export $KEY | apt-key add -
 
# Nun die Software, die wahrscheinlich fehlt, inklusive fastd


apt install apt-transport-https
apt install apt-transport-https
apt update
apt update
apt install build-essential bridge-utils pkg-config libnl-3-dev libnl-genl-3-dev linux-headers-amd64 fastd
apt install build-essential bridge-utils pkg-config libnl-3-dev libnl-genl-3-dev fastd


cd /usr/src/
# Für alfred benötigte Entwicklunsgbibliotheken
wget http://downloads.open-mesh.org/batman/stable/sources/batctl/batctl-${VBAT}.tar.gz
 
apt install libnl-3-dev libnl-genl-3-dev libcap-dev libgps-dev
 
# Jetzt wird B.A.T.M.A.N. alfred aus den Quellen geladen und installiert
 
cd /tmp
wget ${SRC}/alfred-${VBAT}.tar.gz
tar xzf alfred-${VBAT}.tar.gz
cd alfred-${VBAT}
make CONFIG_ALFRED_GPSD=n
make CONFIG_ALFRED_GPSD=n install
 
# Jetzt wird B.A.T.M.A.N. batctl aus den Quellen geladen und installiert
 
cd /tmp
wget ${SRC}/batctl-${VBAT}.tar.gz
tar xzf batctl-${VBAT}.tar.gz
tar xzf batctl-${VBAT}.tar.gz
cd batctl-${VBAT}
cd batctl-${VBAT}
Zeile 35: Zeile 110:
make install
make install


cd /usr/src/
 
wget http://downloads.open-mesh.org/batman/stable/sources/batman-adv/batman-adv-${VBAT}.tar.gz
# Jetzt wird B.A.T.M.A.N. batman-adv aus den Quellen geladen und installiert
 
cd /tmp
wget ${SRC}/batman-adv-${VBAT}.tar.gz
tar xzf batman-adv-${VBAT}.tar.gz
tar xzf batman-adv-${VBAT}.tar.gz
cd batman-adv-${VBAT}
cd batman-adv-${VBAT}
make
make
make install
make install
# Wir können batman-adv gleich starten
modprobe batman-adv
modprobe batman-adv


grep '^batman-adv' /etc/modules || echo -e '#B.A.T.M.A.N für Freifunk'\nbatman-adv' >> /etc/modules
# ... und in die /etc/modules eintragen, damit es auch bei einem Neustart vorhanden ist
 
grep '^batman-adv' /etc/modules || echo -e '#B.A.T.M.A.N für Freifunk\nbatman-adv' >> /etc/modules
 
# zum Schluss legen wir uns noch ein Verzeichnis für die Konfiguration der fastd-Tunnel an.


mkdir -p /etc/fastd/ffrhb/peers
mkdir -p /etc/fastd/ffrhb/peers


</pre>
</pre>
== Konfiguration ==
=== B.A.T.M.A.N. konfigurieren ===
Der Befehl ''modprobe batman-adv'' startes B.A.T.M.A.N. gleich nach der Installation. Durch Aufnahme von ''batman-adv'' in die Datei ''/etc/modules'', wird B.A.T.M.A.N. beim Neustart des Rechner geladen. Beides wird bereits mit dem obigen Script erledigt, so dass wir fertig sind.


=== fastd konfigurieren ===
=== fastd konfigurieren ===


In das Verzeichnis /etc/fastd/ffrhb muss jetzt die folgende Datei fastd.conf kopiert werden:
Das script ''/etc/init.d/fastd'' startet die Default-Konfiguration in ''/etc/default/fastd'' und alle Konfigurationen in ''/etc/fastd/*/fastd.conf''. Eine Konfiguration in ''/etc/fastd/fastd.conf'' (wie in OpenSuSE) hat daher keine Auswirkung und wird nicht geladen.
 
Die folgende Konfigurationsdatei ''fastd.conf'' muss daher in das Verzeichnis ''/etc/fastd/ffrhb/'' kopiert werden.
 
 
Der ''secret key'' in der Datei dient nur als Beispiel und ist durch einen eigenen Schlüssel zu ersetzen. Ein eigener Schlüssel wird mit ''fastd --generate-key'' erzeugt.
 
Die MTU beträgt für Freifunk Rheinland zur Zeit 1364 Byte.
 
Das peer limit sollte auf 1 stehen, auch wenn 10 Server definiert sind. Mehrere Tunnel zur gleichen Zeit bieten zur Zeit keine Vorteile und belasten die Server.
 
==== Datei /etc/fastd/ffrhb/fastd.conf ====


<pre>
<pre>
Zeile 71: Zeile 173:
# Bind to a fixed port, IPv4 only
# Bind to a fixed port, IPv4 only
bind 0.0.0.0:53757;
bind 0.0.0.0:53757;
# Please replace the key with your own key.


# Secret key generated by `fastd --generate-key`
# Secret key generated by `fastd --generate-key`
Zeile 81: Zeile 185:
# Set the interface MTU for TAP mode with xsalsa20/aes128 over IPv4 with a base MTU of 1492 (PPPoE)
# Set the interface MTU for TAP mode with xsalsa20/aes128 over IPv4 with a base MTU of 1492 (PPPoE)
# (see MTU selection documentation)
# (see MTU selection documentation)
# For Freifunk Rheinland is the MTU 1364
mtu 1364;
mtu 1364;


Zeile 87: Zeile 193:
# Include peers from the directory 'peers'
# Include peers from the directory 'peers'
include peers from "/etc/fastd/ffrhb/peers";
include peers from "/etc/fastd/ffrhb/peers";
## IP v6 Adresse muss ggf. nach ip link set up dev bat0 gesetzt werden mit:
## ip addr add dev bat0 fda0:747e:ab29:2241:.../64 scope global


on up "
on up "
  ip link set up dev $INTERFACE
  /etc/fastd/ffrhb/on-up.sh $INTERFACE
  batctl if add $INTERFACE
  ip link set up dev bat0
";
";
</pre>
 
Die Schnittstelle ''mesh-vpn'' muss B.A.T.M.A.N. als Interface hinzugefügt werden und benötigt eine IPv6 Adresss mit scope global. Dies geschieht mit folgenden Script, dass unter /etc/fastd/ffrhb/on-up.sh gespeichert wird. Die MTU der Netzwerkschnittstelle ''bat0'' muss auf die MTU der Freifunk Community gesetzt werden. Für Rheinbach (Domäne Wupper ist es zur Zeit 1364).
==== Datei /etc/fastd/ffrhb/on-up.sh ====
Der Unterschied des folgenden Scriptes zu anderen Erklärungen / Beispielen im Internet ist, dass hier eine globale IPv6 Adresse für das Interface bat0 erzeugt wird und die MTU an die Bedürfnisse der FF-Rheinland angepasst wird. Deshalb erfolgt dies in einem eigenen Script und nicht in der fastd.conf. Das Script muss von fastd über ''on up'' aufgerufen werden.
<pre>
#!/bin/bash
# Execute when fastd is going up
# Autor: Thomas Arend
# (c) 2017 by Thomas Arend
# Date: 27.05.2018
INTERFACE=${1:-mesh-vpn}
logger "fastd on-up started"
# Start meshing on fastd tunnel
ip link set up dev $INTERFACE || logger "Error: Interface $INTERFACE not set up"
# Add tunnel interface to mesh
batctl if add $INTERFACE || logger "Error: Interface $INTERFACE not added to batman"
#sysctl net.ipv6.conf.bat0.disable_ipv6=1
#sysctl net.ipv6.conf.mesh-vpn.disable_ipv6=1
# Set mtu for bat0
# Change 1364 to your value in the site.conf for the FF firmware
ip link set up dev bat0 mtu 1364 || logger "Error when setting MTU to 1364"
batctl gw client 45
batctl orig_interval 5000
batctl multicast_mode 0
echo 15 > /sys/class/net/bat0/mesh/hop_penalty
echo 1 >  /sys/class/net/bat0/mesh/bridge_loop_avoidance
echo 1 >  /sys/class/net/$INTERFACE/batman_adv/no_rebroadcast
ip link add name br-client type bridge
ip link set bat0 master br-client
#  Add ipv6 addr with scope global to bat0
NIP='fda0:747e:ab29:2241'
GIP=`ip addr show dev bat0 | grep 'inet6 fe80::.* scope link' | sed 's#.*inet6 fe80::##; s# .*$##'`
ip addr add ${NIP}:${GIP} dev br-client scope global || logger "Error: IPv6 ${NIP}:${GIP} not set"
</pre>
Alternative für das Bestimmen der IP-Adresse:
  IPv6=`grep 'fe80.*bat0$'/proc/net/if_inet6 | sed 's#fe80000000000000#fda0747eab292241#;s# .*##; s#\([0-9a-f]\{4,4\}\)#\1:#g; s#:$##'`
==== Datei /etc/fastd/ffrhb/on-down.sh ====
<pre>
#!/bin/bash
# Execute when fastd is going down
# Autor: Thomas Arend
# (c) 2018 by Thomas Arend
# Date: 27.05.2018
ip link delete br-client type bridge
ip link set down dev bat0
ip link delete dev bat0
</pre>
==== Schlüssel Dateien für die Peers ====
Jeder [[Peer]] besitzt wie unser Rechner ein Schlüsselpaar, anhand dessen er eindeutig identifiziert wird. Die öffentlichen Schlüssel der müssen Peers kommen in das Unterverzeichnis ''peers''. Die Namen spielen dabei keine Rolle. Wir verwenden folgende Namenskonvention, um die Peer und öffentlichen  Schlüssel zu erkennen: ''mesh_vpn_backbone_peer_wupper&lt;n&gt;''. Diese Namen werden auch in der Firmware verwendet, &lt;n&gt; ist dabei die Nummer des Servers (0-9).
Beispiel für Wupper 0.
<pre>
key "e52daa654abcf5c20c5b7a74b5145f70a7491435c6ef334ae352e4f19c00e8f5";
remote "0.wupper.ffrl.de" port 53757;
</pre>
==== Anpassungen dhcpcd.conf ====
In der Datei /etc/dhcpcd.conf müssen unter Rasbian und Debian 9 (8?) folgende Ergänzungen vorgenommen werden:
<pre>
denyinterfaces bat0, mesh-vpn
interface mesh-vpn
noip4ll


interface br-client
noipv4ll
interface bat0
noipv4l
</pre>
</pre>


In das Unterverzeichnis ''peers'' kommen die Dateien ''mesh_vpn_backbone_peer_wupper&lt;n&gt;'' mit den öffentlichen Schlüsseln der Server im Internet. &lt;n&gt; ist dabei die Numer des Servers (0-9).
Ggf. kann zusätzlich ''br-client'' von DHCPC ausgenommen werden, wenn auf eine IPv4 Adresse 10.x.x.x verzichtet werden kann / soll.


key "e52daa654abcf5c20c5b7a74b5145f70a7491435c6ef334ae352e4f19c00e8f5";
==== Starten und Aktivieren ====
remote "0.wupper.ffrl.de" port 53757;


Nun muss nur noch ''fastd'' gestartet werden mit:
Nun muss nur noch ''fastd'' gestartet werden mit:
Zeile 114: Zeile 313:


<pre>
<pre>
root@x2:/etc/fastd/ffrhb/peers# ifconfig
root@medion:~# ifconfig bat0
bat0      Link encap:Ethernet  Hardware Adresse b2:f8:ce:2f:49:42  
bat0      Link encap:Ethernet  Hardware Adresse 32:e7:53:24:17:5f  
           inet6-Adresse: fe80::b0f8:ceff:fe2f:4942/64 Gültigkeitsbereich:Verbindung
          inet6-Adresse: fda0:747e:ab29:2241:30e7:53ff:fe24:175f/64 Gültigkeitsbereich:Global
           UP BROADCAST RUNNING MULTICAST  MTU:1500 Metrik:1
           inet6-Adresse: fe80::30e7:53ff:fe24:175f/64 Gültigkeitsbereich:Verbindung
           RX packets:37266 errors:0 dropped:0 overruns:0 frame:0
           UP BROADCAST RUNNING MULTICAST  MTU:1364 Metrik:1
           TX packets:10 errors:0 dropped:24 overruns:0 carrier:0
           RX packets:61804 errors:0 dropped:0 overruns:0 frame:0
           TX packets:28 errors:0 dropped:24 overruns:0 carrier:0
           Kollisionen:0 Sendewarteschlangenlänge:0  
           Kollisionen:0 Sendewarteschlangenlänge:0  
           RX bytes:2281776 (2.1 MiB)  TX bytes:1026 (1.0 KiB)
           RX bytes:3708888 (3.5 MiB)  TX bytes:3529 (3.4 KiB)


mesh-vpn  Link encap:Ethernet  Hardware Adresse ce:1a:f0:74:c6:ff  
mesh-vpn  Link encap:Ethernet  Hardware Adresse aa:53:8d:76:e2:fa  
           inet6-Adresse: fe80::cc1a:f0ff:fe74:c6ff/64 Gültigkeitsbereich:Verbindung
           inet6-Adresse: fe80::a853:8dff:fe76:e2fa/64 Gültigkeitsbereich:Verbindung
           UP BROADCAST RUNNING MULTICAST  MTU:1364  Metrik:1
           UP BROADCAST RUNNING MULTICAST  MTU:1364  Metrik:1
           RX packets:69111 errors:0 dropped:0 overruns:0 frame:0
           RX packets:66901 errors:0 dropped:0 overruns:0 frame:0
           TX packets:28101 errors:0 dropped:0 overruns:0 carrier:0
           TX packets:23753 errors:0 dropped:0 overruns:0 carrier:0
           Kollisionen:0 Sendewarteschlangenlänge:500  
           Kollisionen:0 Sendewarteschlangenlänge:500  
           RX bytes:9860004 (9.4 MiB)  TX bytes:5958484 (5.6 MiB)
           RX bytes:9241074 (8.8 MiB)  TX bytes:5150504 (4.9 MiB)
root@x2:/etc/fastd/ffrhb/peers# systemctl -l status fastd
 
root@medion:~# systemctl -l status fastd
● fastd.service - LSB: Fast and Secure Tunneling Daemon
● fastd.service - LSB: Fast and Secure Tunneling Daemon
   Loaded: loaded (/etc/init.d/fastd)
   Loaded: loaded (/etc/init.d/fastd)
   Active: active (running) since So 2017-02-26 17:52:59 CET; 31min ago
   Active: active (running) since Fr 2017-03-03 16:54:08 CET; 26min ago
  Process: 2686 ExecStop=/etc/init.d/fastd stop (code=exited, status=0/SUCCESS)
  Process: 2697 ExecStart=/etc/init.d/fastd start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/fastd.service
   CGroup: /system.slice/fastd.service
           └─3122 /usr/bin/fastd --syslog-level info --config /etc/fastd/ffrhb/fastd.conf
           └─2710 /usr/bin/fastd --syslog-level info --config /etc/fastd/ffrhb/fastd.conf
 
Mär 03 16:54:08 medion fastd[2697]: Starting Fast and Secure Tunneling Daemon...  Autostarting fastd 'ffrhb':.
Mär 03 16:54:08 medion systemd[1]: Started LSB: Fast and Secure Tunneling Daemon.


Feb 26 17:52:59 x2 fastd[3115]: Starting Fast and Secure Tunneling Daemon...  Autostarting fastd 'ffrhb':.
Feb 26 17:52:59 x2 systemd[1]: Started LSB: Fast and Secure Tunneling Daemon.
root@x2:/etc/fastd/ffrhb/peers# batctl if
root@x2:/etc/fastd/ffrhb/peers# batctl if
mesh-vpn: active
mesh-vpn: active
root@x2:/etc/fastd/ffrhb/peers# batctl tg
 
[B.A.T.M.A.N. adv 2016.5, MainIF/MAC: mesh-vpn/ce:1a:f0:74:c6:ff (bat0/b2:f8:ce:2f:49:42 BATMAN_IV)]
root@medion:~# batctl tl
  Client            VID Flags Last ttvn    Via        ttvn  (CRC      )
[B.A.T.M.A.N. adv 2016.5, MainIF/MAC: mesh-vpn/aa:53:8d:76:e2:fa (bat0/32:e7:53:24:17:5f BATMAN_IV), TTVN: 3]
* 2c:f0:ee:b3:e6:c2   -1 [.W..] ( 38) 66:60:a9:f5:70:63 ( 49) (0xef11ca93)
Client            VID Flags   Last seen (CRC      )
* 14:cc:20:6f:46:00   -1 [....] ( 58) 16:d0:20:6f:46:00 ( 59) (0x84f2afcd)
33:33:ff:24:17:5f   -1 [.P....]   0.000  (0x2453b430)
* a0:99:9b:2d:0e:49   -1 [.W..] 0) 8a:93:63:cf:8b:63 (  0) (0xf96b1321)
33:33:00:00:00:fb   -1 [.P....]   0.000  (0x2453b430)
* 60:e3:27:9a:9e:12    0 [....] (169) f2:1d:56:5c:42:43 (174) (0xa4d616f6)
01:00:5e:00:00:01   -1 [.P....]   0.000  (0x2453b430)
* f4:f2:6d:ea:ec:34   -1 [....] (231) 86:9c:00:88:bf:b3 (231) (0xf17a3965)
32:e7:53:24:17:5f   -1 [.P....]   0.000  (0x2453b430)
* 70:3e:ac:35:57:44   -1 [.W..] (137) 2e:4c:59:48:85:9b (144) (0x975fc536)
33:33:00:00:00:01   -1 [.P....]   0.000  (0x2453b430)
</pre>
</pre>


=== Netzwerkbrücke ===
== Warnungen ==
 
Fastd baut den Tunnel über eine beliebige Netzwerkverbindung auf. D.h. der Rechner kann in einem WLAN - privat oder öffentlich - betrieben werden. Dies kann auch ein Freifunk-Netz sein.
 
Ist der Rechner in einem Freifunk-Netz, dann baut er einen fastd-Tunnel im fastd-Tunnel des Nodes auf, der die Verbindung zum Internet herstellt. Dies ist nicht sinnvoll und kann Effekte haben, die ich derzeit nicht überblicke und die nicht wünschenswert sind. Ein Effekt wird das Splitten von großen IP-Paketen sein.


Nun muss nur noch eine Netzwerkbrücke eingerichtet werden. Aber daran arbeite ich noch.
== Ergebnis und Siegerehrung ==


=== Netzwerkbrücke ===
Über unseren fastd-Tunnel können wir auf die Nodes und die Clients des Freifunknetzes über IPv6 zugreifen.

Aktuelle Version vom 27. Mai 2018, 20:27 Uhr

B.A.T.M.A.N. (Abkürzung für Better Approach To Mobile Adhoc Networking) ist ein Routing-Protokoll für mobile Ad-hoc-Netze. Siehe WikiPedia. Im Freifunk wird unter anderem B.A.T.M.A.N. als Routing-Protokoll eingesetzt.

Abstrakt

In diesem Artikel wird beschrieben, wie B.A.T.M.A.N. zusammen mit fastd auf einem Rechner mit Debian eingerichtet wird und der Rechner direkt an das Netz des Freifunk Rheinland, Domäne Wupper, angebunden wird. Als Beispiel dient die Konfiguration der Freifunk Rheinbach Community.

Mit Stand Mai 2018 wird auch alfred installiert, aber nicht konfiguriert.

Die Verbindung der Nodes (Router) zu den Servern im Internet erfolgt über einen verschlüsselten Tunnel. Bei Freifunk Rheinbach wird für die Tunnel fastd verwendet. Nodes, die in WLAN Reichweite zueinander stehen, verbinden sich untereinander über ein MESH-Netzwerk. Auch über Kabel (LAN oder WAN-Port) können sich Nodes vermaschen. Auf all diesen Verbindungen wird das Routing-Protokoll B.A.T.M.A.N. verwendet.

Hinweise

Ich verwende als Shell die bash. Standard ist bei Debian 8.7.1 dash. Die Befehle in den Scripten sind so einfach, dass sie in beiden Shells funktionieren sollten.

Dieser Beitrag basiert auf zahlreichen Quellen und den Erfahrungen aus den Tests. Soweit möglich versuche ich ältere Befehle durch neuere, moderne Befehle zu ersetzen.

Der Beitrag Raspberry Pi mit B.A.T.M.A.N. und fastd unter Raspbian liegt dieser Lösung teilweise zu Grunde. Ich habe jedoch brctl durch die Befehle von ip ersetzt.

git

Die benötigten Dateien stehen für FF-Rheonbach / Freifunk Rhein-Sieg und die Domäne Wupper in Github.

Herunterladen mit

git clone https://github.com/Byggvir/fastd-BATMAN.git

Installation der Software

B.A.T.M.A.N. und fastd installieren

Die folgenden Befehle und Scripte wurden unter Debian 8, Debian 9und Raspbian 2018-04 entwickelt und getestet.

Das folgende Script installiert auf einem Debian 8 / 9 bzw. Raspbian die notwendige Software - einschließlich fastd. Je nach System kann es notwendig sein zusätzliche Pakete zu installieren. Das folgende Script wurde auf zwei relativ frischen, jungfräulichen Debian 8.7.1 getestet.

Achtung: Die Router verwenden B.A.T.M.A.N. 2017.2 (Stand: 03.02.2018, Gluon v2017.1.4); Aktuell ist 2018.1. Im Debian sind meist ältere Versionen. Deshalb empfiehlt sich eine Installation aus den Quellen

Vor der Installation mit dem nachfolgenden Script müssen die passenden linunx-header- Dateien für den Kernel installiert sein / werden.

Z.B.

Debian: Für Raspbian befinden sich die Linux-Headers in linux-headers-amd64. Raspbian: Für Raspbian befinden sich die Linux-Headers in raspberrypi-kernel-headers.

#!/bin/bash

# Installation B.A.T.M.A.N.
# Version festlegen

VBAT="2018.1"
SRC="https://downloads.open-mesh.org/batman/releases/batman-adv-${VBAT}"

# Installation der linux-headers für den Kernel.

MACHINE=$(uname -m)

case "$MACHINE" in

 x86_64) 
    apt install linux-headers-amd64 	# Debian
    ;;
 armv7l)
    apt install raspberrypi-kernel-headers  # Raspian
    ;;
 *)
 echo -e "Unbekannte Architektur ${MACHINE}"
 exit 1
 ;;
 
esac

# Wir brauchen ein paar Repos, die nicht im Default einhalten sind.

grep 'http://repo.universe-factory.net/debian/' /etc/apt/sources.list || echo  'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list

# Und den Schlüssel für das Paket. Aktuell: 16EF3F64CB201D9C

KEY=16EF3F64CB201D9C
gpg --keyserver pgpkeys.mit.edu --recv-key $KEY
gpg -a --export $KEY | apt-key add -

# Nun die Software, die wahrscheinlich fehlt, inklusive fastd

apt install apt-transport-https
apt update
apt install build-essential bridge-utils pkg-config libnl-3-dev libnl-genl-3-dev fastd

# Für alfred benötigte Entwicklunsgbibliotheken

apt install libnl-3-dev libnl-genl-3-dev libcap-dev libgps-dev

# Jetzt wird B.A.T.M.A.N. alfred aus den Quellen geladen und installiert

cd /tmp
wget ${SRC}/alfred-${VBAT}.tar.gz
tar xzf alfred-${VBAT}.tar.gz
cd alfred-${VBAT}
make CONFIG_ALFRED_GPSD=n
make CONFIG_ALFRED_GPSD=n install

# Jetzt wird B.A.T.M.A.N. batctl aus den Quellen geladen und installiert

cd /tmp
wget ${SRC}/batctl-${VBAT}.tar.gz
tar xzf batctl-${VBAT}.tar.gz
cd batctl-${VBAT}
make
make install


# Jetzt wird B.A.T.M.A.N. batman-adv aus den Quellen geladen und installiert

cd /tmp
wget ${SRC}/batman-adv-${VBAT}.tar.gz
tar xzf batman-adv-${VBAT}.tar.gz
cd batman-adv-${VBAT}
make
make install

# Wir können batman-adv gleich starten

modprobe batman-adv

# ... und in die /etc/modules eintragen, damit es auch bei einem Neustart vorhanden ist

grep '^batman-adv' /etc/modules || echo -e '#B.A.T.M.A.N für Freifunk\nbatman-adv' >> /etc/modules

# zum Schluss legen wir uns noch ein Verzeichnis für die Konfiguration der fastd-Tunnel an.

mkdir -p /etc/fastd/ffrhb/peers

Konfiguration

B.A.T.M.A.N. konfigurieren

Der Befehl modprobe batman-adv startes B.A.T.M.A.N. gleich nach der Installation. Durch Aufnahme von batman-adv in die Datei /etc/modules, wird B.A.T.M.A.N. beim Neustart des Rechner geladen. Beides wird bereits mit dem obigen Script erledigt, so dass wir fertig sind.

fastd konfigurieren

Das script /etc/init.d/fastd startet die Default-Konfiguration in /etc/default/fastd und alle Konfigurationen in /etc/fastd/*/fastd.conf. Eine Konfiguration in /etc/fastd/fastd.conf (wie in OpenSuSE) hat daher keine Auswirkung und wird nicht geladen.

Die folgende Konfigurationsdatei fastd.conf muss daher in das Verzeichnis /etc/fastd/ffrhb/ kopiert werden.


Der secret key in der Datei dient nur als Beispiel und ist durch einen eigenen Schlüssel zu ersetzen. Ein eigener Schlüssel wird mit fastd --generate-key erzeugt.

Die MTU beträgt für Freifunk Rheinland zur Zeit 1364 Byte.

Das peer limit sollte auf 1 stehen, auch wenn 10 Server definiert sind. Mehrere Tunnel zur gleichen Zeit bieten zur Zeit keine Vorteile und belasten die Server.

Datei /etc/fastd/ffrhb/fastd.conf

# Log warnings and errors to stderr
log level warn;

# Log everything to syslog
log to syslog level warn;

# Set the interface name
interface "mesh-vpn";

# Support salsa2012+umac and null methods, prefer salsa2012+umac
method "salsa2012+umac";
method "null";

mode tap;

# Bind to a fixed port, IPv4 only
bind 0.0.0.0:53757;

# Please replace the key with your own key.

# Secret key generated by `fastd --generate-key`
secret "e0e07c1462748f4b0f36423c0ce5c4169e48354a07a3b908435f8ab128259c53";
# Secret: e0e07c1462748f4b0f36423c0ce5c4169e48354a07a3b908435f8ab128259c53
# Public: 72dc4c1aa15cfe4ae5d54caccd8efbd1af8848770843b26a58ed2fb8edb82d50

secure handshakes yes;

# Set the interface MTU for TAP mode with xsalsa20/aes128 over IPv4 with a base MTU of 1492 (PPPoE)
# (see MTU selection documentation)
# For Freifunk Rheinland is the MTU 1364

mtu 1364;

peer limit 1;

# Include peers from the directory 'peers'
include peers from "/etc/fastd/ffrhb/peers";

## IP v6 Adresse muss ggf. nach ip link set up dev bat0 gesetzt werden mit:
## ip addr add dev bat0 fda0:747e:ab29:2241:.../64 scope global

on up "
  /etc/fastd/ffrhb/on-up.sh $INTERFACE
";

Die Schnittstelle mesh-vpn muss B.A.T.M.A.N. als Interface hinzugefügt werden und benötigt eine IPv6 Adresss mit scope global. Dies geschieht mit folgenden Script, dass unter /etc/fastd/ffrhb/on-up.sh gespeichert wird. Die MTU der Netzwerkschnittstelle bat0 muss auf die MTU der Freifunk Community gesetzt werden. Für Rheinbach (Domäne Wupper ist es zur Zeit 1364).

Datei /etc/fastd/ffrhb/on-up.sh

Der Unterschied des folgenden Scriptes zu anderen Erklärungen / Beispielen im Internet ist, dass hier eine globale IPv6 Adresse für das Interface bat0 erzeugt wird und die MTU an die Bedürfnisse der FF-Rheinland angepasst wird. Deshalb erfolgt dies in einem eigenen Script und nicht in der fastd.conf. Das Script muss von fastd über on up aufgerufen werden.

#!/bin/bash

# Execute when fastd is going up
# Autor: Thomas Arend
# (c) 2017 by Thomas Arend
# Date: 27.05.2018

INTERFACE=${1:-mesh-vpn}
logger "fastd on-up started"

# Start meshing on fastd tunnel
ip link set up dev $INTERFACE || logger "Error: Interface $INTERFACE not set up"

# Add tunnel interface to mesh
batctl if add $INTERFACE || logger "Error: Interface $INTERFACE not added to batman"
#sysctl net.ipv6.conf.bat0.disable_ipv6=1
#sysctl net.ipv6.conf.mesh-vpn.disable_ipv6=1

# Set mtu for bat0
# Change 1364 to your value in the site.conf for the FF firmware

ip link set up dev bat0 mtu 1364 || logger "Error when setting MTU to 1364"
batctl gw client 45
batctl orig_interval 5000
batctl multicast_mode 0
echo 15 > /sys/class/net/bat0/mesh/hop_penalty
echo 1 >  /sys/class/net/bat0/mesh/bridge_loop_avoidance
echo 1 >  /sys/class/net/$INTERFACE/batman_adv/no_rebroadcast

ip link add name br-client type bridge
ip link set bat0 master br-client

#  Add ipv6 addr with scope global to bat0

NIP='fda0:747e:ab29:2241'
GIP=`ip addr show dev bat0 | grep 'inet6 fe80::.* scope link' | sed 's#.*inet6 fe80::##; s# .*$##'`

ip addr add ${NIP}:${GIP} dev br-client scope global || logger "Error: IPv6 ${NIP}:${GIP} not set"

Alternative für das Bestimmen der IP-Adresse:

 IPv6=`grep 'fe80.*bat0$'/proc/net/if_inet6 | sed 's#fe80000000000000#fda0747eab292241#;s# .*##; s#\([0-9a-f]\{4,4\}\)#\1:#g; s#:$##'`

Datei /etc/fastd/ffrhb/on-down.sh

#!/bin/bash

# Execute when fastd is going down
# Autor: Thomas Arend
# (c) 2018 by Thomas Arend
# Date: 27.05.2018

ip link delete br-client type bridge
ip link set down dev bat0
ip link delete dev bat0

Schlüssel Dateien für die Peers

Jeder Peer besitzt wie unser Rechner ein Schlüsselpaar, anhand dessen er eindeutig identifiziert wird. Die öffentlichen Schlüssel der müssen Peers kommen in das Unterverzeichnis peers. Die Namen spielen dabei keine Rolle. Wir verwenden folgende Namenskonvention, um die Peer und öffentlichen Schlüssel zu erkennen: mesh_vpn_backbone_peer_wupper<n>. Diese Namen werden auch in der Firmware verwendet, <n> ist dabei die Nummer des Servers (0-9).

Beispiel für Wupper 0.

key "e52daa654abcf5c20c5b7a74b5145f70a7491435c6ef334ae352e4f19c00e8f5";
remote "0.wupper.ffrl.de" port 53757;

Anpassungen dhcpcd.conf

In der Datei /etc/dhcpcd.conf müssen unter Rasbian und Debian 9 (8?) folgende Ergänzungen vorgenommen werden:

denyinterfaces bat0, mesh-vpn

interface mesh-vpn
noip4ll

interface br-client
noipv4ll

interface bat0
noipv4l

Ggf. kann zusätzlich br-client von DHCPC ausgenommen werden, wenn auf eine IPv4 Adresse 10.x.x.x verzichtet werden kann / soll.

Starten und Aktivieren

Nun muss nur noch fastd gestartet werden mit:

service fastd start

Um fastd mit jedem Neustart automatisch zu starten, muss der folgende Befehl ausgeführt werden:

systemctl enable fastd

Test der Konfiguration

Ob alles richtig läuft, zeigen ifconfig, systemctl status fastd und batctl if bzw. batctl tg

root@medion:~# ifconfig bat0
bat0      Link encap:Ethernet  Hardware Adresse 32:e7:53:24:17:5f  
          inet6-Adresse: fda0:747e:ab29:2241:30e7:53ff:fe24:175f/64 Gültigkeitsbereich:Global
          inet6-Adresse: fe80::30e7:53ff:fe24:175f/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1364  Metrik:1
          RX packets:61804 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28 errors:0 dropped:24 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:0 
          RX bytes:3708888 (3.5 MiB)  TX bytes:3529 (3.4 KiB)

mesh-vpn  Link encap:Ethernet  Hardware Adresse aa:53:8d:76:e2:fa  
          inet6-Adresse: fe80::a853:8dff:fe76:e2fa/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1364  Metrik:1
          RX packets:66901 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23753 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:500 
          RX bytes:9241074 (8.8 MiB)  TX bytes:5150504 (4.9 MiB)

root@medion:~# systemctl -l status fastd
● fastd.service - LSB: Fast and Secure Tunneling Daemon
   Loaded: loaded (/etc/init.d/fastd)
   Active: active (running) since Fr 2017-03-03 16:54:08 CET; 26min ago
  Process: 2686 ExecStop=/etc/init.d/fastd stop (code=exited, status=0/SUCCESS)
  Process: 2697 ExecStart=/etc/init.d/fastd start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/fastd.service
           └─2710 /usr/bin/fastd --syslog-level info --config /etc/fastd/ffrhb/fastd.conf

Mär 03 16:54:08 medion fastd[2697]: Starting Fast and Secure Tunneling Daemon...  Autostarting fastd 'ffrhb':.
Mär 03 16:54:08 medion systemd[1]: Started LSB: Fast and Secure Tunneling Daemon.

root@x2:/etc/fastd/ffrhb/peers# batctl if
mesh-vpn: active

root@medion:~# batctl tl
[B.A.T.M.A.N. adv 2016.5, MainIF/MAC: mesh-vpn/aa:53:8d:76:e2:fa (bat0/32:e7:53:24:17:5f BATMAN_IV), TTVN: 3]
Client             VID Flags    Last seen (CRC       )
33:33:ff:24:17:5f   -1 [.P....]   0.000   (0x2453b430)
33:33:00:00:00:fb   -1 [.P....]   0.000   (0x2453b430)
01:00:5e:00:00:01   -1 [.P....]   0.000   (0x2453b430)
32:e7:53:24:17:5f   -1 [.P....]   0.000   (0x2453b430)
33:33:00:00:00:01   -1 [.P....]   0.000   (0x2453b430)

Warnungen

Fastd baut den Tunnel über eine beliebige Netzwerkverbindung auf. D.h. der Rechner kann in einem WLAN - privat oder öffentlich - betrieben werden. Dies kann auch ein Freifunk-Netz sein.

Ist der Rechner in einem Freifunk-Netz, dann baut er einen fastd-Tunnel im fastd-Tunnel des Nodes auf, der die Verbindung zum Internet herstellt. Dies ist nicht sinnvoll und kann Effekte haben, die ich derzeit nicht überblicke und die nicht wünschenswert sind. Ein Effekt wird das Splitten von großen IP-Paketen sein.

Ergebnis und Siegerehrung

Über unseren fastd-Tunnel können wir auf die Nodes und die Clients des Freifunknetzes über IPv6 zugreifen.