Supernode(alt)

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

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

Voraussetzungen

[wikipedia-article]

Benötigte Software

1) [fastd] mesh-node-vpn

2) [vpn-key-upload] todo: remove overhead (apache,ruby,sinatra ...), kiss principle] not documented in here (todo)

3) [batman-adv]

4) [tinc] mesh-backbone-vpn

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

Du benötigst ausserdem:

  • einen fastd-private-key
  • eine IPv4/IPv6 Adresse und ein Subnetz
  • eine IPv4 Adresse für das Backbone-Netz


Vorbereitungen

In der /etc/sysctl.conf muss folgendes gesetzt sein:

cat >> /etc/sysctl.conf <<EOF
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
EOF

Danach die /etc/sysctl.conf neu einlesen:

sysctl -p

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

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

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

fastd

Installation

 apt-get install fastd curl

Konfiguration

fastd.conf

"[YOUR SECRET KEY HERE]" Sollte dabei durch den fastd-secret-key ersetzt werden (erfragen)

mkdir /etc/fastd/mesh-vpn;
cat > /etc/fastd/mesh-vpn/fastd.conf << EOF
# Log warnings and errors to stderr
#log level warn;
log level error;

# 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";

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

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

# Secret key generated by 'fastd --generate-key'
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 "peers";
include peers from "backbone";

on up "./fastd-up";
# on down "./fastd-down";

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

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:

mkdir /etc/fastd/mesh-vpn/backbone
mkdir /etc/fastd/mesh-vpn/peers
chown www-data /etc/fastd/mesh-vpn/peers

Backbone

Backbone Keys einrichten:

$:/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";
remote ipv4 "fastd3.kbu.freifunk.net" port 10000;

key "9b3f65f99963343e2785c8c4fad65e70b73ee7e1205d63bd84f3e2decb53e621";
remote ipv4 "fastd4.kbu.freifunk.net" port 10000;

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";
remote ipv4 "fastd8.kbu.freifunk.net" port 10000;

[fastd-backbone] for more

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

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.

Backbone Netz (tinc)

Installation

apt-get install tinc bridge-utils

Konfiguration

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

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

tincd -K
cp rsa_key.pub bbkeys/[supernodename]

Bevor jetzt der pub-key gepushed werden kann, muss tinc noch gesagt werden, welche Adressen über diesen Node zu routen sind.
Also im .pub key:

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

Und schliesslich:

cd bbkeys; git push;

tinc.conf

cat > /etc/tinc/backbone/tinc.conf << EOF
Name=[supernodename]
Device=/dev/net/tun
Mode=router
Compression=9
ConnectTo=paula
ConnectTo=paul
EOF

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

fastd-service

Achtung, Pfade und Hostnamen anpassen. Das ist hier exemplarisch

apt-get install apache2 ruby-sinatra libapache2-mod-passenger sudo psmisc git ruby-dev
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
rm /etc/apache2/sites-enabled/000-default
cat >> /etc/apache2/sites-enabled/000-fastd1.conf <<EOF
 <VirtualHost *:80>
      ServerAdmin info@EMAIL
      DocumentRoot /srv/www/fastd1.ffm.freifunk.net/fastd-service/public
      <Directory /srv/www/fastd1.ffm.freifunk.net/fastd-service/public>
          Allow from all
          Options -MultiViews
      </Directory>
      ErrorLog /srv/www/fastd1.ffm.freifunk.net/logs/error.log
      CustomLog /srv/www/fastd1.ffm.freifunk.net/logs/access.log combined
 </VirtualHost>
EOF

Anpassung der conf.yml:

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 
chown -R www-data /srv/www/fastd1.ffm.freifunk.net

per visudo die folgende Zeile hinzufügen (Pfad anpassen)

www-data ALL = NOPASSWD: /srv/www/fastd1.ffm.freifunk.net/fastd-service/fastd_hup

Anmerkung: Es kann sein, dass man in fastd_service.rb folgende Zeile auskommentieren muss:

register Sinatra::MultiRoute

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