Supernode: Unterschied zwischen den Versionen

Aus Freifunk Köln, Bonn und Umgebung
Zur Navigation springen Zur Suche springen
(Kategorisiert)
 
(146 dazwischenliegende Versionen von 14 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{TOCright}}
{{TOCright}}
[[Kategorie:Infrastruktur]]
[[Kategorie:Anleitungen]]
{{Mithilfe}}
<span style="color: #C00; font-weight:bold; ">Hinweis:</span> Bei Fragen oder Problemen wende Dich bitte an die [[Mailingliste]]. Die Anleitung hier wurde von vielen Leuten geschrieben - es hilft in der Regel nur wenig, wenn Du jemanden persönlich per E-Mail kontaktierst.


== Voraussetzungen ==
== Voraussetzungen ==
Zeile 6: Zeile 10:
Benötigte Software
Benötigte Software


1) [[https://projects.universe-factory.net/projects/fastd fastd]] mesh-node-vpn
1) [[https://projects.universe-factory.net/projects/fastd fastd]] Mesh-vpn


2) [[https://github.com/ff-kbu/fastd-service vpn-key-upload]] todo: remove overhead (apache,ruby,sinatra ...), [https://en.wikipedia.org/wiki/KISS_principle kiss principle]]
2) [[https://bmx6.net/projects/bmx6 bmx6]] BackboneMeshProtokoll
not documented in here (todo)


3) [[http://www.open-mesh.org/projects/open-mesh/wiki batman-adv]]
3) [[http://www.open-mesh.org/projects/open-mesh/wiki batman-adv]] ClientMeshProtokoll


4) [[http://www.tinc-vpn.org/ tinc]] mesh-backbone-vpn
4) [[http://www.tinc-vpn.org/ tinc]] Mesh-vpn


5) OS: debian wheezy (or whatever you like)
5) OS: debian jessie(or whatever you like)


Du benötigst ausserdem: <br />
Du benötigst ausserdem: <br />
* einen fastd-private-key
* eine IPv4/IPv6 Adresse und ein Subnetz
* eine IPv4 Adresse für das Backbone-Netz


* eine private IPv4/IPv6 Adresse und ein Subnetz für die Clients
* eine IPv4/IPv6 Adresse für das Backbone-Netz
Diese kannst du unter dem Artikel [[IP_Subnetze]] selbst zuteilen, oder nachlesen, welches deine sind, wenn es jemand anderes dir schon zuteilte.
(nur bei öffentlichen Supernodes)


== Vorbereitungen ==
== Vorbereitungen ==
In der /etc/sysctl.conf muss folgendes gesetzt sein:
In der /etc/sysctl.conf muss folgendes mit einem Editor hinzugefügt werden:
<pre>
<pre>
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
net.ipv4.ip_forward=1
net.ipv4.ip_no_pmtu_disc=1
net.ipv4.ip_no_pmtu_disc=1
Zeile 33: Zeile 38:
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra=0
EOF
# If Supernode running on USB Stick/FlashCard with low memory, this option prevents swapping until it is definitely needed
vm.swappiness=1
</pre>
</pre>


Zeile 41: Zeile 47:
</pre>
</pre>


Für Batman-adv und fastd-Pakete in /etc/apt/apt/sources.list hinzufügen:
Für Batman-adv und fastd-Pakete in /etc/apt/apt/sources.list hinzufügen, z.B. so:
<pre>
<pre>
echo "deb http://repo.universe-factory.net/debian/ sid main" >>/etc/apt/sources.list
echo "deb http://repo.universe-factory.net/debian/ sid main" >>/etc/apt/sources.list
</pre>
</pre>


GPG-Key importieren:
GPG-Key importieren und apt via https ermöglichen:
<pre>
<pre>
  gpg --keyserver pgpkeys.mit.edu --recv-key  16EF3F64CB201D9C
  gpg --keyserver pgpkeys.mit.edu --recv-key  16EF3F64CB201D9C
  gpg -a --export 16EF3F64CB201D9C | apt-key add -
  gpg -a --export 16EF3F64CB201D9C | apt-key add -
apt-get install apt-transport-https
  apt-get update
  apt-get update
</pre>
</pre>


== Batman-adv ==
== Batman-adv (compat14 (Hood Bonn))==
=== Installation ===
=== Installation ===
Dies sollte auf debian wheezy batman-adv 2013.4.0 installieren.
Dies sollte auf debian wheezy batman-adv 2013.4.0 installieren.
Zeile 60: Zeile 69:
echo "batman-adv" >> /etc/modules
echo "batman-adv" >> /etc/modules
</pre>
</pre>
==== debian jessie ====
batman 14 aus folgender quelle installieren:
<pre>
http://repo.universe-factory.net/debian/ sid main
</pre>
dann dkms die richtige version beibringen:
<pre>
dkms remove batman-adv/2013.4.0 --all
dkms --force install batman-adv/2013.4.0
</pre>
und mit apt-pinning die richtige version für batctl erzwingen, in /etc/apt/preferences.d/batctl.pref:
<pre>
Package: batctl
Pin: origin repo.universe-factory.net
Pin-Priority: 1000
</pre>
und apt-get install batctl
== Batman-adv (compat15)==
=== Installation ===
Update and install:
apt-get update
apt-get install git make gcc build-essential linux-headers-$(uname -r) pkg-config libgps-dev libnl-3-dev libjansson-dev fastd libnl-genl-3-dev
Install Batman, batctl and alfred
mkdir /opt/freifunk
cd $_
git clone git://git.open-mesh.org/batman-adv.git
cd batman-adv
git checkout v2016.3
make
make install
cd ../
git clone http://git.open-mesh.org/batctl.git
cd batctl
git checkout v2016.3
make
make install
Wird künftig nicht mehr benötigt. Wer's trotzdem installieren mag:
cd ../
git clone http://git.open-mesh.org/alfred.git
cd alfred
git checkout v2014.4.0
make
make install


== fastd ==
== fastd ==
Zeile 65: Zeile 128:


<pre>
<pre>
  apt-get install fastd
  apt-get install fastd curl
</pre>
</pre>
'''Add Directories'''
mkdir /etc/fastd/mesh-vpn
mkdir /etc/fastd/mesh-vpn/backbone


=== Konfiguration ===
=== Konfiguration ===
==== fastd.conf ====
 
"[YOUR SECRET KEY HERE]" Sollte dabei durch den fastd-secret-key ersetzt werden (erfragen)
 
"[YOUR SECRET KEY HERE]" sollte dabei durch den fastd-secret-key ersetzt werden. Den Key müsst ihr selbst erstellen. Dies geht mit dem Befehl:
 
fastd --generate-key
 
Schreibt am besten euch public und private key woanders noch auf. Wenn ihr den verliert, können Nodes nicht mehr mit euch connecten, solange diese nicht umkonfiguriert werden.
 
In /etc/fastd/mesh-vpn/fastd.conf folgendes hinzufügen:
 
==== /etc/fastd/mesh-vpn/fastd.conf ====
 
<pre>
<pre>
mkdir /etc/fastd/mesh-vpn;
cat > /etc/fastd/mesh-vpn/fastd.conf << EOF
# Log warnings and errors to stderr
# Log warnings and errors to stderr
#log level warn;
#log level warn;
log level error;
log level error;
drop capabilities yes;
forward no;
hide ip addresses yes;
hide mac addresses yes;


# Log everything to a log file
# Log everything to a log file
#log to "/var/log/fastd-mesh-vpn.log" level debug;
#log to "/var/log/fastd-mesh-vpn.log" level debug;
log to "/var/log/fastd-mesh-vpn.log" level warn;
#log to "/var/log/fastd-mesh-vpn.log" level warn;


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


# Support xsalsa20 and aes128 encryption methods, prefer xsalsa20
# Support xsalsa20 and aes128 encryption methods, prefer xsalsa20
method "salsa2012+gmac";
method "salsa2012+umac";
method "null";


# Bind to a fixed port, IPv4 only
# Bind to a fixed port, IPv4 only
bind 0.0.0.0:10000;
bind 0.0.0.0:10000;
mtu 1312;
pmtu auto;
secure handshakes yes;


# Secret key generated by 'fastd --generate-key'
# Secret key generated by 'fastd --generate-key'
secret "[YOUR SECRET KEY HERE]";
secret "[YOUR SECRET KEY HERE]";


# Set the interface MTU for TAP mode with xsalsa20/aes128 over IPv4 with a base MTU of 1492 (PPPoE)
# (see MTU selection documentation)
mtu 1426;


# Include peers from the directory 'peers'
# Include peers from the directory 'peers' and set max connections
include peers from "peers";
include peers from "backbone";


on up "./fastd-up";
peer group "backbone" {
# on down "./fastd-down";
  include peers from "backbone";
 
  peer limit 64;
on establish "
}
        NODE_ID=${PEER_NAME:0:12}
        /usr/bin/curl  -u vpn2:XXXXXX  -X POST -d viewpoint=fastd2 -d mac=$NODE_ID -d vpn_sw=fastd -d vpn_status=up -d ip=$PEER_ADDRESS http://register.kbu.freifunk.net/nodes/update_vpn_status &
";
on disestablish "
        NODE_ID=${PEER_NAME:0:12}
        /usr/bin/curl  -u vpn2:XXXXXX  -X POST -d viewpoint=fastd2 -d mac=$NODE_ID -d vpn_sw=fastd -d vpn_status=down -d ip=$PEER_ADDRESS http://register.kbu.freifunk.net/nodes/update_vpn_status &
";
EOF
</pre>
Hinweise:
* Username / Password stehen im Keypass.
* Viewpoint (hier: fastd2) anpassen
* Grundsätzlich wird die Node-ID nicht escpaed. Shell-code injections ist aber nicht möglich, da mon_serv nur node_ids der Form $mac_$key zulässt.
* Die Calls auf der Script sind synchron - Daher "&". fastd blockiert solange das Script nicht terminiert ist. (Zumindest Stand 04/2014)
Ordnerstruktur anlegen:
<pre>
mkdir /etc/fastd/mesh-vpn/backbone
mkdir /etc/fastd/mesh-vpn/peers
chown www-data /etc/fastd/mesh-vpn/peers
</pre>
 
==== Backbone ====
Backbone Keys einrichten:
<pre>
$:/etc/fastd/mesh-vpn# ls backbone/
fastd1 fastd2 fastd3 fastd4 fastd5 fastd6 fastd7 fastd8
$:/etc/fastd/mesh-vpn# cat backbone/*
key "4f856d95bd596ac7724edca73a19e6e9d142b374df27166bb1a78e58785efc59";
remote ipv4 "fastd1.kbu.freifunk.net" port 10000;


key "e1916b66c4f8a795e217877cf72607d952e796463c7024dd9a6a47ae2929bc10";
remote ipv4 "fastd2.kbu.freifunk.net" port 10000;


key "d56181dfe9b5ac7cfe68a94c0ce406322a9924286a751673da0dcb28ad5218b0";
on up sync "./on-up";
remote ipv4 "fastd3.kbu.freifunk.net" port 10000;


key "9b3f65f99963343e2785c8c4fad65e70b73ee7e1205d63bd84f3e2decb53e621";
# Allows all peers to connect.
remote ipv4 "fastd4.kbu.freifunk.net" port 10000;
on verify async "true";
 
</pre>
key "6e4546121d16e7189715aef8ceb78ab58d59462720969318445f97b4301374d1";
remote ipv4 "fastd5.kbu.freifunk.net" port 10000;
 
key "2a2c69dbb3b9fd90d7eb8e2f70be70b472d811cd4f3743ad9f5002d14b5c94cd";
remote ipv4 "fastd6.kbu.freifunk.net" port 10000;
 
key "68de6815a89270c8eaf7832deedb8da098aad2ae5793cd2cd55dec3541ad28f2";
remote ipv4 "fastd7.kbu.freifunk.net" port 10000;


key "b41a9714b1178ce428b15af0b6055cc204b39af2088ef3b371d8c36219eedd1e";
Optional: Wenn die Node teil einer grösseren Hood werden soll, entsprechende Backbone Node Keys in das Verzeichnis /etc/fastd/mesh-vpn/backbone legen. Vorzuziehen ist aber entweder eine eigene Fastdinstanz oder eine Tinc VPN Verbindung (AES-NI) um sich an eine hood (Layer2 Mesh mit Batman-adv) zu verbinden, dies ist performanter.
remote ipv4 "fastd8.kbu.freifunk.net" port 10000;
</pre>


[[https://github.com/ff-kbu/fff/tree/v0.3-generic/files/lib/freifunk/mesh-vpn/backbone fastd-backbone]] for more
Der IP v4-Range bezieht sich auf euren selbst gewählten Bereich, welcher unter https://pad.freifunk.net/p/kbuip dokumentiert ist.


==== fastd-up ====
==== /etc/fastd/mesh-vpn/on-up ====
<pre>
<pre>
cat > /etc/fastd/mesh-vpn/fastd-up << EOF
#!/bin/sh
#/bin/sh
/sbin/ip link set dev mesh-vpn address [MacAdresseAusdenken]
/sbin/ip link set dev mesh-vpn up
/sbin/ip link set dev mesh-vpn up
/usr/sbin/batctl if add mesh-vpn
/usr/sbin/batctl gw_mode server
/sbin/ifconfig bat0 [DEINE IPv4 Addresse hier] netmask 255.255.192.0 up


/sbin/ifconfig bat0:0 172.27.0.2 netmask 255.255.192.0 up
batctl if add mesh-vpn
batctl it 10000
batctl bl 1
batctl gw_mode server 200MBit/200MBit # anpassen


/sbin/ip rule add from 172.27.0.0/18 table ffkbu
/sbin/ip rule show | grep 'from 10.0.0.0/8 lookup freifunk'
/sbin/ip route add 172.27.0.0/18 dev bat0 table ffkbu
if [ $? -eq 1 ]; then
  /sbin/ip rule add from 10.0.0.0/8 table freifunk
fi
/sbin/ip route add [lokaleIPv4Range[Ex:10.123.234.0/24]] dev bat0 table freifunk
/sbin/ip route flush cache
/sbin/ip route flush cache
EOF
 
 
</pre>
</pre>


fastd-up ausführbar machen:
on-up ausführbar machen:
<pre>
<pre>
chmod +x /etc/fastd/mesh-vpn/fastd-up
chmod +x /etc/fastd/mesh-vpn/on-up
</pre>
</pre>


=== UDP-Queue Größe ===
== BmxBone Netz ==
Durch Broadcasts können können auf Supernodes kurzzeitig hohe Lastspitzen enstehen. In der aktuellen batman-adv-Version wird jedes Broadcast-Paket zudem 3x auf jedem Link versendet.
Die vergleichweise hohe Datenrate von 100MBit/s zwischen Supernodes bewirkt darüber hinaus, dass broadcast-Pakete mit 100MBit/s eingehen können, während sie gleichzeitig an alle Nodes gesendet werden müssen.


Linux-Distributionen sehen per Default Queue-Größen im Bereich von 128 KB vor (http://www.cyberciti.biz/faq/linux-tcp-tuning/). Supernodes sind somit nicht in der Lage entsprechende Lastspitzen zu puffern und während Idle-Times zu versenden. Läuft die UDP-Queue über, so loggt fastd:
Jetzt müsst ihr euch entscheiden, welches VPN Programm ihr für das BmxBone nutzen wollt:
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
* wenn ihr eine CPU mit AES-NI habt, oder eine CPU mit deutlich mehr als 1GHz nehmt tinc
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
* wenn ihr eine langsame CPU sub 1GHz oder sogar eine ARM CPU, sollte fastd besser sein
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
=== Installation mit tinc ===
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
Jeder Log-Eintrag entspricht einem Paket, dass nicht enqueued werden konnte und damit verworfen wurde. Die Queue-Größen können via systctl angepasst werden (http://wwwx.cs.unc.edu/~sparkst/howto/network_tuning.php). Auf fastd2 wird zur Zeit verwendet:
#/etc/sysctl.conf
net.core.rmem_max=83886080
net.core.wmem_max=83886080
net.core.rmem_default=83886080
net.core.wmem_default=83886080
 
Das System verfügt dadurch über 80MB Speicher für Queues. Per default stehen ebenfalls 80MB zur Verfügung. Die konfigurierten 80MB reichen aus, um die 100MBit/s Verbindung über mehrere Sekunden auszulasten und Lastspitzen abzufangen.
 
== Backbone Netz (tinc) ==
=== Installation ===
<pre>
<pre>
apt-get install tinc bridge-utils
apt-get install tinc bridge-utils make build-essential
</pre>
</pre>
Wir müssen bmx6 noch kompilieren:
mkdir /opt/freifunk/
cd $_
git clone git://qmp.cat/bmx6.git
alternative: https://github.com/axn/bmx6.git
cd bmx6
make
make install


=== Konfiguration ===
=== Konfiguration ===
<pre>
<pre>
mkdir /etc/tinc/backbone
mkdir /etc/tinc/tbmxbone
echo "backbone" >> /etc/tinc/nets.boot  # Dies sagt tinc, dass es das Netz "backbone" starten soll
echo "tbmxbone" >> /etc/tinc/nets.boot  # Dies sagt tinc, dass es das Netz "tbmxbone" starten soll
cd /etc/tinc/backbone
cd /etc/tinc/tbmxbone
# Public keys der anderen Teilnehmer:
# Public keys der anderen Teilnehmer:
git clone https://github.com/ff-kbu/bbkeys
git clone https://github.com/ff-kbu/tbmxbone hosts
ln -s bbkeys/ hosts
</pre>
</pre>


Jetzt fehlt noch des eigene Public/Private Keypaar. <br />
Jetzt fehlt noch des eigene Public/Private Keypaar. <br />
Die Keys sollten in /etc/tinc/backbone gespeichert werden.<br />
Die Keys sollten in /etc/tinc/tbmxbone gespeichert werden.<br />
Den Public-Key in den Namen des Supernodes umbenennen und nach bbkeys/ kopieren.
Den Public-Key in den Namen des Supernodes umbenennen und nach tinc/ kopieren.
<pre>
<pre>
tincd -K
tincd -K 4096 -n tbmxbone
cp rsa_key.pub bbkeys/[supernodename]
cp ./rsa_key.pub hosts/[Supernodename aus tinc Configfile]
</pre>
</pre>
Bevor jetzt der pub-key gepushed werden kann, muss tinc noch gesagt werden, welche Adressen über diesen Node zu routen sind. <br />
Also im .pub key:
<pre>
Subnet=172.27.255.X/32
Subnet=172.27.Y.0/21
Subnet=fdd3:5d16:b5dd:3::X/128
Subnet=2001:67c:20a0:b10Z::/64


-----BEGIN RSA PUBLIC KEY-----
</pre>
Und schliesslich:
Und schliesslich:
<pre>
<pre>
cd bbkeys; git push;
cd hosts
git add .
git commit
git push
cd ..
</pre>
</pre>
Wir müssen noch die Konfiguration von tinc in /etc/tinc/tbmxbone/tinc.conf schreiben.


==== tinc.conf ====
==== tinc.conf ====
<pre>
<pre>
cat > /etc/tinc/backbone/tinc.conf << EOF
Name=[Supernodenamen]
Name=[supernodename]
Device=/dev/net/tun
Device=/dev/net/tun
Mode=router
DirectOnly=yes
Compression=9
IndirectData=yes
ConnectTo=paula
Broadcast=direct
ConnectTo=paul
Cipher=AES-128-CBC
EOF
Mode=switch
PingInterval=60
PingTimeout=10
Compression=0
ConnectTo=gw06
ConnectTo=vpn1
</pre>
</pre>


==== tinc-up ====
==== tinc-up ====
Jetzt müssen wir noch ein Startskript namens ''/etc/tinc/tbmxbone/tinc-up'' erstellen:
'''Wichtig:''' in der datei muss wirklich $INTERFACE stehen. Tinc ersetzt dies automatisch durch das entsprechende interface bei ausführung.
'''Wichtig:''' in der datei muss wirklich $INTERFACE stehen. Tinc ersetzt dies automatisch durch das entsprechende interface bei ausführung.
Deine zugeteilten Adressen sind unter https://kbu.freifunk.net/wiki/index.php?title=IP_Subnetze zu finden.
<pre>
<pre>
cat > /etc/tinc/backbone/tinc-up << EOF
#!/bin/sh
#!/bin/sh
ifconfig \$INTERFACE 172.27.255.[Backbone IPv4 Adresse hier] netmask 255.255.255.0 up
/sbin/ip link set dev $INTERFACE up
# VPN Mesh Interface dem BMX6 Mesh hinzufügen
bmx6 dev=$INTERFACE
# Default tunneladressen dem tbmxbone zuweisen
bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Address=[BMX6ipv6Adresse]
# Feste Tunnel MTU von 1366 einstellen
bmx6 -c tunMtu=1366
# Lokales v4&v6 Netz announcen
bmx6 -c tunIn=localv4 /n=[DeinLokalesIPv4Netz] /b=100000000
bmx6 -c tunIn=localv6 /n=[DeinLokalesIPv6Netz] /b=100000000
# Defaultroute für v4 suchen
bmx6 -c tunOut=v4Default /network=0.0.0.0/0 /maxPrefixLen=3 /hysteresis=30 /tableRule=50000/200
# Gateway für v4 präferieren
#bmx6 -c tunOut=v4Defaultgw06 /network=0.0.0.0/0 /maxPrefixLen=0 /hysteresis=30 /tableRule=50000/200 /gwName=gw06 /rating=1000000
# Defaultroute für v6 suchen
bmx6 -c tunOut=v6Default /network=::/0 /maxPrefixLen=64 /hysteresis=30 /tableRule=50000/200
# Routen für lokale v4 und v6 Netze suchen
bmx6 -c tunOut=ffv4 /network=10.0.0.0/8 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200
 


ip route add 172.27.255.0/24 dev backbone table ffkbu
ip route add default dev backbone table ffkbu
ip -6 addr add fdd3:5d16:b5dd:3::X/64 dev \$INTERFACE
ip -6 addr add 2001:67c:20a0:b10Y::1/128 dev \$INTERFACE
ip -6 route add default via fdd3:5d16:b5dd:3::3
EOF
</pre>
</pre>


Auch diese Datei muss ausführbar gemacht werden:
Auch diese Datei muss ausführbar gemacht werden:
<pre>
<pre>
chmod +x /etc/tinc/backbone/tinc-up
chmod +x /etc/tinc/tbmxbone/tinc-up
</pre>
</pre>


Danach sollte der Ordner etwa so aussehen:
Danach sollte der Ordner etwa so aussehen:
<pre>
<pre>
$:/etc/tinc/backbone# ls  
$:/etc/tinc/tbmxbone# ls  
bbkeys
hosts
hosts -> bbkeys
rsa_key.priv
rsa_key.priv
rsa_key.pub
rsa_key.pub
Zeile 283: Zeile 331:
</pre>
</pre>


== Routing ==
== Installation (fastd) ==
 
Zuerst müssen wir bmx6 kompilieren:
apt-get install build-essential make fastd
mkdir /opt/freifunk/
cd /opt/freifunk/
git clone https://github.com/axn/bmx6.git
cd bmx6
make build_all # this reports some erros, go ahead anyway
make install
Nun bauen wir das FastdInterface:


we need to set up policy based routing.
mkdir /etc/fastd/fbmxbone
cd /etc/fastd/fbmxbone
nano fastd.conf


Inhalt der Konfigdatei (ihr müsst euch einen eigenen Key mit fastd --generate-key, wenn ihr nicht für andere erreichbar sein wollt, müsst ihr den Key euch auch nicht merken):
==== /etc/fastd/fbmxbone/fastd.conf ====
<pre>
<pre>
echo "200 ffkbu" >> /etc/iproute2/rt_tables
bind 0.0.0.0 port 10042;
 
drop capabilities yes;
forward no;
hide ip addresses yes;
hide mac addresses yes;
 
peer group "ffrl" {
  include peers from "ffrl";
  peer limit 1;
}
peer group "backbone" {
  include peers from "backbone";
  peer limit 1;
}
 
interface "fbmxbone";
 
log to syslog level warn;
 
method "salsa2012+umac";
mode tap;
mtu 1406;
 
on up sync "./on-up";
on verify async "true";
 
pmtu auto;
 
secret "PUT IN SIKRIT KEY IN HERE";
secure handshakes yes;
</pre>
</pre>
fastd-up und tinc-up erledigen den rest: <br />


ip rule ls
Jetzt clonen wir aus dem Git-Repo die PublicKeys der Knoten:
cd /opt/freifunk/
git clone https://github.com/ff-kbu/fbmxbone
Und kopieren diese noch per Hand in die einzelnen Keyverzeichnisse (verbessern):
mkdir ffrl
mkdir backbone
cp fbmxbone/* backbone/
mv backbone/gw06 ffrl/
Und brauchen noch ein on-up Skript (/etc/fastd/fbmxbone/on-up):
#!/bin/sh
/sbin/ip link set dev fbmxbone address [MAC ADDY AUSDENKEN]
/sbin/ip link set dev fbmxbone up
bmx6 dev=fbmxbone
bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Address=[BMX6ipv6Adresse]
bmx6 -c tunIn=localv4 /n=[DeinLokalesIPv4Netz] /b=100000000
bmx6 -c tunIn=localv6 /n=[DeinLokalesIPv6Netz] /b=100000000
bmx6 -c tunOut=v4Default /network=0.0.0.0/0 /maxPrefixLen=3 /hysteresis=30 /tableRule=50000/200
#bmx6 -c tunOut=v4Defaultgw06 /network=0.0.0.0/0 /maxPrefixLen=0 /hysteresis=30 /tableRule=50000/200 /gwName=gw06 /rating=1000000
bmx6 -c tunOut=v6Default /network=::/0 /maxPrefixLen=64 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv4 /network=10.0.0.0/8 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200
Und mittlerweile klar, ausführbar machen:
chmod +x /etc/fastd/fbmxbone/on-up
 
== Routing ==
 
Wir brauchen policy based routing:
 
 
<pre>
<pre>
ip rule ls
echo "200 freifunk" >> /etc/iproute2/rt_tables
0:      from all lookup local
32765:  from 172.27.0.0/18 lookup ffkbu
32766:  from all lookup main
32767:  from all lookup default
</pre>
</pre>


ip route list table ffkbu
fastd's on-up, /etc/network/interfaces.d/bat0 und/oder tinc-up erledigen den Rest. <br />
<pre>
ip route list table ffkbu
default dev backbone  scope link
172.27.0.0/18 dev bat0 scope link
172.27.255.0/24 dev backbone  scope link
</pre>


== IPv4 DHCP ==
== IPv4 DHCP ==
Zeile 316: Zeile 426:


=== Konfiguration ===
=== Konfiguration ===
Nun ändern wir die Konfiguration in /etc/dhcp/dhcpd.conf:
<pre>
<pre>
cat > /etc/dhcp/dhcpd.conf << EOF
option domain-name "mesh.kbu.freifunk.net";
option domain-name "mesh.kbu.freifunk.net";
option domain-name-servers 85.214.20.141, 213.73.91.35;
option domain-name-servers [Supernode IPv4], [INSERT YOUR PREFERRED IPV4 DNS], 213.73.91.35;


default-lease-time 60;
default-lease-time 150;
max-lease-time 720;
max-lease-time 720;
authoritative;


log-facility local7;


subnet 172.27.0.0 netmask 255.255.192.0 {
subnet 10.X.X.X netmask Y.Y.Y.Y { # Die Range der Hood
range 172.27.X.10 172.27.Y.255;
range 10.X.Y.10 10.X.Z.254; # Eure IPv4 Range
option routers 172.27.X.1;
option routers [Supernode IP Adresse];
}
}
EOF
</pre>
</pre>


Zeile 340: Zeile 448:
</pre>
</pre>


=== Konfiguration ===
=== Konfiguration /etc/radvd.conf ===
<pre>
<pre>
cat > /etc/radvd.conf << EOF
interface bat0
interface bat0 {
 
AdvSendAdvert on;
{
AdvHomeAgentFlag off;
AdvSendAdvert on;
MinRtrAdvInterval 10;
MaxRtrAdvInterval 200;
MaxRtrAdvInterval 30;
prefix [GlobaleIPv6Range des Supernodes] {
AdvOtherConfigFlag on;
};
AdvSourceLLAddress off;
RDNSS [ULA IPv6 address of Supernode, your preferred ipv6 DNS-Server] {
AdvLinkMTU 1350; #1442 - fastd - batman-adv - See wiki for details
};  
prefix 2001:67c:20a0:b10Y::/64 {
prefix [ULA IPv6 range der Supernode (z.B. fdd3::/64)] {
AdvOnLink on;
  };
AdvAutonomous on;
 
AdvRouterAddr on;
};
prefix fdd3:5d16:b5dd::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
};
};
EOF
</pre>


/etc/init.d/radvd start
== UDP-Queue Größe ==
Durch Broadcasts können können auf Supernodes kurzzeitig hohe Lastspitzen enstehen. In der aktuellen batman-adv-Version wird jedes Broadcast-Paket zudem 3x auf jedem Link versendet.
Die vergleichweise hohe Datenrate von 100MBit/s zwischen Supernodes bewirkt darüber hinaus, dass broadcast-Pakete mit 100MBit/s eingehen können, während sie gleichzeitig an alle Nodes gesendet werden müssen.
 
Linux-Distributionen sehen per Default Queue-Größen im Bereich von 128 KB vor (http://www.cyberciti.biz/faq/linux-tcp-tuning/). Supernodes sind somit nicht in der Lage entsprechende Lastspitzen zu puffern und während Idle-Times zu versenden. Läuft die UDP-Queue über, so loggt fastd:
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
Jeder Log-Eintrag entspricht einem Paket, dass nicht enqueued werden konnte und damit verworfen wurde. Die Queue-Größen können via systctl angepasst werden (http://wwwx.cs.unc.edu/~sparkst/howto/network_tuning.php). Auf fastd2 wird zur Zeit verwendet:
#/etc/sysctl.conf
net.core.rmem_max=83886080
net.core.wmem_max=83886080
net.core.rmem_default=83886080
net.core.wmem_default=83886080
 
Das System verfügt dadurch über 80MB Speicher für Queues. Per default stehen ebenfalls 80MB zur Verfügung. Die konfigurierten 80MB reichen aus, um die 100MBit/s Verbindung über mehrere Sekunden auszulasten und Lastspitzen abzufangen.
 
[[Kategorie:Netz-und-Technik]]
 
== DNS-"Server" ==
Supernodes betreiben Caching-DNS-Forwarder. Hierzu wird unbound verwendet
 
== Installation ==
apt install unbound
 
== Adressen ==
Das Setup unterscheidet zwischen v4 und v6.
 
== /etc/unbound/unbound.conf ==
 
server:
# you might have to remove the auto-trust-anchor-file option if defined elsewhere
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
        interface: [ULA ipv6 des supernodes]
        access-control: [public ipv6 Range KBU]  allow
        access-control: [ULA ipv6 Range KBU] allow
        interface: [ipv4 des Supernodes]
        access-control: [IPv4 Range KBU] allow
        verbosity: 1
  forward-zone:
      name: "."
      forward-addr: [your Favorite v4 DNS IP], [anotherone]
      forward-addr: [your Favorite v6 DNS IP], [anotherone]
 
== DHCP Client Leases in eine RAMdisk flüchtig speichern ==
<pre>
echo "tmpfs /var/lib/dhcp/ tmpfs defaults,size=10% 0 0" >> /etc/fstab
</pre>
</pre>


=fastd-service=
== Logrotate auf die letzte Stunde umstellen ==
Achtung, Pfade und Hostnamen anpassen. Das ist hier exemplarisch
 
apt-get install apache2 ruby-sinatra libapache2-mod-passenger sudo psmisc git
Mehr braucht es nicht im Betrieb
mkdir -p /srv/www/fastd1.ffm.freifunk.net
cd /srv/www/fastd1.ffm.freifunk.net
git clone https://github.com/freifunk-ffm/fastd-service.git


Hierzu in /etc/logrotate.conf folgendes ändern:
"weekly" in "hourly" ändern
"rotate 4" in "rotate 0" ändern
=== cronJob hinzufügen ===
mit crontab -e Editor aufrufen und folgende Zeile hinzufügen:
* */1 * * * nice -n 20 logrotate /etc/logrotate.conf >/dev/null 2>&1
== Preinstall ==
apt install uml-utilities
== Interfaces in /etc/network/interfaces.d/bat0 definieren ==
<pre>
<pre>
rm /etc/apache2/sites-enabled/000-default
auto bat0
cat >> /etc/apache2/sites-enabled/000-fastd1.conf <<EOF
iface bat0 inet static
<VirtualHost *:80>
  hwaddress ether [noch eine MACADRESSE AUSDENKEN]
      ServerAdmin info@EMAIL
  address [ipv4 des Supernodes]
      DocumentRoot /srv/www/fastd1.ffm.freifunk.net/fastd-service/public
  netmask [Netzmaske der Hood]
      <Directory /srv/www/fastd1.ffm.freifunk.net/fastd-service/public>
  pre-up  modprobe batman-adv && tunctl -t mesh-vpn && batctl if add mesh-vpn
          Allow from all
  post-up ip rule add iif bat0 table freifunk
          Options -MultiViews
  pre-down ip rule del iif bat0 table freifunk
      </Directory>
 
      ErrorLog /srv/www/fastd1.ffm.freifunk.net/logs/error.log
iface bat0 inet6 static
      CustomLog /srv/www/fastd1.ffm.freifunk.net/logs/access.log combined
  address [GLOBAL IPv6 des Supernodes]
</VirtualHost>
  netmask 64
EOF
  # Routes
  # Note: route del not needed - shutting down the interfaces removes routes anyway
  post-up ip -6 addr add fdd3:5d16:b5dd:1016::1/64 dev bat0
  post-up ip -6 route add fdd3:5d16:b5dd:1016::/64 dev bat0
  post-up ip -6 route add fdd3:5d16:b5dd:1016::/64 dev bat0 table freifunk
  post-up ip -6 route add [IPv6 Range der Supernode] dev bat0
  post-up ip -6 route add [IPv6 Range der Supernode] dev bat0 table freifunk
 
  # Rules (iif: routed traffic, from: traffic from the supernode)
  post-up ip -6 rule add iif bat0 table freifunk
  post-up ip -6 rule add from [GLOBAL IPv6 Range des Exits] table freifunk
  pre-down ip -6 rule del iif bat0 table freifunk
  pre-down ip -6 rule del from [GLOBAL IPv6 Range des Exits] table freifunk
</pre>
</pre>


Anpassung der conf.yml:
== IP-Tables Firewall ==
register_url: http://USER:PASSWORT@register.bb.ffm.freifunk.net
crash_dump_path: /var/log/ath9k-crash
fastd_peer_dir: /etc/fastd/mesh-vpn/peers
fastd_reload_cmd: sudo ./fastd_hup


gem install netaddr json sinatra sinatra-contrib rack rails rake
Hier wollen wir nur die schlimmsten Routingfuckups verhindern, es soll nichts über z.B. eth0 rausgeforwardet werden können.
chown -R www-data /srv/www/fastd1.ffm.freifunk.net
=== Installation ===
 
  apt install iptables-persistent
per visudo die folgende Zeile hinzufügen (Pfad anpassen)
  www-data ALL = NOPASSWD: /srv/www/fastd1.ffm.freifunk.net/fastd-service/fastd_hup


Anmerkung:
=== Inhalt /etc/iptables/rules.v4 ===
Es kann sein, dass man in fastd_service.rb folgende Zeile auskommentieren muss:
-A FORWARD -i bat+ -o bmx+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
  register Sinatra::MultiRoute
  -A FORWARD -i bmx+ -o bat+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu


=[[Anycast_DNS]]=
=== Inhalt /etc/iptables/rules.v6 ===
{{:Anycast_DNS}}

Aktuelle Version vom 9. Oktober 2022, 03:41 Uhr

Baustelle.png Diese Seite ist noch unvollständig. Bitte hilf uns sie zu erweitern.
Wenn Du das Recht hast diese Seite zu ändern,
kannst Du hier klicken. Danke!
Siehe auch: Mithelfen im Wiki

Hinweis: Bei Fragen oder Problemen wende Dich bitte an die Mailingliste. Die Anleitung hier wurde von vielen Leuten geschrieben - es hilft in der Regel nur wenig, wenn Du jemanden persönlich per E-Mail kontaktierst.

Voraussetzungen

[wikipedia-article]

Benötigte Software

1) [fastd] Mesh-vpn

2) [bmx6] BackboneMeshProtokoll

3) [batman-adv] ClientMeshProtokoll

4) [tinc] Mesh-vpn

5) OS: debian jessie(or whatever you like)

Du benötigst ausserdem:

  • eine private IPv4/IPv6 Adresse und ein Subnetz für die Clients
  • eine IPv4/IPv6 Adresse für das Backbone-Netz

Diese kannst du unter dem Artikel IP_Subnetze selbst zuteilen, oder nachlesen, welches deine sind, wenn es jemand anderes dir schon zuteilte.

(nur bei öffentlichen Supernodes)

Vorbereitungen

In der /etc/sysctl.conf muss folgendes mit einem Editor hinzugefügt werden:

net.ipv4.ip_forward=1
net.ipv4.ip_no_pmtu_disc=1
net.ipv4.route.flush=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_ra=0
# If Supernode running on USB Stick/FlashCard with low memory, this option prevents swapping until it is definitely needed
vm.swappiness=1 

Danach die /etc/sysctl.conf neu einlesen:

sysctl -p

Für Batman-adv und fastd-Pakete in /etc/apt/apt/sources.list hinzufügen, z.B. so:

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

GPG-Key importieren und apt via https ermöglichen:

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

 apt-get install apt-transport-https

 apt-get update

Batman-adv (compat14 (Hood Bonn))

Installation

Dies sollte auf debian wheezy batman-adv 2013.4.0 installieren.

apt-get install batman-adv-dkms
echo "batman-adv" >> /etc/modules

debian jessie

batman 14 aus folgender quelle installieren:

http://repo.universe-factory.net/debian/ sid main

dann dkms die richtige version beibringen:

dkms remove batman-adv/2013.4.0 --all
dkms --force install batman-adv/2013.4.0

und mit apt-pinning die richtige version für batctl erzwingen, in /etc/apt/preferences.d/batctl.pref:

Package: batctl
Pin: origin repo.universe-factory.net
Pin-Priority: 1000

und apt-get install batctl

Batman-adv (compat15)

Installation

Update and install:

apt-get update
apt-get install git make gcc build-essential linux-headers-$(uname -r) pkg-config libgps-dev libnl-3-dev libjansson-dev fastd libnl-genl-3-dev

Install Batman, batctl and alfred

mkdir /opt/freifunk
cd $_

git clone git://git.open-mesh.org/batman-adv.git
cd batman-adv
git checkout v2016.3
make
make install

cd ../

git clone http://git.open-mesh.org/batctl.git
cd batctl
git checkout v2016.3
make
make install

Wird künftig nicht mehr benötigt. Wer's trotzdem installieren mag:

cd ../

git clone http://git.open-mesh.org/alfred.git
cd alfred
git checkout v2014.4.0
make 
make install

fastd

Installation

 apt-get install fastd curl

Add Directories

mkdir /etc/fastd/mesh-vpn
mkdir /etc/fastd/mesh-vpn/backbone

Konfiguration

"[YOUR SECRET KEY HERE]" sollte dabei durch den fastd-secret-key ersetzt werden. Den Key müsst ihr selbst erstellen. Dies geht mit dem Befehl:

fastd --generate-key

Schreibt am besten euch public und private key woanders noch auf. Wenn ihr den verliert, können Nodes nicht mehr mit euch connecten, solange diese nicht umkonfiguriert werden.

In /etc/fastd/mesh-vpn/fastd.conf folgendes hinzufügen:

/etc/fastd/mesh-vpn/fastd.conf

# Log warnings and errors to stderr
#log level warn;
log level error;

drop capabilities yes;
forward no;
hide ip addresses yes;
hide mac addresses yes;

# Log everything to a log file
#log to "/var/log/fastd-mesh-vpn.log" level debug;
#log to "/var/log/fastd-mesh-vpn.log" level warn;

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

# Support xsalsa20 and aes128 encryption methods, prefer xsalsa20
method "salsa2012+umac";

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

mtu 1312;
pmtu auto;
secure handshakes yes;

# Secret key generated by 'fastd --generate-key'
secret "[YOUR SECRET KEY HERE]";


# Include peers from the directory 'peers' and set max connections

peer group "backbone" {
  include peers from "backbone";
  peer limit 64;
}


on up sync "./on-up";

# Allows all peers to connect.
on verify async "true";

Optional: Wenn die Node teil einer grösseren Hood werden soll, entsprechende Backbone Node Keys in das Verzeichnis /etc/fastd/mesh-vpn/backbone legen. Vorzuziehen ist aber entweder eine eigene Fastdinstanz oder eine Tinc VPN Verbindung (AES-NI) um sich an eine hood (Layer2 Mesh mit Batman-adv) zu verbinden, dies ist performanter.

Der IP v4-Range bezieht sich auf euren selbst gewählten Bereich, welcher unter https://pad.freifunk.net/p/kbuip dokumentiert ist.

/etc/fastd/mesh-vpn/on-up

#!/bin/sh
/sbin/ip link set dev mesh-vpn address [MacAdresseAusdenken]
/sbin/ip link set dev mesh-vpn up

batctl if add mesh-vpn
batctl it 10000
batctl bl 1
batctl gw_mode server 200MBit/200MBit # anpassen

/sbin/ip rule show | grep 'from 10.0.0.0/8 lookup freifunk'
if [ $? -eq 1 ]; then
  /sbin/ip rule add from 10.0.0.0/8 table freifunk
fi
/sbin/ip route add [lokaleIPv4Range[Ex:10.123.234.0/24]] dev bat0 table freifunk
/sbin/ip route flush cache


on-up ausführbar machen:

chmod +x /etc/fastd/mesh-vpn/on-up

BmxBone Netz

Jetzt müsst ihr euch entscheiden, welches VPN Programm ihr für das BmxBone nutzen wollt:

  • wenn ihr eine CPU mit AES-NI habt, oder eine CPU mit deutlich mehr als 1GHz nehmt tinc
  • wenn ihr eine langsame CPU sub 1GHz oder sogar eine ARM CPU, sollte fastd besser sein

Installation mit tinc

apt-get install tinc bridge-utils make build-essential

Wir müssen bmx6 noch kompilieren:

mkdir /opt/freifunk/
cd $_
git clone git://qmp.cat/bmx6.git
alternative: https://github.com/axn/bmx6.git
cd bmx6
make
make install

Konfiguration

mkdir /etc/tinc/tbmxbone
echo "tbmxbone" >> /etc/tinc/nets.boot  # Dies sagt tinc, dass es das Netz "tbmxbone" starten soll
cd /etc/tinc/tbmxbone
# Public keys der anderen Teilnehmer:
git clone https://github.com/ff-kbu/tbmxbone hosts

Jetzt fehlt noch des eigene Public/Private Keypaar.
Die Keys sollten in /etc/tinc/tbmxbone gespeichert werden.
Den Public-Key in den Namen des Supernodes umbenennen und nach tinc/ kopieren.

tincd -K 4096 -n tbmxbone
cp ./rsa_key.pub hosts/[Supernodename aus tinc Configfile]

Und schliesslich:

cd hosts
git add .
git commit
git push
cd ..

Wir müssen noch die Konfiguration von tinc in /etc/tinc/tbmxbone/tinc.conf schreiben.

tinc.conf

Name=[Supernodenamen]
Device=/dev/net/tun
DirectOnly=yes 
IndirectData=yes 
Broadcast=direct
Cipher=AES-128-CBC
Mode=switch
PingInterval=60
PingTimeout=10
Compression=0 
ConnectTo=gw06
ConnectTo=vpn1

tinc-up

Jetzt müssen wir noch ein Startskript namens /etc/tinc/tbmxbone/tinc-up erstellen: Wichtig: in der datei muss wirklich $INTERFACE stehen. Tinc ersetzt dies automatisch durch das entsprechende interface bei ausführung.

Deine zugeteilten Adressen sind unter https://kbu.freifunk.net/wiki/index.php?title=IP_Subnetze zu finden.

#!/bin/sh
/sbin/ip link set dev $INTERFACE up
# VPN Mesh Interface dem BMX6 Mesh hinzufügen
bmx6 dev=$INTERFACE 
# Default tunneladressen dem tbmxbone zuweisen
bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Address=[BMX6ipv6Adresse] 
# Feste Tunnel MTU von 1366 einstellen
bmx6 -c tunMtu=1366
# Lokales v4&v6 Netz announcen
bmx6 -c tunIn=localv4 /n=[DeinLokalesIPv4Netz] /b=100000000
bmx6 -c tunIn=localv6 /n=[DeinLokalesIPv6Netz] /b=100000000
# Defaultroute für v4 suchen
bmx6 -c tunOut=v4Default /network=0.0.0.0/0 /maxPrefixLen=3 /hysteresis=30 /tableRule=50000/200 
# Gateway für v4 präferieren
#bmx6 -c tunOut=v4Defaultgw06 /network=0.0.0.0/0 /maxPrefixLen=0 /hysteresis=30 /tableRule=50000/200 /gwName=gw06 /rating=1000000
# Defaultroute für v6 suchen
bmx6 -c tunOut=v6Default /network=::/0 /maxPrefixLen=64 /hysteresis=30 /tableRule=50000/200
# Routen für lokale v4 und v6 Netze suchen
bmx6 -c tunOut=ffv4 /network=10.0.0.0/8 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200


Auch diese Datei muss ausführbar gemacht werden:

chmod +x /etc/tinc/tbmxbone/tinc-up

Danach sollte der Ordner etwa so aussehen:

$:/etc/tinc/tbmxbone# ls 
hosts
rsa_key.priv
rsa_key.pub
tinc.conf
tinc-up

Installation (fastd)

Zuerst müssen wir bmx6 kompilieren:

apt-get install build-essential make fastd
mkdir /opt/freifunk/
cd /opt/freifunk/
git clone https://github.com/axn/bmx6.git
cd bmx6
make build_all # this reports some erros, go ahead anyway
make install

Nun bauen wir das FastdInterface:

mkdir /etc/fastd/fbmxbone
cd /etc/fastd/fbmxbone
nano fastd.conf

Inhalt der Konfigdatei (ihr müsst euch einen eigenen Key mit fastd --generate-key, wenn ihr nicht für andere erreichbar sein wollt, müsst ihr den Key euch auch nicht merken):

/etc/fastd/fbmxbone/fastd.conf

bind 0.0.0.0 port 10042;

drop capabilities yes;
forward no;
hide ip addresses yes;
hide mac addresses yes;

peer group "ffrl" {
  include peers from "ffrl";
  peer limit 1;
}
peer group "backbone" {
  include peers from "backbone";
  peer limit 1;
}

interface "fbmxbone";

log to syslog level warn;

method "salsa2012+umac";
mode tap;
mtu 1406;

on up sync "./on-up";
on verify async "true";

pmtu auto;

secret "PUT IN SIKRIT KEY IN HERE";
secure handshakes yes;

Jetzt clonen wir aus dem Git-Repo die PublicKeys der Knoten:

cd /opt/freifunk/
git clone https://github.com/ff-kbu/fbmxbone

Und kopieren diese noch per Hand in die einzelnen Keyverzeichnisse (verbessern):

mkdir ffrl
mkdir backbone
cp fbmxbone/* backbone/
mv backbone/gw06 ffrl/

Und brauchen noch ein on-up Skript (/etc/fastd/fbmxbone/on-up):

#!/bin/sh
/sbin/ip link set dev fbmxbone address [MAC ADDY AUSDENKEN]
/sbin/ip link set dev fbmxbone up
bmx6 dev=fbmxbone
bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Address=[BMX6ipv6Adresse]
bmx6 -c tunIn=localv4 /n=[DeinLokalesIPv4Netz] /b=100000000
bmx6 -c tunIn=localv6 /n=[DeinLokalesIPv6Netz] /b=100000000
bmx6 -c tunOut=v4Default /network=0.0.0.0/0 /maxPrefixLen=3 /hysteresis=30 /tableRule=50000/200 
#bmx6 -c tunOut=v4Defaultgw06 /network=0.0.0.0/0 /maxPrefixLen=0 /hysteresis=30 /tableRule=50000/200 /gwName=gw06 /rating=1000000
bmx6 -c tunOut=v6Default /network=::/0 /maxPrefixLen=64 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv4 /network=10.0.0.0/8 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200

Und mittlerweile klar, ausführbar machen:

chmod +x /etc/fastd/fbmxbone/on-up

Routing

Wir brauchen policy based routing:


echo "200 freifunk" >> /etc/iproute2/rt_tables

fastd's on-up, /etc/network/interfaces.d/bat0 und/oder tinc-up erledigen den Rest.

IPv4 DHCP

Installation

apt-get install isc-dhcp-server

Konfiguration

Nun ändern wir die Konfiguration in /etc/dhcp/dhcpd.conf:

option domain-name "mesh.kbu.freifunk.net";
option domain-name-servers [Supernode IPv4], [INSERT YOUR PREFERRED IPV4 DNS], 213.73.91.35;

default-lease-time 150;
max-lease-time 720;
authoritative;


subnet 10.X.X.X netmask Y.Y.Y.Y { # Die Range der Hood
	range 10.X.Y.10 10.X.Z.254; # Eure IPv4 Range
	option routers [Supernode IP Adresse];
}

IPv6

Installation

apt-get install radvd

Konfiguration /etc/radvd.conf

interface bat0

{
 AdvSendAdvert on;
 MaxRtrAdvInterval 200;
 prefix [GlobaleIPv6Range des Supernodes] {
 };
 RDNSS [ULA IPv6 address of Supernode, your preferred ipv6 DNS-Server] {
 }; 
 prefix [ULA IPv6 range der Supernode (z.B. fdd3::/64)] {
  };

};

UDP-Queue Größe

Durch Broadcasts können können auf Supernodes kurzzeitig hohe Lastspitzen enstehen. In der aktuellen batman-adv-Version wird jedes Broadcast-Paket zudem 3x auf jedem Link versendet. Die vergleichweise hohe Datenrate von 100MBit/s zwischen Supernodes bewirkt darüber hinaus, dass broadcast-Pakete mit 100MBit/s eingehen können, während sie gleichzeitig an alle Nodes gesendet werden müssen.

Linux-Distributionen sehen per Default Queue-Größen im Bereich von 128 KB vor (http://www.cyberciti.biz/faq/linux-tcp-tuning/). Supernodes sind somit nicht in der Lage entsprechende Lastspitzen zu puffern und während Idle-Times zu versenden. Läuft die UDP-Queue über, so loggt fastd:

2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable
2013-03-30 12:32:01 +0100 --- Warning: sendmsg: Resource temporarily unavailable

Jeder Log-Eintrag entspricht einem Paket, dass nicht enqueued werden konnte und damit verworfen wurde. Die Queue-Größen können via systctl angepasst werden (http://wwwx.cs.unc.edu/~sparkst/howto/network_tuning.php). Auf fastd2 wird zur Zeit verwendet:

#/etc/sysctl.conf
net.core.rmem_max=83886080
net.core.wmem_max=83886080
net.core.rmem_default=83886080
net.core.wmem_default=83886080

Das System verfügt dadurch über 80MB Speicher für Queues. Per default stehen ebenfalls 80MB zur Verfügung. Die konfigurierten 80MB reichen aus, um die 100MBit/s Verbindung über mehrere Sekunden auszulasten und Lastspitzen abzufangen.

DNS-"Server"

Supernodes betreiben Caching-DNS-Forwarder. Hierzu wird unbound verwendet

Installation

apt install unbound

Adressen

Das Setup unterscheidet zwischen v4 und v6.

/etc/unbound/unbound.conf

server:
# you might have to remove the auto-trust-anchor-file option if defined elsewhere
       auto-trust-anchor-file: "/var/lib/unbound/root.key"
       interface: [ULA ipv6 des supernodes]
       access-control: [public ipv6 Range KBU]  allow
       access-control: [ULA ipv6 Range KBU] allow
       interface: [ipv4 des Supernodes]
       access-control: [IPv4 Range KBU] allow
       verbosity: 1
 forward-zone:
     name: "."
     forward-addr: [your Favorite v4 DNS IP], [anotherone]
     forward-addr: [your Favorite v6 DNS IP], [anotherone]

DHCP Client Leases in eine RAMdisk flüchtig speichern

echo "tmpfs /var/lib/dhcp/ tmpfs defaults,size=10% 0 0" >> /etc/fstab

Logrotate auf die letzte Stunde umstellen

Mehr braucht es nicht im Betrieb

Hierzu in /etc/logrotate.conf folgendes ändern:

"weekly" in "hourly" ändern
"rotate 4" in "rotate 0" ändern

cronJob hinzufügen

mit crontab -e Editor aufrufen und folgende Zeile hinzufügen:

* */1 * * * nice -n 20 logrotate /etc/logrotate.conf >/dev/null 2>&1

Preinstall

apt install uml-utilities

Interfaces in /etc/network/interfaces.d/bat0 definieren

auto bat0
iface bat0 inet static
  hwaddress ether [noch eine MACADRESSE AUSDENKEN]
  address [ipv4 des Supernodes]
  netmask [Netzmaske der Hood]
  pre-up  modprobe batman-adv && tunctl -t mesh-vpn && batctl if add mesh-vpn
  post-up ip rule add iif bat0 table freifunk
  pre-down ip rule del iif bat0 table freifunk

iface bat0 inet6 static
  address [GLOBAL IPv6 des Supernodes]
  netmask 64
  # Routes
  # Note: route del not needed - shutting down the interfaces removes routes anyway
  post-up ip -6 addr add fdd3:5d16:b5dd:1016::1/64 dev bat0
  post-up ip -6 route add fdd3:5d16:b5dd:1016::/64 dev bat0
  post-up ip -6 route add fdd3:5d16:b5dd:1016::/64 dev bat0 table freifunk
  post-up ip -6 route add [IPv6 Range der Supernode] dev bat0
  post-up ip -6 route add [IPv6 Range der Supernode] dev bat0 table freifunk

  # Rules (iif: routed traffic, from: traffic from the supernode)
  post-up ip -6 rule add iif bat0 table freifunk
  post-up ip -6 rule add from [GLOBAL IPv6 Range des Exits] table freifunk
  pre-down ip -6 rule del iif bat0 table freifunk
  pre-down ip -6 rule del from [GLOBAL IPv6 Range des Exits] table freifunk

IP-Tables Firewall

Hier wollen wir nur die schlimmsten Routingfuckups verhindern, es soll nichts über z.B. eth0 rausgeforwardet werden können.

Installation

apt install iptables-persistent

Inhalt /etc/iptables/rules.v4

-A FORWARD -i bat+ -o bmx+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -i bmx+ -o bat+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Inhalt /etc/iptables/rules.v6