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