Inhaltsverzeichnis

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

/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

gw setup howto