Inhaltsverzeichnis
Gatewaykonfiguration
Achtung - Nicht benutzen, noch in Arbeit! — Florian Knodt 2015/03/10 22:30
Einleitung
Dieser Guide beschreibt die Einrichtung eines Supernodes für das FF-MYK-Netz mit optionalem Internet-Uplink unter Arch Linux. Die Informationen sollten sich mit geringen Änderungen auch auf anderen Distributionen nutzen lassen.
Achtung: Supernodes nutzen komplexe Routingmethoden - es werden fundierte Linux und Netzwerkkenntnisse vorausgesetzt.
Benötigte Software
- fastd (AUR) → VPN zu/von den Knoten
- dhcpd → DHCP-Server
- bind (named) → DNS-Zone
- OpenVPN → VPN Internetzugang
- haveged → Genug Entropie bereithalten; alternativ rng-tools
- ntp → Weil Baum
- php → Kleine Hilfsprogramme
- batman-adv (AUR) → B.A.T.M.A.N. Routing (Kompatibilität 15!)
- batctl (AUR) → B.A.T.M.A.N. Konfiguration
- bridge-utils → Netzwerkbrücke
- screen → Wir starten fastd in screen - kann ggf. angepasst werden
- vnstat → Traffic-Statistiken
- lighttpd → Statistiken (und ggf. Karte). Anderer Server mit HTTP geht natürlich auch
Optional (Karte/Statistik/...) - nicht dokumentiert
- python
- batman-alfred
- batman-alfred-json-git
- meshviewer
- ffmap-backend (patched)
- ffapi-updater (adlerweb)
- Ein Haufen Workarounds…
Konfiguration
Standardkonfiguration
Das OS sollte vollständig konfiguriert sein. Es sollte eine öffentliche IPv4-Adresse und optimalerweise auch IPv6-Adresse besitzen.
NTP
Um Probleme auf Grund von unterschiedlichen Systemzeiten zu vermeiden wird NTP genutzt. Dieser ist auch aus dem FF-Netz erreichbar. Es ist auf eine korrekte Zeitzone des Systems zu achten. Die Quelle kann nach eigenem Ermessen gewählt werden.
- /etc/ntp.conf
# Associate to Arch's NTP pool server 0.arch.pool.ntp.org server 1.arch.pool.ntp.org server 2.arch.pool.ntp.org server 3.arch.pool.ntp.org # By default, the server allows: # - all queries from the local host # - only time queries from remote hosts, protected by rate limiting and kod restrict default kod limited nomodify nopeer noquery notrap restrict 127.0.0.1 restrict ::1 # Location of drift file driftfile /var/lib/ntp/ntp.drift
NTP sollte automatisch starten
Haveged
Der Server muss z.T. einiges an Crypto abarbeiten und kann daher - vorallen da keine Tastatur/Mausaktionen erfolgen - schnell in einen Entropiemangel laufen. Als Workarround kann haveged gestartet werden um künstlich den Pool hoch zu halten.
Fastd
Fastd ist ein VPN-Server/Client, welcher zur Verbindung mit den Knoten verwendet wird. Er ist durch die geringen Speicheranforderungen optimal für Router geeignet. Als Methode kommt salsa2012+gmac zum Einsatz, zur Kompatibilität mit älteren Firmwareversionen wird auch salsa2012+umac akzeptiert. Eine unverschlüsselte Verbindung, welche bei einigen Communitys zur Steigerung der Performance angeboten wird, ist nicht aktiv. Verbindungen werden über udp/10000 abgewickelt. Für jeden Client muss der öffentliche Schlüssel hinterlegt werden. Auf unseren Gateways lassen wir ausschließlich Knoten zu, welche über das Webinterface registriert wurden (dies gilt nur für VPN, Mesh ist immer möglich!). Ein Abgleich erfolgt über ein PHP-Script, welches die öffentlichen Schlüssel der Clients aus der Datenbank abruft und passende Konfigurationsdateien erzeugt.
(„lamepassword“ durch den geheimen Schlüssel des Servers ersetzen)
- /etc/fastd/ff/fastd.conf
log to syslog level info; interface "ffmyk-mesh-vpn"; method "salsa2012+gmac"; method "salsa2012+umac"; secure handshakes yes; bind any:10000; hide ip addresses yes; hide mac addresses yes; mtu 1280; include peers from "peers"; secret "lamepassword";
- /etc/fastd/ff/bin/fastd-api.php
#!/usr/bin/php -f <?php $url = '***APIURL***'; $out = '/etc/fastd/ff/peers/'; if(!is_dir($out)) die('Output Dir missing'); if(!is_writable($out)) die('Output Dir perms'); $data = file_get_contents($url); $data = unserialize($data); foreach($data as $router) { if(!preg_match('/^[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}$/', $router['MAC'])) { trigger_error('Router mit falscher MAC?!', E_USER_WARNING); }elseif(!preg_match('/^[A-F0-9]{64}$/', $router['PublicKey'])) { trigger_error('Router mit falschem Key?!', E_USER_WARNING); }else{ $filename='client_'.str_replace(':', '-', $router['MAC']); $fp=fopen($out.$filename, 'w'); fwrite($fp, 'key "'.$router['PublicKey'].'";'."\n"); fclose($fp); $active[] = $filename; } } $dh = opendir($out); while(($file = readdir($dh)) !== false) { if($file != '.' && $file != '..') { if(!in_array($file, $active) && (strpos($file, 'client_') !== false)) { unlink($out.$file); } } } exec('killall -SIGHUP fastd'); ?>
Das PHP-Script sollte mindestens alle 10 Minuten via Cron aufgerufen werden (cd /etc/fastd/ff/bin ; php -f fastd-api.php). Es ist zu beachten, dass das Script zum Erstellen der Configs und reload des fastd entsprechende Berechtigungen benötigt. Der Daemon selbst wird über das Routing-Script im Screen gestartet und ist nicht als Systemdienst hinterlegt.
Hinweis: Ggf. muss in der php.ini die Variable open_basedir ergänzt oder auskommentiert werden.
- ERR: Inter Supernode VPN
DHCP
Der DHCP-Server verteilt IPv4-Adressen an die Clients und verteilt Router und DNS-Informationen. Die IPs sind passend zur Liste zu wählen. Der Node selbst ist dabei DNS und Gateway.
- /etc/dhcpd.conf
default-lease-time 600; max-lease-time 3600; authoritative; log-facility local7; subnet 10.222.0.0 netmask 255.255.0.0 { range 10.222.xxx.xxx 10.222.xxx.xxx; option routers 10.222.xxx.xxx; option domain-name-servers 10.222.xxx.xxx; }
dhcpd4 sollte automatisch starten
- TODO: Feste IPs via API
- TODO: Alternative DNS-Server via Liste?
- TODO: NTP via Liste?
DNS
Im FF-MYK-Netz wird neben dem „offiziellen“ DNS die interne Domain „.ffmyk“ genutzt. Als Uplink-DNS werden z.Zt. die Server des Digitalcourage (ehem. FoeBud) und CCC Berlin genutzt.
- /etc/named.conf
options { directory "/var/named"; pid-file "/run/named/named.pid"; listen-on-v6 { 2a01:198:70a:ff::xxx:xxx; }; listen-on port 53 { 127.0.0.1; 10.222.xxx.xxx; }; dnssec-validation auto; auth-nxdomain no; # conform to RFC1035 allow-recursion { 10.222.0.0/16; 127.0.0.0/8;}; allow-transfer { none; }; allow-update { none; }; forwarders { 85.214.20.141; 213.73.91.35; }; version none; hostname none; server-id none; }; zone "localhost" IN { type master; file "localhost.zone"; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; }; zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" { type master; file "localhost.ip6.zone"; }; zone "255.in-addr.arpa" IN { type master; file "empty.zone"; }; zone "0.in-addr.arpa" IN { type master; file "empty.zone"; }; zone "." IN { type hint; file "root.hint"; }; zone "ffmyk" IN { type master; file "ffmyk.zone"; allow-query { any; }; allow-transfer { none; }; };
- /var/named/ffmyk.zone
$ORIGIN . $TTL 60 ; 1 minute ffmyk IN SOA ns.ffmyk. hostmaster.adlerweb.info. ( 2014070359 ; serial 28800 ; refresh (8 hours) 7200 ; retry (2 hours) 604800 ; expire (1 week) 39600 ; minimum (11 hours) ) NS ns A 10.222.xxx.xxx MX 10 mail.freifunk-myk.de. ns.ffmyk A 10.222.xxx.xxx AAAA 2a01:198:70a:ff::xxx:xxx ntp.ffmyk A 10.222.xxx.xxx AAAA 2a01:198:70a:ff::xxx:xxx www.ffmyk A 10.222.100.1 AAAA 2a01:198:70a:ff::100:1 1.ntp.ffmyk A 10.222.100.1 AAAA 2a01:198:70a:ff::100:1
DNS/BIND/named sollte als Systemdienst automatisch starten
- ERR: Das ist für Master, wir bräuchten Multimaster oder Slaves
- TODO: Interne DNS via API
- TODO: NTP-Liste
OpenVPN
Es besteht z.Zt. ein Vertrag über Mullvad, welcher das Internet-Breakout darstellt. Es sind 3 Verbindungen möglich. Zum Connect wird OpenVPN verwendet. Die Vertragsdaten liegen bei adlerweb.
- /etc/openvpn/mullvad.conf
client dev mullvad dev-type tun proto udp #proto tcp #remote openvpn.mullvad.net 1194 #remote openvpn.mullvad.net 443 #remote openvpn.mullvad.net 53 #remote se.mullvad.net # Servers in Sweden #remote nl.mullvad.net # Servers in the Netherlands #remote de.mullvad.net 1194 # Servers in Germany #remote us.mullvad.net # Servers in the USA # Tunnel IPv6 traffic as well as IPv4 tun-ipv6 # Keep trying indefinitely to resolve the # host name of the OpenVPN server. Very useful # on machines which are not permanently connected # to the internet such as laptops. resolv-retry infinite # Most clients don't need to bind to # a specific local port number. nobind # Try to preserve some state across restarts. persist-key persist-tun # Enable compression on the VPN link. comp-lzo # Set log file verbosity. verb 3 remote-cert-tls server ping-restart 60 # Allow calling of built-in executables and user-defined scripts. script-security 2 # Parses DHCP options from openvpn to update resolv.conf #up /etc/openvpn/update-resolv-conf #down /etc/openvpn/update-resolv-conf ping 10 ca /etc/openvpn/mullvad/ca.crt cert /etc/openvpn/mullvad/mullvad.crt key /etc/openvpn/mullvad/mullvad.key crl-verify /etc/openvpn/mullvad/crl.pem # Update routing information. # Do not use standard configuration pushed via DHCP! route-noexec up /etc/openvpn/mullvad/mullvad-up
- /etc/openvpn/mullvad/mullvad-up
#!/bin/bash #/sbin/ip route replace default via $4 table 42 sleep 3 echo Reroute via $4 ip route replace 0.0.0.0/1 via $4 table 42 ip route replace 128.0.0.0/1 via $4 table 42 exit 0
chmod +x nicht vergessen!
OpenVPN wird über das Routing-Script gestartet und ist nicht als Systemdienst hinterlegt.
Traffic-Statistik
Um den Überblick zu behalten verwenden wir vnstat um Trafficstatistiken (nur Interface-Auslastung) zu sammeln.
Nach der Installation müssen die Interfaces einmalig registriert werden
vnstat -u -i enp3s0 vnstat -u -i br-ffmyk vnstat -u -i mullvad
Im Anschluss wird der Daemon vnstatd gestartet und als Systemdienst eingerichtet.
- TODO: Zentrales sammeln
Routing
Beim Start des Servers sollte ein Script die grundlegende Konfiguration durchführen. Dies beinhaltet u.A. die Einrichtung der Routingtablellen und Netzwerkbrücken.
MAC-Adresse aus der Liste wählen - diese wird genutzt um das Gerät in der Map als Gateway zu identifizieren.
Vor dem Ausführen des Scripts muss das Kernelmodul batman-adv geladen sein.
- /etc/modules-load.d/batman.conf
batman-adv
- init.sh
# Fastd starten screen -AmSd fastd fastd -c /etc/fastd/ff/fastd.conf --log-level debug #Warten sodass fastd die devices sicher erstellt hat sleep 5 #MAC-Adresse des VPN-Interface einrichten ip link set down address 02:FF:4D:59:4B:10 dev ffmyk-mesh-vpn ip link set up dev ffmyk-mesh-vpn #VPN-Interface als B.A.T.M.A.N.-Device einrichten batctl if add ffmyk-mesh-vpn #Server-Modus (=kann Broadcast empfangen, für DHCP) batctl gw server #Intervall der Originator-Beacons batctl it 10000 #B.A.T.M.A.N-Interface einschalten ip link set up dev bat0 #Netzwerkbrücke einrichten und B.A.T.M.A.N-Interface hinzufügen brctl addbr br-ffmyk brctl addif br-ffmyk bat0 ip link set up dev br-ffmyk #IPs vergeben ip addr add 10.222.xxx.xxx/16 dev br-ffmyk ip addr add 2a01:198:70a:ff::xxx:xxx/64 dev br-ffmyk #Nur Stat-Server #screen -AmSd alfred alfred -i br-ffmyk -b bat0 -m #screen -AmSd batadv-vis batadv-vis -i bat0 -s #Hop-Penalty soll den Nodes Mesh-Verbindungen schmackhafter machen - normal würde VPN wegen geringerem Packet-Loss immer bevorzugt echo 128 > /sys/class/net/bat0/mesh/hop_penalty #IP-Forwardung wäre für Router hilfreich… sysctl -w net.ipv4.ip_forward=1 #OpenVPN starten systemctl start openvpn@mullvad #Routing umbiegen - alles was über br-ffmyk rein kommt wird als 0x1 markiert iptables -t mangle -A PREROUTING -i br-ffmyk -j MARK --set-xmark 0x1/0xffffffff #Alles auf dem Interface mullvad (via OpenVPN) macht NAT-Masquerading iptables -t nat -A POSTROUTING -o mullvad -j MASQUERADE #Routingtabelle 42 (==Freifunk) ist per default nicht erreichbar ip route add unreachable default table 42 #Alles, was mit 0x1 markiert wird gehört zu Tabelle 42 ip rule add from all fwmark 0x1 table 42 #Alles mit Freifunk-IP - woher auch immer - gehlrt zu Tabelle 42 ip rule add from 10.222.0.0/16 table 42 #Tabelle 42 routet das Ziel mit Freifunk-IPs über das Device br-ffmyk ip route add 10.222.0.0/16 dev br-ffmyk table 42 #DHCP brauch bei neu auftauchenden devices (start fastd) einen restart systemctl restart dhcpd4
Es folgt Schrott
Todo:
- ICVPN
- BGP (bird/bird6)
- radvd
- fastd
- dhcpd
- radvd
- named
- OpenVPN (mullvad)
- haveged (Entropie)
ref https://wiki.luebeck.freifunk.net/gatewayconfig