Supernode
Voraussetzungen
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 Netze 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
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
Install Batman, batctl and alfred
mkdir /opt/freifunk cd $_ git clone git://git.open-mesh.org/batman-adv.git cd batman-adv git checkout v2015.1 make make install cd ../ git clone http://git.open-mesh.org/batctl.git cd batctl git checkout v2015.1 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/peers
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";
Ordnerstruktur anlegen:
mkdir /etc/fastd/mesh-vpn/backbone
Optional: Wenn die Node teil einer grösseren Hood werden soll, entsprechende Backbone Node Keys in das zueben erstellte Verzeichnis 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 [deinelokaleIPv4Range] 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:
git clone https://github.com/axn/bmx6 cd bmx6 make build_all 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://gitlab.kbu.freifunk.net/bmxbone/tinc.git 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 keys git add [yourkey] 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 # tinc soll nicht Daten selbst weiterleiten IndirectData=yes Broadcast=direct Cipher=AES-128-CBC # nutzt AES-NI und performed deswegen besser als fastd 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.
Die lokalen Adressen entnehmen wir wieder aus der gewählten Range unter https://pad.freifunk.net/p/kbuip
#!/bin/sh bmx6 dev=$INTERFACE # VPN Mesh Interface dem BMX6 Mesh hinzufügen # Default tunneladressen dem tbmxbone zuweisen bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Adress=[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.0.0.0/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/backbone/tinc-up
Danach sollte der Ordner etwa so aussehen:
$:/etc/tinc/tbmxbone# ls tinc hosts -> tinc 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
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:
git clone https://gitlab.kbu.freifunk.net/bmxbone/fastd
Und kopieren diese noch per Hand in die einzelnen Keyverzeichnisse (verbessern):
mkdir ffrl mkdir backbone cp fastd/* 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 backboneup bmx6 dev=fbmxbone bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Adress=[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.0.0.0/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 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; subnet 10.X.X.X netmask Y.Y.Y.Y { # Die Range der Hood range 10.X.Y.10 10.X.Z.255; # Eure IPv4 Range option routers [Supernode IP Adresse]; }
IPv6
Installation
apt-get install radvd
Konfiguration
interface bat0 IgnoreIfMissing yes { AdvSendAdvert on; MaxRtrAdvInterval 200; prefix [GlobaleIPv6Range des Supernodes] { }; RDNSS [ULA IPv6 of Supernode], [your preferred ipv6 DNS-Server] { }; prefix [ULA IPv6Range der Supernode (fd00::/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: auto-trust-anchor-file: "/var/lib/unbound/root.key" interface: [ULA ipv6 des supernodes] access-control: [public ipv6 Range des Supernodes] allow access-control: [ULA ipv6 Range des Supernodes] allow interface: [ipv4 des Supernodes] access-control: [IPv4 Range der Hood] allow verbosity: 1 forward-zone: name: "." forward-addr: [your Favorite v4 DNS IP] forward-addr: [your Favorite v6 DNS IP]
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
Interfaces in /etc/network/interfaces.d/bat0 definieren
auto bat0 iface bat0 inet static hwaddress ether [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 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 freifunkIP-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-persistentInhalt /etc/iptables/rules.v4
Inhalt /etc/iptables/rules.v6