Doku von Freifunk Mainz/Wiesbaden/Umgebung
Kurzanleitung für Ubuntu 16.04
Bitte verwendet ab sofort das automatische Installationsscript unter https://github.com/freifunk-stuttgart/ffs-make-gateway Der Text hier bleibt erhalten damit man in etwa sieht was passiert. Neuerungen aber bitte aus dem Scipt auslesen.
Benötigte Pakete installieren
apt install linux-image-generic dnsmasq bridge-utils git batctl fastd alfred openvpn tinc vnstat isc-dhcp-relay bird radvd dnsutils
Test ob modprobe batman-adv eine Fehler ergibt, dann gibt es Probleme mit dem Kernel. Evtl. muss linux-image-extra-4.x.y-zz-generic installiert sein.
Routing aktivieren
/etc/sysctl.conf
net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.all.rp_filter=0
sysctl -p /etc/sysctl.conf
Policyrouting vorbereiten
/etc/iproute2/rt_tables
70 stuttgart 42 icvpn
DHCP Relay konfigurieren
/etc/default/isc-dhcp-relay
SERVERS="10.190.128.5 10.191.255.252 10.191.255.253" INTERFACES="ffsbb br01 br02 br03 br04" OPTIONS=""
Interfaces einrichten (IPs anpassen!!!)
/etc/network/interfaces.d/br03.cfg
auto br03 iface br03 inet static hwaddress 02:00:39:03:08:04 address 10.190.128.84 netmask 255.255.192.0 pre-up /sbin/brctl addbr $IFACE up /sbin/ip address add fd21:b4dc:4b03::a38:0804/64 dev $IFACE post-down /sbin/brctl delbr $IFACE # be sure all incoming traffic is handled by the appropriate rt_table post-up /sbin/ip rule add iif $IFACE table stuttgart priority 7000 pre-down /sbin/ip rule del iif $IFACE table stuttgart priority 7000 # ULA route mz for rt_table stuttgart post-up /sbin/ip -6 route add fd21:b4dc:4b03::/64 proto static dev $IFACE table stuttgart post-down /sbin/ip -6 route del fd21:b4dc:4b03::/64 proto static dev $IFACE table stuttgart # default route is unreachable. Nur einmal post-up /sbin/ip route add unreachable default table stuttgart post-down /sbin/ip route del unreachable default table stuttgart allow-hotplug vpn03 iface vpn03 inet6 manual hwaddress 02:00:38:03:08:04 pre-up /sbin/modprobe batman-adv post-up /usr/sbin/batctl -m bat03 if add $IFACE post-up /sbin/ip link set dev bat03 up allow-hotplug vpn03bb iface vpn03bb inet6 manual hwaddress 02:00:35:03:08:04 pre-up /sbin/modprobe batman-adv post-up /usr/sbin/batctl -m bat03 if add $IFACE post-up /sbin/ip link set dev bat03 up allow-hotplug bat03 iface bat03 inet6 manual pre-up /sbin/modprobe batman-adv post-up /sbin/brctl addif br03 $IFACE post-up /usr/sbin/batctl -m $IFACE it 10000 #post-up /usr/sbin/batctl -m $IFACE gw server 64mbit/64mbit pre-down /sbin/brctl delif br03 $IFACE || true
2 VPN/Fastd einrichten (IPs anpassen!!!)
mkdir /etc/fastd/vpn03 mkdir /etc/fastd/vpn03bb git clone https://github.com/freifunk-stuttgart/peers-ffs /etc/fastd/peers ln -s /etc/fastd/peers/vpn03/peers /etc/fastd/vpn03/peers ln -s /etc/fastd/peers/vpn03/bb /etc/fastd/vpn03bb/bb
/etc/fastd/fastdall.conf
# error|warn|info|verbose|debug|debug2 log level info; hide ip addresses yes; hide mac addresses yes; method "salsa2012+umac"; # new method (faster) method "salsa2012+gmac"; #method "null+salsa2012+umac"; mtu 1406; # 1492 - IPv4/IPv6 Header - fastd Header... #peer limit 60;
/etc/fastd/vpn03/fastd.conf
interface "vpn03"; status socket "/var/run/fastd-vpn03.status"; bind 81.7.7.159:10043; #bind [2001:1111:2222:3333::1]:10043; include "../secret.conf"; include peers from "peers"; include "../fastdall.conf";
/etc/fastd/vpn03bb/fastd.conf
interface "vpn03bb"; status socket "/var/run/fastd-vpn03bb.status"; bind 81.7.7.159:9043; #bind [2001:1111:2222:3333::1]:9043; include "../secret-bb.conf"; include peers from "bb"; include "../fastdall.conf";
Key generieren, alternativ vorhandenen nehmen
fastd --generate-key > /etc/fastd/gateway-bb.key echo -n "secret" >/etc/fastd/secret-bb.conf cat /etc/fastd/gateway-bb.key | head -1 | awk '{print " \""$2"\";"}' >>/etc/fastd/secret-bb.conf cat /etc/fastd/secret-bb.conf
Ergebnis sollte eine Zeile sein die so aussieht:
secret "1234567890123456789012345678901234567890123456789012345678901234";
Key in Github eintragen unter https://github.com/freifunk-stuttgart/peers-ffs
radvd einrichten (IP6 Routen verteilen)
/etc/radvd.conf
interface br03 { AdvSendAdvert on; IgnoreIfMissing on; MinRtrAdvInterval 60; MaxRtrAdvInterval 300; MinDelayBetweenRAs 30; AdvDefaultLifetime 0; prefix fd21:b4dc:4b03::/64 {}; RDNSS fd21:b4dc:4b03::a38:0804 {}; route fd21:b4dc:4b1e::/64 {}; route fd21:b4dc:4b00::/64 {}; route fd21:b4dc:4b01::/64 {}; route fd21:b4dc:4b02::/64 {}; route fd21:b4dc:4b03::/64 {}; route fd21:b4dc:4b04::/64 {}; };
dnsmasq konfigurieren
/etc/dnsmasq.d/allgemein
interface=br03 interface=bat03 interface=vpn03 bind-interfaces log-facility=/var/log/dnsmasq.log
/etc/dnsmasq.d/dns
no-resolv no-hosts cache-size=4096 #log-queries # .ffs/ffstg.de Weiterleitung server=/ffs/172.21.2.60 server=/ffstg.de/51.254.139.175 # Forward DNS requests via wan-vpn server=85.214.20.141 #@tun0 # FoeBud server=213.73.91.35 #@tun0 # dnscache.berlin.ccc.de server=141.1.1.1 #@tun0 # server=8.8.8.8 #@tun0 # Google server=8.8.4.4 #@tun0 # Google
Openvpn Berlin (anderer Anbieter wie CyberGhost)
/etc/openvpn/freifunk.conf
# Datei von Berlin (xxxxxxx-udp.ovpn) rein kopieren oder umbenennen # folgende Zeilen am Anfang hinzufügen route-noexec script-security 2 up "openvpn-up" down "openvpn-down"
/etc/openvpn/openvpn-up
#!/bin/sh ip rule add from $ifconfig_local table stuttgart priority 9970 ip route add 0.0.0.0/1 via $route_vpn_gateway dev $dev table stuttgart ip route add 128.0.0.0/1 via $route_vpn_gateway dev $dev table stuttgart # NAT aktivieren und NAT Tabelle vergroessern, wird benötigt wenn NICHT Berlin #iptables -t nat -A POSTROUTING -o $dev -j MASQUERADE #sysctl -w net.netfilter.nf_conntrack_max=500000 exit 0
/etc/openvpn/openvpn-down
#!/bin/sh ip rule del from $ifconfig_local table stuttgart priority 9970 # NAT deaktivieren, wird benötigt wenn NICHT Berlin #iptables -t nat -D POSTROUTING -o $dev -j MASQUERADE exit 0
chmod +x /etc/openvpn/openvpn-*
reboot
Funktionstest kann beginnen
Bird konfigurieren
/etc/bird/bird.conf
router id 10.191.255.84; # eigene IP im tincbb # Filter definieren filter ffs_filter { krt_metric = 100; if net ~ [ 172.21.0.0/16+ ] then accept; if net ~ [ 10.190.0.0/15+ ] then accept; else reject; } protocol kernel { learn; # Learn all alien routes from the kernel persist no; scan time 20; # Scan kernel routing table every 20 seconds import filter ffs_filter; kernel table 70; # fuer table stuttgart export filter ffs_filter; # Propagate routes with low metric into kernel table device routes; } # This pseudo-protocol watches all interface up/down events. protocol device { scan time 10; # Scan interfaces every 10 seconds } protocol ospf ffsBackbone { preference 100; # prio zahl rfc1583compat no; # Metrik gem. OSPFv2, RFC 2328 stub router no; # Box macht ggf. auch Transit-Traffic tick 1; # Topologie-Berechnungen nur alle 1s ecmp no; # Kein Equal-Cost-Multipath, um Problemen mit unterschiedlichen # Uplinks aus dem Weg zu gehen import filter ffs_filter; export filter ffs_filter; area 0.0.0.0 { # Backbone-Area external{ 0.0.0.0/0; }; interface "ffsbb" { # Run OSPF over VPN cost 100; hello 10; poll 20; retransmit 5; priority 10; wait 40; type bcast; authentication cryptographic; password "xxxyyyzzz"; }; }; };
Bird6 konfigurieren
router id 10.191.255.84; # z.B. 10.191.255.10 # Filter definieren filter ffs_filter { krt_metric = 100; if net ~ [ fd21:b4dc:4b00::/56+ ] then accept; else reject; } protocol kernel { learn; # Learn all alien routes from the kernel persist no; scan time 20; # Scan kernel routing table every 20 seconds import filter ffs_filter; kernel table 70; # fuer table stuttgart export filter ffs_filter; # Propagate routes with low metric into kernel table device routes; } # This pseudo-protocol watches all interface up/down events. protocol device { scan time 10; # Scan interfaces every 10 seconds } protocol ospf ffsBackbone { preference 100; # prio zahl rfc1583compat no; # Metrik gem. OSPFv2, RFC 2328 stub router no; # Box macht ggf. auch Transit-Traffic tick 1; # Topologie-Berechnungen nur alle 1s ecmp no; # Kein Equal-Cost-Multipath, um Problemen mit unterschiedlichen # Uplinks aus dem Weg zu gehen import filter ffs_filter; export filter ffs_filter; area 0.0.0.0 { # Backbone-Area external{ ::/0; }; interface "ffsbb" { # Run OSPF over VPN cost 100; hello 10; poll 20; retransmit 5; priority 10; wait 40; type bcast; }; }; };
Tinc VPN Layer 2 einrichten
- Es wird ein Tinc Netz 10.191.255.0/24 erstellt auf jedem GW und den DHCP Servern, evtl. auch noch auf Servern die Dienste innerhalb Freifunk anbieten
- 3 DHCP Server erhalten die IPs 10.191.255.251/24, 10.191.255.252/24, 10.191.255.253/24, diese werden bei den GWs als Relay Server eingetragen
- die Gateways nutzen erhalten eine IP in 10-191.255.x/24.
- Jeder GW macht in Tinc 3 VPN Connects zu den 3 DHCP Servern, diese fungieren als Zentralen des VPN Netzes.
- IPv6 entsprechend einrichten
- Das wars!
/etc/default/tinc einfügen (damit etwas mehr im Logfile/syslog steht)
echo 'EXTRA="-d 2"' >> /etc/default/tinc
mkdir -p /etc/tinc/ffsbb/hosts
/etc/tinc/ffsbb/tinc.conf erstellen
Name = gw08n04 ConnectTo = dhcp01 ConnectTo = dhcp02 ConnectTo = dhcp03 Mode = switch Port = 6551 #GraphDumpFile = /tmp/ffs.gv
/etc/tinc/ffsbb/tinc-up erstellen
#!/bin/sh ip addr add 10.191.255.84/24 broadcast 10.191.255.255 dev $INTERFACE ip link set $INTERFACE up ip rule add iif $INTERFACE table stuttgart priority 7000 ip route add 10.191.255.0/24 proto kernel scope link src 10.191.255.84 dev $INTERFACE table stuttgart ip addr add fd21:b4dc:4b00::a38:0804/64 dev $INTERFACE
chmod +x /etc/tinc/ffsbb/tinc-up
tincd -n ffsbb -K 4096
2 x Return drücken
/etc/tinc/ffsbb/hosts/gw08n04 am Anfang hinzufügen:
address = gw08n04.freifunk-stuttgart.de port = 6551
echo ffsbb >> /etc/tinc/nets.boot
service tinc restart
/etc/tinc/ffsbb/hosts/gw08n04 ins Git kopieren: https://github.com/freifunk-stuttgart/tinc-ffsbb
Tinc VPN Layer 2 einrichten Teil2, hosts Dateien aus Git holen
git clone https://github.com/freifunk-stuttgart/tinc-ffsbb /root/tinc-ffsbb
Alte hosts umbenennen als Backup
mv /etc/tinc/ffsbb/hosts /etc/tinc/ffsbb/hosts.1
Git Dateien verwenden
ln -s /root/tinc-ffsbb/hosts /etc/tinc/ffsbb/hosts
service tinc restart
Freifunk Aktualisierungen
/etc/rc.local einfuegen
/usr/local/bin/update-ff &
/usr/local/bin/update-ff
#!/bin/sh wwwpfad="/var/www/html" vpns="vpn03" # Endlosschleife while : ; do ## ffs Peers aktualisieren cd /etc/fastd/peers back=$( git pull ) echo "fastd-peers: $back" /usr/local/bin/update_peers.py --repo /etc/fastd/peers ## ffsbb aktualisieren cd /root/tinc-ffsbb/ back=$( git pull ) echo "tinc-ffsbb: $back" tincd -n ffsbb -k HUP # Status veroeffentlichen for i in $vpns; do status.pl /var/run/fastd-$i.status | jq . | grep -v "\"address\": " >$wwwpfad/data/fastd-status-$i.json done echo "*** fertig ***" sleep 120 done
Download: status.pl, update_peers.py
wget https://raw.githubusercontent.com/poldy79/FfsScripts/master/update_peers.py -nd -P /usr/local/bin/ wget http://gw08.albi.info/dl/status.pl -nd -P /usr/local/bin/ apt install python-psutil jq
chmod +x /usr/local/bin/update-ff chmod +x /usr/local/bin/status.pl chmod +x /usr/local/bin/update_peers.py
Freifunk Update Script
Braucht man damit Daten aktuell gehalten werden, bitte mindestens alle 5 Minuten ausführen. Alternativ in /etc/rc.local
/usr/local/bin/update-ff anlegen
#!/bin/sh WWWPFAD="/var/www/html" # Pfad fuer Webausgaben VPNS="vpn01 vpn02 vpn03 vpn04" # Bitte alle fastd Interfaces eintragen while : ; do # Endlosschleife entfernen wenn ihr Cron benutzt ##### ffs Peers aktualisieren cd /etc/fastd/peers BACK=$( git pull ) echo "fastd-peers: $BACK" /usr/local/bin/update_peers.py --repo /etc/fastd/peers ##### ffsbb aktualisieren cd /root/tinc-ffsbb/ BACK=$( git pull ) echo "tinc-ffsbb: $BACK" tincd -n ffsbb -k HUP ##### Status veroeffentlichen for I in $VPNS; do status.pl /var/run/fastd-$I.status | jq . | grep -v "\"address\": " >$wwwpfad/data/fastd-status-$I.json done echo "*** fertig ***" sleep 120 done # Endlosschleife entfernen wenn ihr Cron benutzt
rc.local hinzufügen vor dem 'exit 0
'
/usr/local/bin/update-ff &
Überwachungsscript für Gateways
#! /bin/bash #### Alle wichtigen Task pruefen und bei Bedarf neu starten und per Email informieren #### Variablen anpassen! EMAIL=albi@albi.info # an wen die Antwortmails gehen sollen DNSIP=$(ifconfig br03 | grep 'inet [Aa]d' | cut -d: -f2 | awk '{print $1}') # IP Adresse des DNS Servern DNSANFRAGE=web.de # Domainname Anfrage DNSBACK=212.227 # IP die als Antwort auf DNSANFRAGE zurück kommen muss IFBAT="bat01 bat02 bat03 bat04" # Alle Fastd Interfaces FASTDANZAHL=8 # Anzahl der Fastd Instanzen die laufen OVPN=/etc/openvpn # Pfad zu Openvpn Konfigs #### auf standard setzen VPNERROR=0 VPNDOWN=1 EMAILZAHL=0 if [ -n "$1" ]; then TESTMODE=$1 echo "start Testmode" fi # Endlosschleife while : ; do #### ANTWORT auf "" setzen ANTWORT="" #### fastd pruefen PRG="fastd" # BACK=`pgrep -x $PRG | wc -l` BACK=`ifconfig | grep vpn | wc -l` echo -n "check $PRG: " if [ "$BACK" != $FASTDANZAHL ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG stop sleep 1 service $PRG start sleep 5 else echo "OK" fi #### tinc pruefen PRG="tinc" BACK=`pgrep -x tincd` echo -n "check $PRG: " if [ -z "$BACK" ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### isc-dhcp-relay pruefen PRG="isc-dhcp-relay" BACK=`pgrep -x dhcrelay` echo -n "check $PRG: " if [ -z "$BACK" ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### bird pruefen PRG="bird" BACK=`pgrep -x $PRG` echo -n "check $PRG: " if [ -z "$BACK" ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### bird6 pruefen PRG="bird6" BACK=`pgrep -x $PRG` echo -n "check $PRG: " if [ -z "$BACK" ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### radvd pruefen PRG="radvd" BACK=`pgrep -x $PRG` echo -n "check $PRG: " if [ -z "$BACK" ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### dnsmasq pruefen PRG="dnsmasq" BACK=`pgrep -x $PRG` echo -n "check $PRG: " if [ -z "$BACK" ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### ntpd/openntpd pruefen PRG="ntp" BACK=`pgrep -x ntpd` echo -n "check $PRG: " if [ -z "$BACK" ] ; then echo "Error" ANTWORT+="Fehler: $PRG nicht gestartet\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### dnsmasq dns Anfragen pruefen PRG="dnsmasq" # BACK=`dig @$DNSIP +noall +answer $DNSANFRAGE` BACK=`nslookup $DNSANFRAGE $DNSIP` ZAHL=`echo $BACK | grep -c $DNSBACK` echo -n "check DNS-Anfrage: " if [ "$ZAHL" -gt 0 ] ; then echo "Error" ANTWORT+="Fehler: $PRG ANTWORTet nicht auf DNS-Anfragen\nFehler: $BACK\n\n" service $PRG restart sleep 5 else echo "OK" fi #### openvpn pruefen PRG="openvpn" #ip=`ip -o -4 addr list tun0 | awk '{print $4}' | cut -d/ -f1` ip=`ip -o -4 addr list tun0 | awk '{gsub("/.*","",$4); print $4}'` echo -n "check ping web.de: " BACK=$(ping -c2 -I $ip web.de 2>&1) ZAHL=$? if [ "$ZAHL" -gt 0 ] ; then echo "Error" echo -n "check ping 8.8.8.8: " BACK=$(ping -c2 -I $ip 8.8.8.8 2>&1) ZAHL=$? fi if [ "$ZAHL" -gt 0 ] ; then echo "Error" else echo "OK" echo -n "check masquerate: " nat=$(iptables -vnt nat -L | grep MASQUERADE | wc -l) if [ "$nat" -ne 1 ] ; then echo "Error" ZAHL=99 BACK=$(iptables -vnt nat -L) fi fi if [ "$ZAHL" -gt 0 ] ; then ANTWORT+="Fehler: $PRG funktioniert nicht korrekt\nFehler: $BACK\n\n" service $PRG restart ((VPNERROR++)) if [ $VPNERROR -gt 1 ] ; then # Config wechseln wenn vpn erneut down mv $OVPN/00.conf $OVPN/00.ovpn mv $OVPN/01.ovpn $OVPN/00.conf mv $OVPN/02.ovpn $OVPN/01.ovpn mv $OVPN/03.ovpn $OVPN/02.ovpn mv $OVPN/00.ovpn $OVPN/03.ovpn service $PRG restart ANTWORT+="$PRG Config gewechselt nach $(cat $OVPN/00.conf | grep remote)\n\n" fi if [ $VPNERROR -gt 3 ] ; then # Gateway deaktivieren wenn zu viele Fehler for ZAHL in $IFBAT ; do batctl -m $ZAHL gw off ANTWORT+="$ZAHL: gw off\n\n" done VPNERROR=0 VPNDOWN=1 fi else echo "OK" VPNERROR=0 if [ $VPNDOWN -gt 0 ] ; then # Gateway aktivieren for ZAHL in $IFBAT ; do batctl -m $ZAHL gw server 64mbit/64mbit ANTWORT+="$ZAHL: gw server 64mbit/64mbit\n\n" done VPNDOWN=0 fi fi # Email senden wenn Fehler auftrat if [ -n "$ANTWORT" ]; then ((EMAILZAHL++)) # Email Zaehler if [ $EMAILZAHL -le 11 ] ; then echo "Sende Email an $EMAIL" echo -e "$ANTWORT" | mutt -s "Fehler auf Server $HOSTNAME" $EMAIL fi else EMAILZAHL=0 fi if [ -z "$TESTMODE" ]; then sleep 50 fi sleep 10 done
rc.local hinzufügen vor dem 'exit 0
'
/usr/local/bin/check_tasks &
Gateway sicher vom Netz nehmen
Wenn ein Gateway aus dem Netz raus soll, bitte wiefolgt vorgehen, damit es keine Ausfälle bei den Nodes und Clients gibt
- update-ff und check-tasks scripte beenden
- batctl gw off
- 1 Minute warten
- DHCP Server deaktivieren, bei Dnsmasq die Datei /etc/dnsmasq.d/dhcp entfernen und dnsmasq neu starten
- 10 Minuten warten, damit die Clients eine IP vom Alternativ-DHCP Server bekommen
- fastd beenden
gw setup howto