Supernode: Unterschied zwischen den Versionen
Yanosz (Diskussion | Beiträge) K (Doch kein Archiv) |
(Kategorisiert) |
||
Zeile 1: | Zeile 1: | ||
{{TOCright}} | {{TOCright}} | ||
[[Kategorie:Infrastruktur]] | [[Kategorie:Infrastruktur]] | ||
[[Kategorie:Anleitungen]] | |||
{{Mithilfe}} | {{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. | <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. |
Aktuelle Version vom 9. Oktober 2022, 02:41 Uhr
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
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