Supernode
Voraussetzungen
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:
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:
deb http://repo.universe-factory.net/debian/ sid main
GPG-Key importieren:
gpg --keyserver pgpkeys.mit.edu --recv-key AB7A88C5B89033D8 gpg -a --export AB7A88C5B89033D8 | sudo 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
fastd
Installation
apt-get install fastd
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"; EOF 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 & ";
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
Backbone
Backbone Keys einrichten:
$:/etc/fastd/mesh-vpn# ls backbone/ fastd1 fastd2 fastd3 fastd4 $:/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 "fastd1.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/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
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