Supernode

Aus Freifunk Köln, Bonn und Umgebung
Zur Navigation springen Zur Suche springen

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 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:

 gpg --keyserver pgpkeys.mit.edu --recv-key  16EF3F64CB201D9C
 gpg -a --export 16EF3F64CB201D9C | apt-key add -
 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

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

Konfiguration

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

"[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.


/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.

fastd-up

cat > /etc/fastd/mesh-vpn/fastd-up << EOF
#/bin/sh
/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

/sbin/ip rule add from 172.27.0.0/18 table ffkbu
/sbin/ip route add 172.27.0.0/18 dev bat0 table ffkbu
/sbin/ip route flush cache
EOF

fastd-up ausführbar machen:

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

Backbone Netz (tinc)

Installation

apt-get install tinc bridge-utils

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
ln -s tinc/ 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 bbkeys/ kopieren.

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

Und schliesslich:

cd tinc; git push;

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

tinc.conf

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 # CPU Zeit ist wichtig
ConnectTo=gw06
ConnectTo=vpn1

tinc-up

Wichtig: in der datei muss wirklich $INTERFACE stehen. Tinc ersetzt dies automatisch durch das entsprechende interface bei ausführung.

cat > /etc/tinc/backbone/tinc-up << EOF
#!/bin/sh
ifconfig \$INTERFACE 172.27.255.[Backbone IPv4 Adresse hier] netmask 255.255.255.0 up

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

Auch diese Datei muss ausführbar gemacht werden:

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

Danach sollte der Ordner etwa so aussehen:

$:/etc/tinc/backbone# ls 
bbkeys
hosts -> bbkeys
rsa_key.priv
rsa_key.pub
tinc.conf
tinc-up

Routing

we need to set up policy based routing.

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

fastd-up und tinc-up erledigen den rest:

ip rule ls

ip rule ls
0:      from all lookup local 
32765:  from 172.27.0.0/18 lookup ffkbu 
32766:  from all lookup main 
32767:  from all lookup default

ip route list table ffkbu

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 

IPv4 DHCP

Installation

apt-get install isc-dhcp-server

Konfiguration

cat > /etc/dhcp/dhcpd.conf << EOF

option domain-name "mesh.kbu.freifunk.net";
option domain-name-servers 85.214.20.141, 213.73.91.35;

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

log-facility local7;

subnet 172.27.0.0 netmask 255.255.192.0 {
	range 172.27.X.10 172.27.Y.255;
	option routers 172.27.X.1;
}
EOF

IPv6

Installation

apt-get install radvd

Konfiguration

cat > /etc/radvd.conf << EOF
interface bat0 {
	AdvSendAdvert on;
	AdvHomeAgentFlag off;
	MinRtrAdvInterval 10;
	MaxRtrAdvInterval 30;
	AdvOtherConfigFlag on;
	AdvSourceLLAddress off;
	AdvLinkMTU 1350; #1442 - fastd - batman-adv - See wiki for details
	prefix 2001:67c:20a0:b10Y::/64 {
		AdvOnLink on;
		AdvAutonomous on;
		AdvRouterAddr on;
	};
	prefix fdd3:5d16:b5dd::/64 {
		AdvOnLink on;
		AdvAutonomous on;
		AdvRouterAddr on;
	};
};
EOF

/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.

Anycast_DNS

Hinweis: Diese Seite wurde in das Archiv verschoben. Die Informationen sind größtenteils veraltet und nur für Spezialfälle relevant.

Einleitung

Supernodes betreiben Caching-DNS-Forwarder. Diese sind per anycast erreichbar. Hierzu wird unbound verwendet

Adressen

Das Setup unterscheidet zwischen v4 und v6. Bei v4 wird dem Mesh-Interface (hier bat0) die IP 172.27.0.2 zugewiesen. Bei IPv6 erhält der Loopback-Interface die IP fdd3:5d16:b5dd::2. Anycast auf Basis von Neighbor Discovery ist zur Zeit auf Linux nicht implementiert.

/etc/network/interfaces

iface lo inet loopback
        post-up ip -6 addr add fdd3:5d16:b5dd::2/128 dev lo # <-- Zeile hinzufügen
#...
# Neues Interface für zweite IPv4 Adresse
auto br-ff:0 #Ggf. bat0:0, falls keine Bridge existiert
iface br-ff:0 inet static #Ggf. bat0:0, falls keine Bridge existiert
        address 172.27.0.2
        netmask 255.255.192.0

/etc/unbound/unbound.conf

server:
       auto-trust-anchor-file: "/var/lib/unbound/root.key"
       interface: fdd3:5d16:b5dd::2
       access-control: 2001:67c:20a0:b100::/56 allow
       access-control: fdd3:5d16:b5dd::/48 allow
       interface: 172.27.0.2
       access-control: 172.27.0.0/16 allow
       verbosity: 1
forward-zone:
       name: "hack"
       forward-addr: 172.31.0.5
       forward-addr: 172.31.116.1
forward-zone:
       name: "dn42"
       forward-addr: 172.22.228.85
       forward-addr: 172.22.222.6
forward-zone:
     name: "."
     forward-addr: 172.27.255.2   # Paula