Supernode: Unterschied zwischen den Versionen

Aus Freifunk Köln, Bonn und Umgebung
Zur Navigation springen Zur Suche springen
(Kategorisiert)
 
(98 dazwischenliegende Versionen von 11 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{TOCright}}
{{TOCright}}
[[Kategorie:Infrastruktur]]
[[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 22: Zeile 25:
* eine IPv4/IPv6 Adresse für das Backbone-Netz
* 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.
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)
(nur bei öffentlichen Supernodes)
== Vorbereitungen ==
== Vorbereitungen ==
In der /etc/sysctl.conf muss folgendes mit einem Editor hinzugefügt werden:
In der /etc/sysctl.conf muss folgendes mit einem Editor hinzugefügt werden:
Zeile 34: 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
# 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 46: Zeile 52:
</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>
Zeile 84: Zeile 93:
Update and install:
Update and install:
  apt-get update
  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
  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
Install Batman, batctl and alfred
Zeile 92: Zeile 101:
  git clone git://git.open-mesh.org/batman-adv.git
  git clone git://git.open-mesh.org/batman-adv.git
  cd batman-adv
  cd batman-adv
  git checkout v2015.1
  git checkout v2016.3
  make
  make
  make install
  make install
Zeile 100: Zeile 109:
  git clone http://git.open-mesh.org/batctl.git
  git clone http://git.open-mesh.org/batctl.git
  cd batctl
  cd batctl
  git checkout v2015.1
  git checkout v2016.3
  make
  make
  make install
  make install
   
   
Wird künftig nicht mehr benötigt. Wer's trotzdem installieren mag:
  cd ../
  cd ../
   
   
Zeile 118: Zeile 130:
  apt-get install fastd curl
  apt-get install fastd curl
</pre>
</pre>
'''Add Directories'''
mkdir /etc/fastd/mesh-vpn
mkdir /etc/fastd/mesh-vpn/backbone


=== Konfiguration ===
=== Konfiguration ===
Zeile 144: Zeile 160:
# 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";
mode tap;


# Support xsalsa20 and aes128 encryption methods, prefer xsalsa20
# Support xsalsa20 and aes128 encryption methods, prefer xsalsa20
Zeile 177: Zeile 193:
on verify async "true";
on verify async "true";
</pre>
</pre>
Ordnerstruktur anlegen:
<pre>
mkdir /etc/fastd/mesh-vpn/backbone
</pre>
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.


==== on-up ====
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 ====
<pre>
<pre>
#/bin/sh
#!/bin/sh
/sbin/ip link set dev mesh-vpn address [MacAdresseAusdenken]
/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
batctl if add mesh-vpn
/usr/sbin/batctl it 10000
batctl it 10000
/usr/sbin/batctl bl 1
batctl bl 1
/usr/sbin/batctl gw_mode server 200MBit/200MBit # anpassen
batctl gw_mode server 200MBit/200MBit # anpassen


/sbin/ip rule show | grep 'from 10.0.0.0/8 lookup freifunk'
/sbin/ip rule show | grep 'from 10.0.0.0/8 lookup freifunk'
Zeile 198: Zeile 213:
   /sbin/ip rule add from 10.0.0.0/8 table freifunk
   /sbin/ip rule add from 10.0.0.0/8 table freifunk
fi
fi
/sbin/ip route add [deinelokaleIPv4Range] dev bat0 table freifunk
/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


Zeile 219: Zeile 234:
</pre>
</pre>
Wir müssen bmx6 noch kompilieren:
Wir müssen bmx6 noch kompilieren:
  git clone https://github.com/axn/bmx6
mkdir /opt/freifunk/
cd $_
  git clone git://qmp.cat/bmx6.git
alternative: https://github.com/axn/bmx6.git
  cd bmx6
  cd bmx6
  make build_all
  make
  make install
  make install


=== Konfiguration ===
=== Konfiguration ===
Zeile 232: Zeile 248:
cd /etc/tinc/tbmxbone
cd /etc/tinc/tbmxbone
# Public keys der anderen Teilnehmer:
# Public keys der anderen Teilnehmer:
git clone https://gitlab.kbu.freifunk.net/bmxbone/tinc
git clone https://github.com/ff-kbu/tbmxbone hosts
ln -s tinc/ hosts
</pre>
</pre>


Zeile 241: Zeile 256:
<pre>
<pre>
tincd -K 4096 -n tbmxbone
tincd -K 4096 -n tbmxbone
cp rsa_key.pub tinc/[Supernodename aus tinc Configfile]
cp ./rsa_key.pub hosts/[Supernodename aus tinc Configfile]
</pre>
</pre>


Und schliesslich:
Und schliesslich:
<pre>
<pre>
cd tinc
cd hosts
git add .
git commit
git push
git push
cd ..
cd ..
Zeile 255: Zeile 272:
==== tinc.conf ====
==== tinc.conf ====
<pre>
<pre>
Name=[Supernodenamen]
Device=/dev/net/tun
Device=/dev/net/tun
DirectOnly=yes # tinc soll nicht Daten selbst weiterleiten
DirectOnly=yes  
IndirectData=yes  
IndirectData=yes  
Broadcast=direct
Broadcast=direct
Cipher=AES-128-CBC # nutzt AES-NI und performed deswegen besser als fastd
Cipher=AES-128-CBC
Mode=switch
Mode=switch
PingInterval=60
PingInterval=60
Zeile 269: Zeile 287:


==== tinc-up ====
==== tinc-up ====
Jetzt müssen wir noch ein Startskript namens /etc/tinc/tbmxbone/tinc-up erstellen:
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>
#!/bin/sh
#!/bin/sh
bmx6 dev=$INTERFACE
/sbin/ip link set dev $INTERFACE up
bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Adress=[BMX6ipv6Adresse]
# 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=localv4 /n=[DeinLokalesIPv4Netz] /b=100000000
bmx6 -c tunIn=localv6 /n=[DeinLokalesIPv6Netz] /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  
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
#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
# 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=ffv4 /network=10.0.0.0/8 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200
bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200
Zeile 288: Zeile 318:
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  
tinc
hosts
hosts -> tinc
rsa_key.priv
rsa_key.priv
rsa_key.pub
rsa_key.pub
Zeile 306: Zeile 335:
Zuerst müssen wir bmx6 kompilieren:
Zuerst müssen wir bmx6 kompilieren:
  apt-get install build-essential make fastd
  apt-get install build-essential make fastd
  git clone https://github.com/axn/bmx6
mkdir /opt/freifunk/
cd /opt/freifunk/
  git clone https://github.com/axn/bmx6.git
  cd bmx6
  cd bmx6
  make build_all
  make build_all # this reports some erros, go ahead anyway
  make install
  make install
   
   
Zeile 318: Zeile 349:


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):
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>
bind 0.0.0.0 port 10042;
bind 0.0.0.0 port 10042;
Zeile 353: Zeile 385:


Jetzt clonen wir aus dem Git-Repo die PublicKeys der Knoten:
Jetzt clonen wir aus dem Git-Repo die PublicKeys der Knoten:
  git clone https://gitlab.kbu.freifunk.net/bmxbone/fastd
cd /opt/freifunk/
  git clone https://github.com/ff-kbu/fbmxbone
Und kopieren diese noch per Hand in die einzelnen Keyverzeichnisse (verbessern):
Und kopieren diese noch per Hand in die einzelnen Keyverzeichnisse (verbessern):
  mkdir ffrl
  mkdir ffrl
  mkdir backbone
  mkdir backbone
  cp fastd/* backbone/
  cp fbmxbone/* backbone/
  cp backbone/gw06 ffrl/
  mv backbone/gw06 ffrl/
Und brauchen noch ein on-up (/etc/fastd/fbmxbone/on-up) Skript:
Und brauchen noch ein on-up Skript (/etc/fastd/fbmxbone/on-up):
  #!/bin/sh
  #!/bin/sh
  /sbin/ip link set dev fbmxbone address [MAC ADDY AUSDENKEN]
  /sbin/ip link set dev fbmxbone address [MAC ADDY AUSDENKEN]
  /sbin/ip link set dev fbmxbone backboneup
  /sbin/ip link set dev fbmxbone up
  bmx6 dev=fbmxbone
  bmx6 dev=fbmxbone
  bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Adress=[BMX6ipv6Adresse]
  bmx6 -c tunDev=Default /tun4Address=[BMXipv4Adresse] /tun6Address=[BMX6ipv6Adresse]
  bmx6 -c tunIn=localv4 /n=[DeinLokalesIPv4Netz] /b=100000000
  bmx6 -c tunIn=localv4 /n=[DeinLokalesIPv4Netz] /b=100000000
  bmx6 -c tunIn=localv6 /n=[DeinLokalesIPv6Netz] /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=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=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=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=ffv4 /network=10.0.0.0/8 /hysteresis=30 /tableRule=50000/200
  bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200
  bmx6 -c tunOut=ffv6 /network=fd00::/8 /hysteresis=30 /tableRule=50000/200
Und mittlerweile klar, ausführbar machen:
Und mittlerweile klar, ausführbar machen:
  chmod +x on-up
  chmod +x /etc/fastd/fbmxbone/on-up


== Routing ==
== Routing ==
Zeile 384: Zeile 417:
</pre>
</pre>


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


== IPv4 DHCP ==
== IPv4 DHCP ==
Zeile 400: Zeile 433:
default-lease-time 150;
default-lease-time 150;
max-lease-time 720;
max-lease-time 720;
authoritative;




subnet 10.X.X.X netmask Y.Y.Y.Y { # Die Range der Hood
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
range 10.X.Y.10 10.X.Z.254; # Eure IPv4 Range
option routers [Supernode IP Adresse];
option routers [Supernode IP Adresse];
}
}
Zeile 414: Zeile 448:
</pre>
</pre>


=== Konfiguration ===
=== Konfiguration /etc/radvd.conf ===
<pre>
<pre>
interface bat0
interface bat0
{
{
  AdvSendAdvert on;
  AdvSendAdvert on;
Zeile 422: Zeile 457:
  prefix [GlobaleIPv6Range des Supernodes] {
  prefix [GlobaleIPv6Range des Supernodes] {
  };
  };
  RDNSS IPv6 of Supernode][your preferred ipv6 DNS-Server] {
  RDNSS [ULA IPv6 address of Supernode, your preferred ipv6 DNS-Server] {
  };
  };  
  prefix [ULA IPv6Range der Supernode (fd00::/64)] {
  prefix [ULA IPv6 range der Supernode (z.B. fdd3::/64)] {
#    AdvOnLink on;
#    AdvAutonomous on;
#    AdvRouterAddr on;
   };
   };


Zeile 433: Zeile 465:
</pre>
</pre>


=== UDP-Queue Größe ===
== 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.
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.
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.
Zeile 453: Zeile 485:


[[Kategorie:Netz-und-Technik]]
[[Kategorie:Netz-und-Technik]]
== DNS-"Server" ==
== DNS-"Server" ==
Supernodes betreiben Caching-DNS-Forwarder. Hierzu wird unbound verwendet
Supernodes betreiben Caching-DNS-Forwarder. Hierzu wird unbound verwendet
Zeile 465: Zeile 498:


  server:
  server:
# you might have to remove the auto-trust-anchor-file option if defined elsewhere
         auto-trust-anchor-file: "/var/lib/unbound/root.key"
         auto-trust-anchor-file: "/var/lib/unbound/root.key"
         interface: [ULA ipv6 des supernodes]
         interface: [ULA ipv6 des supernodes]
         access-control: [public ipv6 Range des Supernodes]  allow
         access-control: [public ipv6 Range KBU]  allow
         access-control: [ULA ipv6 Range des Supernodes] allow
         access-control: [ULA ipv6 Range KBU] allow
         interface: [ipv4 des Supernodes]
         interface: [ipv4 des Supernodes]
         access-control: [IPv4 Range der Hood] allow
         access-control: [IPv4 Range KBU] allow
         verbosity: 1
         verbosity: 1
   forward-zone:
   forward-zone:
       name: "."
       name: "."
       forward-addr: [your Favorite v4 DNS IP]
       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>
 
== 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 ==
<pre>
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
</pre>
 
== 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 ===

Aktuelle Version vom 9. Oktober 2022, 02: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