Freifunk MWU Gateway Doku Release 0.1 beta Freifunk-MWU 14.04.2016 Inhaltsverzeichnis 1 Beschreibung 1 2 Intro 2.1 Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Netzplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Gluon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 6 10 3 Konfiguration 3.1 Grundkonfiguration 3.2 Netzwerk Interfaces 3.3 Policy Routing . . . 3.4 DNS-DHCP-IP . . . 3.5 fastd . . . . . . . . 3.6 A.L.F.R.E.D. . . . . 3.7 Apache . . . . . . . 3.8 IC-VPN . . . . . . . 3.9 Internet-Exit . . . . 3.10 Aufräumarbeiten . . . . . . . . . . . . 11 11 14 15 17 20 22 24 26 29 43 4 Betrieb 4.1 Funktionstests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Workflows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Backend Scripte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 47 51 53 5 Mitwirken 57 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i ii KAPITEL 1 Beschreibung In dieser Anleitung wird beschrieben, wie wir unsere Gateway-Server für Freifunk aufsetzen. Freifunk Mainz, Wiesbaden & Umgebung versorgt mit dieser Gateway Infrastruktur mehrere Communities, aktuell Freifunk-Mainz und Freifunk-Wiesbaden. Aus diesem Grund sind alle Konfigurationen darauf ausgelegt, sofern möglich und sinnvoll, die Communities logisch zu trennen. An dieser Stelle sei darauf hingewiesen, dass es sich also nicht um eine Gateway Anleitung für den Infrastrukturaufbau für eine einzige Community handelt. Es ist aber durchaus möglich die hier aufgezeigten Konfigurationen dahingehend zu adaptieren. Ziel des Ganzen soll nicht eine Auflistung von Konfigurationen sein, eher wollen wir am Beispiel derer unsere Gedankengänge und Hintergründe dazu beleuchten. Die aktuelle Konfiguration der Gates ist jederzeit im gateway-configs.git zu finden. Grundsätzlich dienen bei der Konfiguration eines neuen Gateways die bekannte Konfiguration der bestehenden Gates als Vorbilder. Trotzdem werden hier wichtige Punkte explizit beschrieben und zusammengefasst. Geschrieben in Zusammenarbeit von Freifunk-Mainz and Freifunk-Wiesbaden als freifunk-mwu auf GitHub. Eine augenfreundliche Version dieser Dokumentation findet sich unter ffmwu-gateway-doku.readthedocs.org! 1 Freifunk MWU Gateway Doku, Release 0.1 beta 2 Kapitel 1. Beschreibung KAPITEL 2 Intro 2.1 Voraussetzungen • voller Root Zugriff für alle Admins • öffentliche IPv4 Adresse • öffentliche IPv6 Adresse • voller Kernelzugriff – Linux direkt installiert, – oder als KVM-Instanz (OpenVZ o.ä. nicht möglich) • Momentan: Ubuntu 14.04 LTS Server 2.1.1 Betrieb und Zugang Wir stellen mit einem oder mehreren Gateways in Vereinshand eine Basisversorgung sicher. Gerne sollen weitere Gateways aufgesetzt werden. Redundanz schafft Vertrauen! Wer ein weiteres Gate betreiben möchte, muss sich vor der Installation in einigen technischen Punkten mit der AdminGruppe abstimmen. Möglichst viele Informationen sollen auch in dieser Dokumentation zu finden sein. Am Besten wird der Gate-Betreiber gleich Teil des Admin-Teams :) Jeder Admin muss die Möglichkeit haben jederzeit an jeder Stelle jedes beliebige Problem fixen zu können (und zu dürfen). Die technischen Details zur Umsetzung sind der Admin-Gruppe bekannt. 2.1.2 Schema Was wir für Dienste aufsetzen und wie diese inneinandergreifen lässt sich am Besten anhand einer schematischen Darstellung erklären: 3 Freifunk MWU Gateway Doku, Release 0.1 beta 2.1.3 Funktionen & dafür benötigte Software Momentan kommen auf allen Gateways eine Ubuntu Server 14.04 LTS Installation zum Einsatz. Jeweils angepasst auf die entsprechenden Plattformen (Direkt auf dem Host, oder als KVM-Instanz). Für viele der Gate-Funktionen wird weitere Software benötigt, die größtenteils als Pakete aus den Ubuntu- und weiteren Repositories nachinstalliert werden kann. Siehe auch: • Pakete • Benötigte Repositories Verbindung der Teilwolken Die Nodes bauen ihr Freifunk mit dem Mesh-Protokoll B.A.T.M.A.N selbständig auf. Da das Netz aber noch nicht dicht genug ist, dass alle Nodes sich über ihre Funk-Interfaces erreichen können, helfen wir über eine VPN-Verbindung über das Internet nach, um einzelne Wolken zu überbrücken. So wie über ihre Funk-Interfaces, sprechen die Nodes das B.A.T.M.A.N Protokoll auch über ihre VPN-Verbindungen. Die Gates agieren als Fokuspunkte für dieses VPN. d.h. alle am VPN teilnehmenden Nodes verbinden sich zu den Gates und Nodes und Gates spannen so das VPN auf. Alle Gates verbinden sich für das VPN auch vollständig untereinander. So entsteht eine Multi-Stern-Architektur. Alle Sternmittelpunkte sind untereinander voll vermascht. Auf den Gates werden hierzu fastd sowie das Kernel Modul batman_adv benötigt. Siehe auch: • Pakete 4 Kapitel 2. Intro Freifunk MWU Gateway Doku, Release 0.1 beta • fastd Mainz und Wiesbaden Freifunk Mainz und Freifunk Wiesbaden werden als zwei getrennte Netze betrieben. Das soll von Beginn an die Mesh-Wolken kleiner halten. Mesh-Protokolle skalieren nicht sehr gut, wenn viele Knoten teilnehmen. (Grenze ab ca. 200 Nodes) Das bedeutet, dass es zwei B.A.T.M.A.N Wolken gibt, was wiederum bedeutet, dass es auch zwei fastd VPNs pro Gateway gibt. Aus Gründen der Effizienz unterstützen die Gates aktuell jeweils beide Netze. Siehe auch: • Netzplan Sollten die Netze in Zukunft stark wachsen, könnten weitere Aufteilungen nötig werden. DHCP für die Clients Nodes, Clients und Gates sind über ein Layer-2-Netz miteinander verbunden (B.A.T.M.A.N, s. o.). Bemerkung: Oben ist zu lesen, dass es zwei Layer-2-Netze gibt. Im Folgenden wird immer eines davon betrachtet; das andere funktioniert analog. Die Gates halten auch als DHCP-Server für die Clients her. Verfügbare IPv4-Ranges, aus denen der DHCP-Server vergeben darf, müssen innerhalb bzw. mit der Admin-Gruppe abgestimmt werden, und werden im Netzplan festgehalten. Hierfür wird isc-dhcp-server genutzt. Für das vorbereitende Ausrollen von IPv6 Adressen benötigen wir hier auch radvd. Siehe auch: • DHCPd • RAdvD Übergang ins restliche Internet Der Übergang ins Internet wird durch einen VPN-Tunnel nach Schweden oder in die Niederlande (ipredator.se, mullvad.net) getunnelt - im Falle von IPv4 ist das auch kaum anders zu realisieren, da die verwendeten Netze 10.37.0.0/16 und 10.56.0.0/16 im Internet nicht geroutet werden. Zu diesem Zweck wird ein weiteres VPN zu einem Anbieter aufgebaut und aller Freifunk-Traffic dort entlang geschickt. Damit dies gelingt muss auch dem Gate, in Richtung des Anbieters auch ein NATing (masquerading) erfolgen. Zur besseren Administrierbarkeit wird jedes B.A.T.M.A.N-Interface noch in jeweils einer Netzwerk-Bridge gekapselt. An dieser Stelle wird einiges an zusätzlicher Software gebraucht: bridge-utils, iproute, iptables & openvpn. Siehe auch: • Pakete 2.1. Voraussetzungen 5 Freifunk MWU Gateway Doku, Release 0.1 beta • Netzwerk Interfaces • Routing Tabellen • Policy Routing • Internet-Exit Übergang zu anderen Freifunk-Communities (InterCityVPN) Wie auch bei uns, so sind auch die IPv4-Netze der anderen Freifunk-Communities nicht über das restliche Internet zu erreichen. Damit interne Dienste auch aus anderen Städten genutzt werden können, wurde das IC-VPN als Verbindung der Freifunk-Communities untereinander in’s Leben gerufen. Als Software benutzen wir hier tinc und bird6. Siehe auch: • Pakete • Netzwerk Interfaces • Routing Tabellen • Policy Routing • icvpn – IC-VPN Datenschutz auf dem Gateway Unsere Gateways loggen keinen Traffic! Alles was existiert sind die zur Laufzeit benötigten Verbindungsdaten. DHCP-Leases, Batman Protokolldaten und die ARP-Tabelle. Diese werden nur im Arbeitsspeicher vorgehalten, ist das Gateway aus (z.B. die Herren in Grün nehmen den Server mit), sind diese i.d.R. weg. Siehe auch: • Logging 2.2 Netzplan Freifunk Mainz & Freifunk Wiesbaden sind TCP/IP-basierte Netzwerke. Deshalb haben die beteiligten Computer (Clients, Gates und die Knoten) jeweils IP-Adressen, die eindeutig sein müssen. Wird (z. B. aus Versehen) eine Adresse mehrfach verwendet, so führt das zu Problemen im Betrieb. Andererseits müssen alle Adressen im Freifunk Mainz oder Freifunk Wiesbaden zum dem selben Adressbereich, sowie zum selben Netz gehören. 6 Kapitel 2. Intro Freifunk MWU Gateway Doku, Release 0.1 beta 2.2.1 IPv4 Wir haben für unserer Freifunk-Communities folgende Netze zugewiesen bekommen: • Mainz - 10.37.0.0/16 = 37 • Wiesbaden - 10.56.0.0/16 = 56 Datenpakete aus diesen Adressbereichen werden innerhalb des Freifunks vermittelt, im großen weiten Internet aber nicht geroutet (Hintergrundinformationen dazu gibt es hier). Unser großes 10.X.0.0/16 (mit 65536 Adressen) teilen wir uns ein wenig ein: 10.X.0.0/16 wird nicht komplett genutzt, um in Zukunft noch was auf Halde zu haben. Wachsen ist immer einfacher als schrumpfen. Wir nutzen von diesem Netz erstmal das untere Viertel: 10.X.0.0/18: Netz 10.X.0.0/24 10.X.1.0/24 10.X.2.0/23 10.X.4.0/22 10.X.8.0/21 10.X.16.0/22 10.X.20.0/22 10.X.24.0/22 10.X.28.0/22 10.X.32.0/22 10.X.36.0/22 10.X.40.0/22 10.X.44.0/22 10.X.48.0/22 10.X.52.0/22 10.X.56.0/22 10.X.60.0/22 (bis) 10.X.0.255 10.X.1.255 10.X.3.255 10.X.7.255 10.X.15.255 10.X.19.255 10.X.23.255 10.X.27.255 10.X.31.255 10.X.35.255 10.X.39.255 10.X.43.255 10.X.47.255 10.X.51.255 10.X.55.255 10.X.59.255 10.X.63.255 Verwendung Gateways ¬ Backbone User Services ¬ Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range Client DHCP-Range verteilt durch fix ¬ fix fix ¬ Lotuswurzel Spinat Zitronengras Parmesan Kaschu Wasserfloh ¬ ¬ ¬ ¬ ¬ Mettigel status in Betrieb frei in Betrieb in Betrieb frei in Betrieb in Betrieb in Betrieb in Betrieb in Betrieb in Betrieb frei frei frei frei frei Testbetrieb 2.2.2 IPv6 Wir nutzen das IPv6 ULA Prefix fdXX:b4dc:4b1e::/48 Dieses ist bei SixXS an zentraler Stelle registriert, siehe fd37:b4dc:4b1e::/48 oder fd56:b4dc:4b1e::/48 IPv6 Subnetze haben immer eine Prefix-Länge von 64 Bit. Durch das /48 Subnetz stehen uns also 2^16 = 65536 /64 IPv6 Subnetze zur Verfügung. Fürs erste wird allein dieses IPv6 Subnetz verwendet: fdXX:b4dc:4b1e:0000::/64 (abgekürzt: fdXX:b4dc:4b1e::/64, siehe Address Notation). 2.2.3 Interface Bezeichnung Wir vergeben unsere Interface-Bezeichnungen einheitlich! eth0 Mainz Wiesbaden eth0 Mesh (Nodes) mzVPN wiVPN B.A.T.M.A.N mzBAT wiBAT Bridge mzBR wiBR Intercity-VPN Exit VPN icVPN exitVPN Dies erleichtert das Scripten und Debuggen. 2.2. Netzplan 7 Freifunk MWU Gateway Doku, Release 0.1 beta 2.2.4 Namenskonvention Als Hostname der Gateways nehmen wir “irgendwas mit Nahrung”. 2.2.5 Next Node Adressen Die Next Node Adressen sind dafür da, um sich im Fehler- oder Troubleshootingfall mit einem Freifunk Knoten zu verbinden. Diese Adressen sind auf jedem Knoten gleich. Der Freifunker muss sich nur diese Adresse(n) merken und seine Netzwerkkarte für ein Subnetz konfigurieren, in dem diese Adresse(n) liegt um auf seinen Knoten zuzugreifen. Wir nutzen dazu die jeweils niedrigsten Adressen • Mainz: – IPv4: 10.37.0.1 – IPv6: fd37:b4dc:4b1e::1 • Wiesbaden: – IPv4: 10.56.0.1 – IPv6: fd56:b4dc:4b1e::1 2.2.6 Gateway-Schema Bevor wir ein Gateway aufsetzen definieren wir einen Namen (leichter zu merken) und ziehen eine Nummer (1 <= x < 255). Mit den uns zugewiesenen Netznummern sowie der Gateway-Nummer und dem Gateway-Namen werden alle benötigten Informationen abgeleitet: • IPv4 – Das Netz von unten auffüllen (10.x.0.0/24 ist für Gateways) • MAC-Adresse – Privates Prefix (02:00) + IPv4-Adresse in hexadezimal – Beispiele (für Mainz): * 10.37.0.1 -> 02:00:0a:25:00:01 * 10.37.23.42 -> 02:00:0a:25:17:2a * 10.37.254.2 -> 02:00:0a:25:fe:02 – Beispiele (für Wiesbaden): * 10.56.0.1 -> 02:00:0a:38:00:01 * 10.56.23.42 -> 02:00:0a:38:17:2a * 10.56.254.2 -> 02:00:0a:38:fe:02 – Wer zu faul zum rechnen ist, darf auch gerne den IP2MAC-Konverter nutzen. • IPv6 – Range-Prefix (fd37:b4dc:4b1e bzw. fd56:b4dc:4b1e) + IPv4 Adresse in hexadezimal, Doppelpunkte anpassen, führende Nullen streichen 8 Kapitel 2. Intro Freifunk MWU Gateway Doku, Release 0.1 beta – Beispiele (für Mainz): * gate02 -> fd37:b4dc:4b1e::0a25:0002/64 * gate05 -> fd37:b4dc:4b1e::0a25:0005/64 – Beispiele (für Wiesbaden, abgekürzt): * gate02 -> fd56:b4dc:4b1e::a38:2/64 * gate23 -> fd56:b4dc:4b1e::a38:17/64 • DNS – xxxx.freifunk-mwu.de -> A- + AAAA-Record – gateXX.freifunk-mwu.de -> CNAME auf s.o. – Reverse DNS Eintrag korrekt setzen für Haupt DNS Namen: xxxx.freifunk-mwu.de • IC-VPN – Soll ein gate am IC-VPN teilnehmen benötigt es dafür noch weitere Einträge. Hier kann ein gate immer nur im Namen einer der Communities auftreten, auch wenn es technisch trotzdem für alle Communities agiert. (s. a. IC-VPN) – Kurzname: [Stadt][Nr], z. B. mainz2 – DNS-Eintrag zum Aufbau des Transfernetzes ic-[stadt][Nr].freifunk-[stadt].de -> CNAME nach dem Muster – IP-Adressen (v4 und v6) im IC-VPN-Transfernetz, z. B. 10.207.1.37, fec0: :a:cf:1:25 2.2.7 Beispiel Gateway: Lotuswurzel - Nummer: 23 Zahlen umwandeln: dec 10 37 0 23 56 hex 0a 25 00 17 38 und einsetzen: Lotuswurzel IPv4 IPv6 MAC DNS1 DNS2 CNAME1 CNAME2 Mainz Wiesbaden IC-VPN 10.37.0.23 10.56.0.23 10.207.0.56 fd37:b4dc:4b1e:0a25:00017 fd37:b4dc:4b1e:a38:17 fec0: :a:cf:0:38 02:00:0a:25:00:17 02:00:0a:38:00:17 02:00:0a:cf:00:38 lotuswurzel.freifunk-mwu.de lotuswurzel.freifunk-mwu.de . lotuswurzel.ffmz.org lotuswurzel.ffwi.org . gate23.freifunk-mwu.degate23.freifunk-mwu.deic-wiesbaden1.freifunk-wiesbaden.de gate23.ffmz.org 2.2. Netzplan gate23.ffwi.org . 9 Freifunk MWU Gateway Doku, Release 0.1 beta 2.3 Gluon Gluon entstand in Lübeck aus dem Bedarf heraus, einheitliche OpenWRT-Images für Freifunk-Nutzer herauszugeben, die bereits vorkonfiguriert und mit allen Packages versehen waren. Da es nicht nur in Lübeck Freifunk gibt, wurden alle Elemente zusammen getragen, modularisiert, und für alle Freifunk-Communities veröffentlicht. Vielen Dank! Es ist ein Aufsatz, der den normalen OpenWRT Source Code hernimmt, patcht, und anhand der Konfiguration alles zurechtrückt um den OpenWRT-Bauprozess für einen Satz unterstützter Router-Modelle zu starten. Dabei können dem OpenWRT noch weitere Pakete untergeschoben werden. Heraus fallen fertige Images, vorkonfiguriert, nur noch flashen ist nötig. Bonus: Die Images werden noch fein mit elliptischen Kurven signiert, um ein automatisches Updaten zu ermöglichen (Autoupdater ist ein Standard OpenWRTPaket für Gluon) 2.3.1 Hintergrund zu Gluon Ein bisschen zu den Anfängen von Gluon und viel mehr zum technischen Hintergrund kann man unter folgenden Links erfahren: • http://luebeck.freifunk.net/wiki/gluon (http://luebeck.freifunk.net/wiki/Firmware) • http://luebeck.freifunk.net/wiki/fastd-schlusselverwaltung • http://nilsschneider.net/2012/12/24/openwrt-autoupdater.html • http://nilsschneider.net/2013/02/17/fastd-tutorial.html 2.3.2 Links & Dokumentation • Gluon Code: https://github.com/freifunk-gluon/gluon • Gluon Pakete: – https://github.com/freifunk-gluon/gluon/tree/master/package – https://github.com/freifunk-gluon/packages • Gluon Konfiguration (site.conf) https://github.com/freifunk-gluon/gluon/tree/master/docs/site-example • Dokumentation: http://gluon.readthedocs.org/ • Github Wiki: https://github.com/freifunk-gluon/gluon/wiki • fastd: http://fastd.readthedocs.org/ • Doku aus Hamburg: https://wiki.freifunk.net/Freifunk_Hamburg/Firmware#Gluon 2.3.3 Gluon in MWU Für Mainz und Wiesbaden nutzen wir den unveränderten Quellcode, frisch aus Lübeck. Unter den folgenden Links gelangt man zu unserer Gluon Konfiguration sowie unser Packages-Repo. • site.conf: https://github.com/freifunk-mwu/site-ffmwu • packages: https://github.com/freifunk-mwu/packages-ffmwu Gebaut wird mit gluon-builder-ffmwu. 10 Kapitel 2. Intro KAPITEL 3 Konfiguration 3.1 Grundkonfiguration 3.1.1 Hostname Den Hostnamen setzen (ohne Domain): echo "hostname" > /etc/hostname /etc/hosts (am Beispiel von Lotuswurzel): 127.0.0.1 144.76.209.100 localhost lotuswurzel.freifunk-mwu.de lotuswurzel # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters 2a01:4f8:192:520::b4dc:4b1e lotuswurzel.freifunk-mwu.de lotuswurzel 3.1.2 Routing Tabellen /etc/iproute2/rt_tables: # # reserved values # 255 local 254 main 253 default 0 unspec # # local # # icvpn table 23 icvpn #local community table 41 mwu # internet exit table 61 ffinetexit 11 Freifunk MWU Gateway Doku, Release 0.1 beta 3.1.3 Wichtige Kernel Parameter /etc/sysctl.conf: # Freifunk specific settings net.ipv4.ip_forward=1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv6.conf.all.forwarding=1 net.ipv6.conf.all.autoconf = 0 net.ipv6.conf.default.autoconf = 0 net.ipv6.conf.eth0.autoconf = 0 net.ipv6.conf.all.accept_ra = 0 net.ipv6.conf.default.accept_ra = 0 net.ipv6.conf.eth0.accept_ra = 0 # decrease nf_conntrack_tcp_timeout_established - default=432000 net.netfilter.nf_conntrack_tcp_timeout_established=86400 # increase conntrack table size - default=65535 net.netfilter.nf_conntrack_max=262140 # <3.18 Kernel noch folgendes hinzufügen: net.bridge.bridge-nf-call-arptables = 0 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 Der letzte Teil sorgt dafür, dass die Firewall ip(6)tables und arptables nicht im Bridge-Interface filtern. Wir wollen aber auf OSI Layer 2 nichts filtern. In neueren Kerneln gibt es jetzt ein eigenes Modul (bridge_filter) das nicht automatisch geladen wird und somit nicht aktiv ist. Ältere Kernel (<3.18) haben diese Filter per default aktiv. Danach neuladen: sysctl -p /etc/sysctl.conf Damit die Parameter net.netfilter.nf_conntrack* automatisch beim Booten gesetzt werden muss das Kernel Modul nf_conntrack geladen werden. Um das zu erreichen listen wir es in der Datei /etc/modules: ... nf_conntrack 3.1.4 Benötigte Repositories • Freifunk MWU Repository einbinden: add-apt-repository ppa:freifunk-mwu/freifunk-ppa • add-apt-repository Installieren (optional): apt-get install software-properties-common • Neoraiders Repository einbinden (für fastd): echo "deb https://repo.universe-factory.net/debian/ sid main" > /etc/apt/sources.list.d/freifunk apt-key adv --keyserver keyserver.ubuntu.com --recv 16EF3F64CB201D9C • Repo für aktuelle BIRD Version: 12 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta add-apt-repository ppa:cz.nic-labs/bird Zum Schluss: apt-get update apt-get dist-upgrade 3.1.5 Pakete Pakete aus den Standard-Repos installieren: xargs apt-get install -y apache2 apt-transport-https bind9 bird bridge-utils ethtool git haveged iproute iptables iptables-save iptables-persistent isc-dhcp-server man-db mosh ntp openvpn python-argparse python3 python3-netifaces radvd rrdtool sysfsutils vim vnstat vnstati <CTRL>-d Pakete aus den eigenen Repositories installieren: apt-get install -y alfred alfred-json batadv-vis batctl batman-adv-dkms fastd tinc Python Pakete via pip: pip3 install py-cpuinfo 3.1.6 Sysfs Parameter In der Datei /etc/sysfs.d/99-freifunk.conf nehmen wir die nötigen sysfs-Konfigurationen vor: # increase batman-adv hop penalty (default=15) class/net/mzBAT/mesh/hop_penalty = 60 class/net/wiBAT/mesh/hop_penalty = 60 3.1. Grundkonfiguration 13 Freifunk MWU Gateway Doku, Release 0.1 beta # increase multicast hash table of freifunk bridges (default=512) class/net/mzBR/bridge/hash_max = 2048 class/net/wiBR/bridge/hash_max = 2048 Batman-adv Modifikationen müssen für jede batman-adv Instanz vorgenommen werden. 3.1.7 NTP Da die Kisten recht viel mit Crypto machen, ist es von Vorteil eine halbwegs genaue Uhrzeit parat zu haben. Die /etc/ntp.conf bleibt nahezu unverändert: # /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help driftfile /var/lib/ntp/ntp.drift # Specify one or more NTP servers. server 0.de.pool.ntp.org server 1.de.pool.ntp.org server 2.de.pool.ntp.org server 3.de.pool.ntp.org # Use Ubuntu's ntp server as a fallback. server ntp.ubuntu.com # By default, exchange time with everybody, but don't allow configuration. restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1 Im DHCPd werden alle Gateways als Zeitquellen konfiguriert und verteilt. 3.2 Netzwerk Interfaces /etc/network/interfaces Wir richten uns hier je eine bridge pro Mesh-Wolke, die wir versorgen wollen, ein. Auf diese bridges binden sich die Dienste (wie DHCP, DNS, NTP, etc..). Das hoch/runterfahren der VPNs oder das (neu-)starten von Diensten kann dadurch unabhängig voneinander geschehen. Siehe auch: • fastd • DHCPd • Routing Tabellen • Policy Routing • Internet-Exit Hier eine bridge mit IPv4 und IPv6 am Beispiel von Wiesbaden: 14 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta auto wiBR iface wiBR inet static hwaddress 02:42:0a:38:00:XX address 10.56.0.X netmask 255.255.192.0 pre-up /sbin/brctl addbr $IFACE up /sbin/ip address add fd56:b4dc:4b1e::a38:X/64 dev $IFACE post-down /sbin/brctl delbr $IFACE Siehe auch: • Routing Tabellen • Policy Routing • Gateway-Schema • Interface Bezeichnung Wir haben uns dazu entschieden jegliche Up- & Down Scripte in der /etc/network/interfaces zu verwalten. Dies gestaltet alles übersichtlicher. Scripte für fastd: allow-hotplug wiVPN iface wiVPN inet6 manual hwaddress 02:00:0a:38:00:X pre-up /sbin/modprobe batman-adv post-up /usr/sbin/batctl -m wiBAT if add $IFACE post-up /sbin/ip link set dev wiBAT up Zum Schluss noch für das B.A.T.M.A.N. Interface: allow-hotplug wiBAT iface wiBAT inet6 manual pre-up /sbin/modprobe batman-adv post-up /sbin/brctl addif wiBR $IFACE post-up /usr/sbin/batctl -m $IFACE it post-up /usr/sbin/batctl -m $IFACE vm post-up /usr/sbin/batctl -m $IFACE gw pre-down /sbin/brctl delif wiBR $IFACE 10000 server server 96mbit/96mbit || true 3.3 Policy Routing Wir setzen auf unseren Gateways Policy Routing ein, um den Netzwerkverkehr in die richtige Routing-Tabelle zu schubsen. Wie Policy Routing unter Linux funktioniert kann hier nachgelesen werden: • LARTC • Policy-Routing Unter Linux konfiguriert man Routing Policies über sogenannte IP Rules. Damit diese immer vorhanden sind lassen wir diese über das rc.local-Script setzen. /etc/rc.local: 3.3. Policy Routing 15 Freifunk MWU Gateway Doku, Release 0.1 beta # # IP rules # # Priority 7 - lookup rt_table mwu for all incoming traffic of freifunk related interfaces ip -4 rule add from all iif mzBR lookup mwu priority 7 ip -4 rule add from all iif wiBR lookup mwu priority 7 ... <IPv4 rules für IC-VPN> <IPv4 rules für Internet Exit> ... ip -6 rule add from all iif mzBR lookup mwu priority 7 ip -6 rule add from all iif wiBR lookup mwu priority 7 ... <IPv6 rules für IC-VPN> <IPv6 rules für Internet Exit> ... # Priortiy ip -4 rule ip -4 rule ip -6 rule ip -6 rule 23 - lookup rt_table icvpn for all add from all iif mzBR lookup icvpn add from all iif wiBR lookup icvpn add from all iif mzBR lookup icvpn add from all iif wiBR lookup icvpn incoming priority priority priority priority traffic of freifunk bridges 23 23 23 23 # Priority 41 - lookup rt_table ffinetexit for all incoming traffic of freifunk bridges ip -4 rule add from all iif mzBR lookup ffinetexit priority 41 ip -4 rule add from all iif wiBR lookup ffinetexit priority 41 ... <IPv4 rules für Internet Exit> <IPv6 rules für Internet Exit> ... # Priority 61 - at this point this is the end of policy routing for freifunk related routes ip -4 rule add from all iif mzBR type unreachable priority 61 ip -4 rule add from all iif wiBR type unreachable priority 61 ... <IPv4 rules für Internet Exit> ... ip -4 rule add from all iif icVPN type unreachable priority 61 ip -4 rule add from all iif eth0 type unreachable priority 61 ip -6 rule add from all iif mzBR type unreachable priority 61 ip -6 rule add from all iif wiBR type unreachable priority 61 ip -6 rule add from all iif icVPN type unreachable priority 61 ... <IPv6 rules für Internet Exit> ... ip -6 rule add from all iif eth0 type unreachable priority 61 # Priority ip -4 rule ip -4 rule ip -6 rule ip -6 rule 107 add add add add - lookup from all from all from all from all policies for the gateway host self originating traffic lookup mwu priority 107 lookup icvpn priority 107 lookup mwu priority 107 lookup icvpn priority 107 Wie zu erkennen ist verwenden wir 3 Routing Tabellen: • icvpn (wird dynamisch über BGP gefüllt) • mwu (enthält statische Routen der Community-Netze) 16 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta • ffinetexit (enthält Routen für den Internet-Verkehr) Die IP Rules für den Internet-Exit hängen von der gewählten Variante ab, mehr Informationen dazu im Abschnitt Internet-Exit Zusätzlich zu den IP Rules befüllen wir über das rc.local-Script auch die Routing-Tabellen mwu und icvpn mit den nötigen statischen Routen: # # IP routes # # static route for icvpn transfer-net /sbin/ip -4 route add 10.207.0.0/16 proto static dev icVPN table icvpn /sbin/ip -6 route add fec0::/96 proto static dev icVPN table icvpn # static mainz routes for rt_table mwu /sbin/ip -4 route add 10.37.0.0/18 proto static dev mzBR table mwu /sbin/ip -6 route add fd37:b4dc:4b1e::/64 proto static dev mzBR table mwu # static wiesbaden routes for rt_table mwu /sbin/ip -4 route add 10.56.0.0/18 proto static dev wiBR table mwu /sbin/ip -6 route add fd56:b4dc:4b1e::/64 proto static dev wiBR table mwu 3.4 DNS-DHCP-IP 3.4.1 BIND /etc/bind/named.conf.options: options { directory "/var/cache/bind"; dnssec-validation auto; auth-nxdomain no; # conform to RFC1035 listen-on { 127.0.0.1; 10.37.0.X; 10.56.0.X; 10.207.0.X; }; listen-on-v6 { ::1; fd37:b4dc:4b1e::a25:17; fd56:b4dc:4b1e::a38:17; fec0::a:cf:0:38; }; allow-transfer { any; }; allow-query { any; }; allow-recursion { 127.0.0.1; ::1; intern-mz; intern-wi; }; }; Wichtig: listen-on, listen-on-v6 ausschließlich auf die lokalen Interfaces und die IC-VPN Interfaces zeigen lassen. Jedes Gate ist ein Slave für DNS (DNS Master läuft auf einem Service Server). DNS-Slave Die /etc/bind/named.conf.local bekommt pro Mesh-Wolke (z.B. für Wiesbaden): masters "ns-master-wi" { fd56:b4dc:4b1e::a38:103; }; 3.4. DNS-DHCP-IP 17 Freifunk MWU Gateway Doku, Release 0.1 beta acl "intern-wi" { 10.56.0.0/16; fd56:b4dc:4b1e::/48; }; // Intern Zones for Freifunk zone "ffwi.org." { type slave; file "ffwi.org.db"; masters { ns-master-wi; }; }; zone "user.ffwi.org." { type slave; file "user.ffwi.org.db"; masters { ns-master-wi; }; }; // Reverse Zones zone "56.10.in-addr.arpa" { type slave; file "56.10.in-addr.arpa.db"; masters { ns-master-wi; }; }; zone "e.1.b.4.c.d.4.b.6.5.d.f.ip6.arpa" { type slave; file "fd56:b4dc:4b1e_48.ip6.arpa.db"; masters { ns-master-wi; }; }; Danach einen DNS-Eintrag auf sich selbst setzen: Siehe auch: Lokaler DNS Resolver 3.4.2 DHCPd Aus dem Netzplan wird sich eine Range gezogen. In den Header der /etc/dhcp/dhcpd.conf kommt: ddns-update-style none; authoritative; server-name "lotuswurzel"; log-facility local6; default-lease-time 300; min-lease-time 300; max-lease-time 300; Die Direktive server-name ist auf den Hostnamen des jeweiligen Gateways anzupassen. Wir wählen hier eine kurze Lease Time, damit die Clients maximal 5 Minuten offline sind. Pro Mesh-Wolke verteilen wir jeweils eine Range (z.B. für Wiesbaden): 18 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta subnet 10.56.0.0 netmask 255.255.192.0 { range 10.56.X.0 10.56.X.255; # Use our own IP as gateway for our clients option routers 10.56.0.X; # DNS server to be pushed to our clients. option domain-name-servers 10.56.0.X; option domain-search "ffwi.org", "user.ffwi.org"; # NTP Server pushed to our clients option ntp-servers 10.56.0.X; # Set interface mtu option interface-mtu 1350; } Wichtig: domain-name-server und ntp-servers nur auf das Gate selbst setzen. Warnung: Obwohl der DHCPd normalerweise regelmäßig sein Lease-File aufräumen soll, wird durch ein anscheinend übermäßig restriktives AppArmor-Profil der nötige Dateizugriff unterbunden. Hier ist der relevante Bugreport, leider ist nicht absehbar wann das gefixt wird, da ISC und Ubuntu sich gegenseitig den Schwarzen Peter zuschieben. Der Bug verhindert, dass beim Rotieren des Lease-Files die alten Leases nicht aufgeräumt werden können, und somit auf ewig erhalten bleiben. Dies gilt zu vermeiden. Fix Im Bugreport wird von einem Fix berichtet, der die ACLs des Lease-Files korrekt setzt: Wir installieren uns zunächst das Programm acl nach, stoppen den DHCPd, und setzen die ACLs: apt-get install acl service isc-dhcp-server stop setfacl -dm u:dhcpd:rwx /var/lib/dhcp setfacl -m u:dhcpd:rwx /var/lib/dhcp service isc-dhcp-server start Unter etc/default/isc-dhcp-server konfigurieren wir, auf welchen Interfaces der dhcpd lauschen soll. Wir wählen die beiden bridges: INTERFACES="mzBR wiBR" Siehe auch: • Netzwerk Interfaces • Lokaler DNS Resolver • NTP 3.4. DNS-DHCP-IP 19 Freifunk MWU Gateway Doku, Release 0.1 beta 3.4.3 RAdvD Die Konfigurationsdatei muss manuell angelegt werden. Pro Mesh-Wolke verteilen wir jeweils ein Prefix. /etc/radvd.conf (z.B. für Mainz): interface mzBR { AdvSendAdvert on; IgnoreIfMissing on; MaxRtrAdvInterval 900; AdvLinkMTU 1350; prefix fd37:b4dc:4b1e::/64 { AdvValidLifetime 864000; AdvPreferredLifetime 172800; }; RDNSS fd37:b4dc:4b1e::a25:X { FlushRDNSS off; }; }; Wichtig: RDNSS nur auf das Gate selbst setzen. 3.5 fastd Ordnerstruktur: /etc/fastd/mzVPN - Config für Mainz /etc/fastd/mzVPN/peers - Peers für Mainz /etc/fastd/wiVPN - Config für Wiesbaden /etc/fastd/wiVPN/peers - Peers für Wiesbaden Die peers aus dem git klonen: git clone https://github.com/freifunk-mwu/peers-ffmz /etc/fastd/mzVPN/peers git clone https://github.com/freifunk-mwu/peers-ffwi /etc/fastd/wiVPN/peers Bemerkung: Damit die Backend Scripte zum synchronisieren der Keys korrekt funktionieren (die Änderungen pushen dürfen), sollte man sich zunächst um die Einrichtung dessen kümmern. Danach wird entweder die Repo-Adresse in der /etc/fastd/xyVPN/peers/.git/config direkt angepasst oder man klont die Repos neu: git clone ssh://github_mwu/freifunk-mwu/peers-ffxy /etc/fastd/xyVPN/peers Für die Backend Scripte muss der Nutzer darin schreiben dürfen: sudo chown -R admin:admin /etc/fastd/*/peers/ 20 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta 3.5.1 Konfiguration /etc/fastd/mzVPN/fastd.conf: log level warn; hide ip addresses yes; hide mac addresses yes; interface "mzVPN"; method "salsa2012+umac"; # new method (faster) # Bind von v4 and v6 interfaces bind $eure_externe_ip4:10037; bind [$eure_externe_ip6]:10037; include "secret.conf"; mtu 1406; # 1492 - IPv4/IPv6 Header - fastd Header... include peers from "peers"; status socket "/var/run/fastd-mainz.status"; /etc/fastd/wiVPN/fastd.conf: Analog zu Mainz (Ports anpassen 10037 -> 10056) 3.5.2 Schlüsselpaar generieren Das Schlüsselpaar schreibt man sich am besten in ein Tempfile: fastd --generate-key >> /etc/fastd/wiVPN/MEINTEMPFILE dauert manchmal ein bisschen :) keep calm :) Wenn euch das zu langsam ist, installiert euch den haveged daemon um mehr Entropie zu generieren. Das ganze sieht dann so aus: /etc/fastd/wiVPN/MEINTEMPFILE: Secret: "0000..ffff" Public: "ffff..0000" daraus die passenden Files erstellen (auf das ;-Zeichen achten, Groß-/Kleinschreibung beachten! ): /etc/fastd/wiVPN/secret.conf: secret "0000..ffff"; /etc/fastd/wiVPN/peers/GW_Nickname (z.B. Lotuswurzel, Spinat, Popcorn): key "ffff...0000"; Achtet auf die korrekten Schreibweisen in der Gw_Nickname und der secret.conf! Groß- und Kleinschreibung sowie das Semikolon am Ende sind wichtig, ansonsten kann es dazu kommen, dass die Bridge, Batman und VPN interfaces nicht hochkommen. 3.5. fastd 21 Freifunk MWU Gateway Doku, Release 0.1 beta 3.6 A.L.F.R.E.D. A.L.F.R.E.D. soll auf allen Gateways im Slave Modus laufen, A.L.F.R.E.D. daemons im Slave Modus senden ihre Daten zum Master. Auf dem Server, der die Freifunk Knotenkarte hostet, läuft der A.L.F.R.E.D. Master. Darüber hinaus muss auf allen Gateways zusätzlich batadv-vis im Server Modus laufen. Dies sorgt dafür, dass jedes Gate seine batman_adv neighbors und local client table über A.L.F.R.E.D. bekannt gibt. Ubuntu liefert keine A.L.F.R.E.D. Pakete mit, daher verwenden wir selbstgebaute Pakete. In unseren Paketen liefern wir für Mainz und Wiesbaden schon vorgefertigte Beispiele. Defaults beseitigen: service alfred stop service batadv-vis stop rm /etc/default/alfred rm /etc/init/alfred.conf rm /etc/init/batadv-vis.conf Danach kopieren wir die vorgefertigten Beispiele an die richige Stelle: cp cp cp cp cp cp /usr/share/doc/alfred/examples/alfred-mz.default /etc/default/alfred-mz /usr/share/doc/alfred/examples/alfred-wi.default /etc/default/alfred-wi /usr/share/doc/alfred/examples/alfred-mz.upstart /etc/init/alfred-mz.conf /usr/share/doc/alfred/examples/alfred-wi.upstart /etc/init/alfred-wi.conf /usr/share/doc/batadv-vis/examples/batadv-vis-mz.upstart /etc/init/batadv-vis-mz.conf /usr/share/doc/batadv-vis/examples/batadv-vis-wi.upstart /etc/init/batadv-vis-wi.conf Und anschließend die beiden A.L.F.R.E.D. Instanzen starten: service alfred-mz start service alfred-wi start Durch die Abhängigkeiten in den A.L.F.R.E.D. Upstart Scripts wird dafür gesorgt, dass die batadv-vis Instanzen automatisch mitgestartet und gestoppt werden. 3.6.1 Announcements Die Gateways sollen auch ein paar Daten über sich selbst via Alfred preisgeben, damit die Kartendaten rund werden. Wir danken ffnord an dieser Stelle für die ffnord-alfred-announce Scripte. Wir haben diese unseren Bedürfnissen angepasst und halten sie im Branch mwu vor: ffmwu-alfred-announce-mwu Nun clonen wir dieses Repo und wechseln in den mwu Branch: cd ~/clones git clone https://github.com/freifunk-mwu/ffnord-alfred-announce.git cd ~/clones/ffnord-alfred-announce && git checkout mwu Konfiguration Die momentan announcten Daten sind: • Nodeinfo – Hardware * model 22 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta – Network * ip addresses * primary mac * mesh interfaces – Software * autoupdater (branch/state) * batman_adv version * batman_adv gw_mode * fastd version * firmware (OS Release) – System * role * site_code – Hostname – Node ID – VPN Status • Statistics – clients – gateway (batman has selected) – idletime – loadavg – memory – node_id – processes – traffic – uptime Da wir die announce scripte mit einem normalen Benutzer ausführen, das Announcen an sich aber root Rechte erfordern benötigen wir die folgenden Wrapper-Sripts: mkdir ~/bin ~/bin/alfred #!/bin/sh exec sudo /usr/sbin/alfred $* EOCAT ~/bin/alfred-json #!/bin/sh exec sudo /usr/bin/alfred-json $* EOCAT 3.6. A.L.F.R.E.D. 23 Freifunk MWU Gateway Doku, Release 0.1 beta ~/bin/batctl #!/bin/sh exec sudo /usr/bin/batctl $* EOCAT Nun kann die crontab des Benutzers gefüllt werden (crontab -e). Die Alfred Daten sollten minütlich announced werden: * * * * * /home/admin/clones/ffnord-alfred-announce/announce.sh -i mzBR -b mzBAT -f mzVPN -s ffmz -u * * * * * /home/admin/clones/ffnord-alfred-announce/announce.sh -i wiBR -b wiBAT -f wiVPN -s ffwi -u 3.7 Apache Wir wollen keine Versionsdetails über den Apache Server preisgeben. /etc/apache2/conf-available/security.conf: ... # ServerTokens # This directive configures what you return as the Server HTTP response # Header. The default is 'Full' which sends information about the OS-Type # and compiled in modules. # Set to one of: Full | OS | Minimal | Minor | Major | Prod # where Full conveys the most information, and Prod the least. #ServerTokens Minimal ServerTokens Prod #ServerTokens Full 3.7.1 Firmware Repositories Jedes Gateway dient als Firmware Repository für die Knoten. Verzeichnisstruktur: • /var/www/html/firmware – mainz * stable * beta * experimental – wiesbaden * stable * beta * experimental Apache Konfiguration: /etc/apache2/sites-available/firmware-mainz.conf: 24 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta <VirtualHost *:80> ServerName firmware.freifunk-mainz.de ServerAlias firmware.ffmz.org ServerAdmin [email protected] DocumentRoot /var/www/html/firmware/mainz <Directory /var/www/html/firmware/mainz> Options Indexes FollowSymlinks IndexOptions FancyIndexing +FoldersFirst +HTMLTable +NameWidth=* AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet /etc/apache2/sites-available/firmware-wiesbaden.conf: <VirtualHost *:80> ServerName firmware.freifunk-wiesbaden.de ServerAlias firmware.ffwi.org ServerAdmin [email protected] DocumentRoot /var/www/html/firmware/wiesbaden <Directory /var/www/html/firmware/wiesbaden> Options Indexes FollowSymlinks IndexOptions FancyIndexing +FoldersFirst +HTMLTable +NameWidth=* AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet /etc/apache2/sites-available/firmware-mwu.conf: <VirtualHost *:80> ServerName firmware.freifunk-mwu.de ServerAdmin [email protected] DocumentRoot /var/www/html/firmware <Directory /var/www/html/firmware> Options Indexes FollowSymlinks IndexOptions FancyIndexing +FoldersFirst +HTMLTable +NameWidth=* AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet Anschließend die vhosts aktivieren und den apache daemon neuladen: a2ensite firmware-mainz.conf a2ensite firmware-wiesbaden.conf a2ensite firmware-mwu.conf 3.7. Apache 25 Freifunk MWU Gateway Doku, Release 0.1 beta apachectl -t apachectl graceful 3.8 IC-VPN Das IC-VPN beruht darauf, dass zwischen den teilnehmenden Communities ein IP-Routing (Layer 3) stattfindet. Dafür wird über tinc ein Transfernetz zwischen einigen Gates aufgebaut. Über dieses Transfernetz wird dann ge-route-t. Die Routing-Einträge auf diesen vielen Routern (Gates) werden nicht manuell, sondern per BGP gepflegt (die ASN für Wiesbaden und Mainz sind 65036 und 65037). Es gibt zwei etablierte BGP-Implmentationen: Quagga und den BIRD Daemon; wir haben uns für letztere entschieden. Auch hier folgen wir grob der zentralen Dokumentation und es sei auf das im Aufbau befindliche IC-VPN-Meta-Repository für die Metainformationen sowie auf das IC-VPN-ScriptsRepository für die Erzeugung der BGP Peers sowie DNS Config verwiesen. 3.8.1 tinc Bemerkung: Bisher ist leider noch nicht bewiesen, dass das IC-VPN-Setup für mehrere Communities auf einem Gate funktioniert. Alle Gates der am IC-VPN teilnehmenden Communities verbinden sich in einem Transfernetz untereinander. Um ihre virtuellen Kabel zusammenstecken zu können, bauen sie sich dafür einen virtuellen Switch über das Internet auf. Hierbei kommt tinc vpn zum Einsatz, ein Protokoll ganz ähnlich dem von uns intern genutzten fastd . Jedes telnehmende Gate soll einen Eintrag in der zentralen Gate-Liste haben, um IP-Adress-Kollisionen zu vermeiden. Aus Repräsentationsgründen sollte dort jede Community auch mit mindestens einem Eintrag vertreten sein. Die Lotuswurzel besetzt dort wiesbaden1 und Spinat soll mainz2 sein. Wie jedes diese Gates später auch die andere Community vertreten kann, sehen wir später (BIRD). Diese Liste soll offenbar durch ein IC-VPN-Meta-Repository auf Github abgelöst werden. In dieses Repository müssen dann Einträge in die beiden Files wiesbaden und mainz vorgenommen werden. Aktuell empfiehlt es sich, beide Informationsquellen zu pflegen: die Liste vor Beginn der Gate-Einrichtung, das Repository im Anschluss. Unsere Art, das tinc für das IC-VPN einzurichten ist angelehnt an die entsprechende Freifunk-weite Beschreibung. Die Ordnerstruktur für die Konfiguration sieht so aus: /etc/tinc/ - Basisverzeichnis /etc/tinc/icVPN/ - Config für das IC-VPN Netz /etc/tinc/icVPN/hosts/ - keys aller Gates aller teilnehmenden communities Dafür benötigen wir: mkdir /etc/tinc/icVPN chown admin:admin /etc/tinc/icVPN # !!! Die öffentlichen Schlüssel aller Gates aller teilnehmenden Communities verwaltet Freifunk ebenfalls in einem ICVPN-Repository auf Github. Dieses wird einfach auf unser neues Gate dupliziert (kennen wir ja schon): git clone https://github.com/freifunk/icvpn /etc/tinc/icVPN/ Anschließend muss das file /etc/tinc/icVPN/tinc.conf angepasst (oder angelegt) werden. Es soll dann wie folgt aussehen, der Name ist natürlich der passende für das entsprechende Gate (in diesem Beispiel für die Lotuswurzel): 26 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta Name = wiesbaden1 PrivateKeyFile = /etc/tinc/icVPN/rsa_key.priv Mode = Switch PingTimeout = 30 Port = 10655 Hostnames = yes Interface = icVPN Aus Performance Gründen soll tinc aktiv nur Verbindungen zu ausgewählten sogenannten Metanodes aufbauen. Für alle Metanodes müssen entsprechende ConnectTo =-Zeilen in der tinc Konfigurationsdatei tinc.conf eingetragen werden. Diese Aufgabe übernimmt das post-merge Script für uns: cp /home/admin/clones/backend-scripts/icvpn-tinc-post-merge /etc/tinc/icVPN/.git/hooks/post-merge /etc/tinc/icVPN/.git/hooks/post-merge Nun legen wir noch die /etc/tinc/icVPN/tinc-up an: #!/bin/sh /sbin/ifconfig ${INTERFACE} hw ether 02:00:0a:cf:XX:YY /sbin/ip link set dev $INTERFACE up # primary address: wiesbaden1 /sbin/ip addr add dev $INTERFACE 10.207.X.Y/16 broadcast 10.207.255.255 scope link /sbin/ip -6 addr add dev $INTERFACE fec0::a:cf:X:Y/96 preferred_lft 0 Dabei sind X und Y die entsprechenden Stellen aus der Adresse des Gates im Transfernetz; in der v4-Adresse zur Basis 10 und in der v6-Adresse zur Basis 16. Das passende /etc/tinc/icVPN/tinc-down: #!/bin/sh # primary address: wiesbaden1 /sbin/ip addr del dev $INTERFACE 10.207.X.Y/16 broadcast 10.207.255.255 /sbin/ip -6 addr del dev $INTERFACE fec0::a:cf:X:Y/96 # shutdown interface /sbin/ip link set dev $INTERFACE down Rechte anpassen: chmod 755 /etc/tinc/icVPN/tinc-* Ebenso, wie alle Partnergates ihre öffentlichen Schlüssel in /etc/tinc/icVPN/hosts/ liegen haben, braucht auch unser neues Gate so etwas. Sollen die Schlüssel von einer alten Installation übernommen werden, können wir den folgenden Schlüssel-Generierungs-Schritt auslassen und die bestehenden einfach nach /etc/tinc/icVPN/rsa_key.priv kopiert bzw. per Pull Request in das Repository transportiert. Ein neues Schlüsselpaar wird mit einem Aufruf erzeugt: tincd -n icvpn -K die vorgeschlagenen Defaults passen. Unter /etc/tinc/icVPN/wiesbaden1 (oder dem entsprechenden Namen) findet sich der Public Key, der in das Repository wandern muss. Vorher müssen allerdings die Kontaktinformationen des tinc daemon auf diesem Gate hinzugefügt werden. An den Anfang der Datei: Address = [fqdn oder IP-Adresse] Port = 10655 [...] 3.8. IC-VPN 27 Freifunk MWU Gateway Doku, Release 0.1 beta Bemerkung: Solange unsere Domains im Schwebestatus hängen, sollten wir als Adresse eine IP-Adresse des Gates verwenden. Später sollte es ein extra CNAME (nur für diesen Zweck) auf das gate werden. Als Letztes ist noch die Zeile icVPN der Datei /etc/tinc/nets.boot hinzuzufügen. Nun kann tinc gestartet werden. 3.8.2 BIRD dir structure BIRD wird für IPv4 und IPv6 gesondert konfiguriert, wobei sich die Config Files allerdings sehr ähneln. Da die Einträge für die Nachbarrouter im IC-VPN (peers) in Kürze halbautomatisch gepflegt werden sollen und die birdKonfiguration das Einbinden von config files in config files erlaubt, werden die peers schon jetzt ausgelagert. Damit ergibt sich diese Dateistruktur: /etc/bird/ /etc/bird/bird.conf /etc/bird/ebgp_peers_v4.inc /etc/bird/bird6.conf /etc/bird/ebgp_peers_v6.inc peer include files In den beiden files ebgp_peers_v4.inc und ebgp_peers_v6.inc gibt es jeweils einen Eintrag pro Peer. Nicht jeder Peer muss v4 und v6 anbieten. Die grundlegenden Paramter für die BGP-Verbindung sind für alle (externen) Peers identisch, so dass sie in einem Template (namens ebgp_ic) zusammengefasst sind. So ist jeder einzelne Eintrag recht kurz und folgt dem Muster: protocol bgp [name_of_peer] from ebgp_ic { neighbor [IP_of_peer] as [AS_of_peer]; }; Die Adresse des Peer (=neighbor) ist in der v4-Config eine v4-Adresse und entsprechend in der v6-Config eine v6Adresse. bird config Im Großen und Ganzen handelt es sich bei uns um eine recht normale BIRD-BGP-Konfiguration (nachdem der Versuch, in bird eine gleichberechtigte Config für zwei AS hinzubekommen gescheitert war). Die Routen zu den anderen Communities werden über BGP abgeglichen. Die eigenen Netze, die ins IC-VPN bekannt zu geben sind, werden über einen protocol direkt-Eintrag bestimmt. Das Config File wird mit den üblichen Standards eröffnet: • Die router-id muss bei uns explizit gesetzt werden und entspricht der IP des Gates im IC-VPN-Transfernetz. Als router-id kommt in beiden Konfigurationen die v4-(sic!)-Adresse zum Einsatz. • Wenn wir zwei Kernel Routing Tables beschicken wollen, brauchen wir auch in BIRD dafür zwei Routing Table s. Die zweite ist eine einfache Kopie der ersten, auf der ausschließlich gearbeitet wird. • Die Definition von Konstanten erleichtert das Leben ein wenig. 28 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta Es folgt jeweils ein Block mit ein paar Funktionen, die beim Filtern der zu sendenden und der empfangenen Routen eingesetzt werden, um beides aus unserer Sicht zu kontrollieren (wir nehmen nicht jede angebotene Route an und schicken auch nur Routen auf unsere eigenen Netze raus). Die dann folgenden device-, direct-, kernel- und pipe-Protokolldefinitionen dienen der Kommunikation von BIRD in Richtung des Kernels des hosts: Ohne device-Protokoll kann BIRD fast nichts. Über das direct-Protokoll werden die aktiven mwu-eigenen Netze gefunden, die den Peers gegenüber beworben werden sollen und über die kernel-Protokollinstanzen wird der Host mit den von den Peers erhaltenen Routing-Informationen versorgt. Abgesehen von der mittels include eingebundenen Liste der Peers, bilden die template s für die BGPVerbindungen den Abschluss. Es gibt je ein Template für internal BGP und für external BGP. Jeweils werden die eigene ASN, die eigene IP-Adresse für abgehende Verbindungen, die anzuwendenden Filter und ein paar Flags definiert. Alle diese Einstellungen sind für jeweils alle iBGP- und alle eBGP-Verbindungen gleich; es ändern sich immer nur die Daten der entsprechenden Peers. Die Peers werden in eingebundenen File (für eBGP) bzw. im Anschluss (für iBGP) unter Bezug auf diese Template s definiert. Ein erwähnenswerter Punkt sind die export filter-Definitionen im eBGP. Jedes Gate kann im IC-VPN nur im Namen einer Community auftreten und auch nur eine ASN nach dort anbieten. So nennen sich Lotuswurzel, Hinterschinken und Spinat im IC-VPN z.B. wiesbaden1, wiesbaden2 und mainz2 (resp.). Während letzteres die ASN 65037 bewirbt, geben die beiden anderen 65036 an. Intern können alle Gates aber Pakete an alle Communities ausliefern. Deshalb gibt z.B. Spinat an, hinter seiner 65037 auch die 65036 erreichen zu können (liefert evtl. Pakete dann aber natürlich direkt aus); die beiden anderen Gates verfahren entsprechend anders herum ebenso. Damit der Spinat gegenüber den beiden anderen Gates beim Routing gen Wiesbaden nicht benachteiligt wird, geben letztere bekannt, dass die Routen über sie nach dem ASN 65036 auch noch in das ASN 65036 müssen (via Spinat: 6503765036); ebenso anders herum wieder respektive. => Bei Übernahme der Configs von einer Community in die andere ist also auch an dieser Stelle Änderungsbedarf! Das iBGP wir nur innerhalb einer Community gefahren (also für Gates, die im IC-VPN als Wiesbadener Gates in Erscheinung treten nur zu anderen Wiesbadener Gates; analog für Mainzer Gates)! Dagegen bauen wir eBGP Sessions aber weder zu Mainzer, noch zu Wiesbadener Gates auf, als nur zu mwu-externen. Die Erzeugung der include files soll bald mal - unter Verwendung der Daten aus dem IC-VPN-Meta-Repository automagisiert werden, ist aber aktuell noch Handarbeit. 3.9 Internet-Exit Um den Internet-Verkehr abzuwickeln existieren mehrere Möglichkeiten. Wir gehen hier auf die folgenden zwei Varianten ein. • VPN Provider • Freifunk Rheinland e.V. Achtung, die Konfiguration dieser Varianten unterscheiden sich sehr stark. 3.9.1 VPN Provider Prinzipiell kann jeder beliebige Internet-Provider gewählt werden. Die Konfiguration hier beschreiben wir am Beispiel von Perfect Privacy. Als erstes entledigt man sich aller alter Konfiguration: rm -rf /etc/openvpn/* Eine angepasste und lauffähige Konfiguration bekommt man meist vom Anbieter, in diesem Fall auch von Perfect Privacy, die es herunterladen und zu entpacken gilt. Konvention für die Konfigurationsdateien: 3.9. Internet-Exit 29 Freifunk MWU Gateway Doku, Release 0.1 beta /etc/openvpn/perfect_privacy -> Ordner mit allen Konfigurationsdateien, Zertifikaten, etc. des P /etc/openvpn/perfect_privacy.conf -> Symlink auf die entsprechende Konfigurationsdatei im Unterordner Wir wählen z.B. den Exit-Server in Frankfurt, setzen den Symlink: cd /etc/openvpn ln -s perfect_privacy/Frankfurt.ovpn perfect_privacy.conf Nun muss die Konfiguration aufgrund der Pfade, des Routings des unten aufgeführten Hook-Scripts angepasst werden: dev-type tun dev exitVPN auth-user-pass perfect_privacy/auth/auth.txt #redirect-gateway def1 #route-delay 2 #route-method exe route-noexec ... ca perfect_privacy/ca.crt cert perfect_privacy/Frankfurt_cl.crt key perfect_privacy/Frankfurt_cl.key tls-auth perfect_privacy/Frankfurt_ta.key 1 down /etc/openvpn/openvpn-updown up /etc/openvpn/openvpn-updown Wir haben nun alles Routing-spezifische in OpenVPN deaktiviert und nutzen dafür unser eigenes Hook-Script. /etc/openvpn/openvpn-updown: #!/bin/sh # http://manpages.ubuntu.com/manpages/maverick/en/man8/openvpn.8.html#contenttoc5 set -x ENVFILE="/tmp/ovpn-env-up" echo "$@" > "$ENVFILE" env >> "$ENVFILE" manage_vpn_peer_routes() { ACTION="$1" ip route $ACTION "$route_vpn_gateway" dev "$dev" src "$ifconfig_local" table ffinetexit } manage_vpn_default_routes() { ACTION="$1" ip route $ACTION 0.0.0.0/1 via "$route_vpn_gateway" src "$ifconfig_local" table ffinetexit ip route $ACTION 128.0.0.0/1 via "$route_vpn_gateway" src "$ifconfig_local" table ffinetexit } if [ "$script_type" = "up" ]; then manage_vpn_peer_routes add manage_vpn_default_routes replace elif [ "$script_type" = "down" ]; then manage_vpn_peer_routes del fi exit 0 30 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta Policy Routing Wir fügen nun noch die nötigen IP Rules in die /etc/rc.local ein: ... # Priority 7 - lookup rt_table mwu for all incoming traffic of freifunk related interfaces ... ip -4 rule add from all iif exitVPN lookup mwu priority 7 ... ip -6 rule add from all iif exitVPN lookup mwu priority 7 ... # Priority 61 - at this point this is the end of policy routing for freifunk related routes ... ip -4 rule add from all iif exitVPN type unreachable priority 61 ... ip -6 rule add from all iif exitVPN type unreachable priority 61 ... Siehe auch: • Routing Tabellen • Policy Routing Firewall Um das Netz des ExitVPN Anbieters via NAT mit unserem zu verbinden muss Masquerading aktiviert werden: iptables -t nat -A POSTROUTING -s 10.37.0.0/18,10.56.0.0/18 -o exitVPN -j MASQUERADE und speichert dann die iptables config einmalig: iptables-save > /etc/iptables/rules.v4 3.9.2 Freifunk Rheinland e.V. Der Freifunk Rheinland e.V. war es Leid auf VPN-Provider angewiesen zu sein und hat die Anbindung an das Internet selbst in die Hand genommen. Dazu sind sie RIPE-Mitglied sowie Sub-LIR geworden und haben unter Anderen das IPv6-Prefix 2a03:2260::/29 sowie noch ein IPv4-Netz ergattert: 185.66.192.0/22. Im Laufe des Jahres 2015 hat Freifunk Rheinland eine beachtliche Infrastruktur aufgebaut. Sie peeren z.B. in Berlin, Düsseldorf und Frankfurt an sogenannten Internet Exchange Points (IXP), um deren zugewiesenen IP-Netze ins Internet zu “announcen”. Die RIPE-Mitgliedschaft, das Peering in den IXPs sowie die erforderliche Hardware dafür ist alles andere als günstig. Nicht jede Freifunk Community kann sich das leisten bzw. hat überhaupt die Manpower und Know-How derartiges zu realisieren. Deshalb bietet der Freifunk Rheinland anderen Freifunk Communities die Internet-Abwicklung über deren Infrastrukur an. Wichtige Informationen über den Freifunk Rheinland e.V.: • Freifunk Rheinland Homepage • Rheinland Backbone Documents and Policies • Backbone-announce Mailing-Liste • Kategorie Rheinland Backbone im Freifunk Forum 3.9. Internet-Exit 31 Freifunk MWU Gateway Doku, Release 0.1 beta • Ticket-System • Autonomous System Number AS201701 – BGP Infos über dieses AS gibts bei bgp.he.net • Videos über das Rheinland Backbone – Wie funktioniert der Rheinland Backbone? – Wie funktioniert AS201701? Freifunk MWU IP-Netze Wir haben vom Freifunk Rheinland folgende IP-Netze erhalten: • Mainz – 2a03:2260:11a::/48 – 185.66.195.32/30 • Wiesbaden – 2a03:2260:11b::/48 – 185.66.195.36/30 Technischer Aufbau Übersicht über die GRE-Endpunkte von Freifunk Rheinland: • Berlin – bb-a.ak.ber / 185.66.195.0 – bb-b.ak.ber / 185.66.195.1 • Düsseldorf – bb-a.ix.dus / 185.66.193.0 – bb-b.ix.dus / 185.66.193.1 • Frankfurt – bb-a.fra3.fra / 185.66.194.0 – bb-b.fra3.fra / 185.66.194.1 Prinzipiell wird von jedem Freifunk-Gateway zu jedem dieser Endpunkte ein GRE-Tunnel über IPv4 aufgebaut. Die oben aufgelisteten Endpunkte sowie die öffentliche IPv4-Adresse des Freifunk-Gateways stellen die äußeren TunnelIPs dar. Jeder GRE-Tunnel hat je ein Transfernetz für IPv4 und IPv6 für die innere Kommunikation: • IPv4: /31 – niederwertige IP = Rheinland – höherwertige IP = Freifunk-Gateway • IPv6: /64 – <Prefix>::1 = Rheinland – <Prefix>::<beliebig> = Freifunk-Gateway 32 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta Dieser schematische Aufbau soll das Konstrukt etwas verdeutlichen: Pro GRE-Tunnel wird dann je eine BGP-Session für IPv4 und IPv6 aufgebaut, über die wir die uns zugewiesene IPv4-NAT-Adresse bzw. unsere IPv6-Prefixe announcen. Konfiguration Zunächst nochmal die Übersicht über alle benötigten IP-Adressen: • öffentliche IPv6-Prefixe – Mainz: 2a03:2260:11a::/48 – Wiesbaden: 2a03:2260:11b::/48 – aktuell wird immer das erste /64er Subnetz verwendet – Die IPv6-Adressen der Gates ergeben sich aus dem Prefix und dem bisherigen Interface-Identifier • öffentliche IPv4-Netze – Mainz: 185.66.195.32/30 – Wiesbaden: 185.66.195.36/30 – diese stellen “NAT-IP-Adressen” dar, jedes Gateway erhält eine öffentliche NAT-IP-Adresse • dazu kommen noch die inneren Transfernetze, die sich pro Gate unterscheiden In der folgenden Tabelle halten wir die inneren Transfernetze und IPv4-NAT-Adressen der Gateways fest: 3.9. Internet-Exit 33 Freifunk MWU Gateway Doku, Release 0.1 beta Gateway Kaschu Lotuswurzel Zitronengras Spinat IPv4TransfernetNATze Adresse bb-a.ak.ber Transfernetze bb-b.ak.ber Transfernetze bb-a.ix.dus Transfernetze bb-b.ix.dus TransferTransfernetnetze ze bbbba.fra3.fra b.fra3.fra 185.66.195.37 100.64.2.100/31 100.64.2.102/31 100.64.2.104/31 100.64.2.106/31 100.64.2.108/31100.64.2.110/31 2a03:2260:0:13b::/64 2a03:2260:0:13c::/64 2a03:2260:0:13d::/64 2a03:2260:0:13e::/64 2a03:2260:0:13f::/64 2a03:2260:0:140::/64 185.66.195.36 100.64.1.190/31 100.64.1.20/31 100.64.2.84/31 100.64.1.22/31 100.64.1.192/31100.64.2.86/31 2a03:2260:0:e9::/64 2a03:2260:0:91::/64 2a03:2260:0:133::/64 2a03:2260:0:92::/64 2a03:2260:0:ea::/64 2a03:2260:0:134::/64 185.66.195.39 100.64.2.234/31 100.64.2.236/31 100.64.2.238/31 100.64.2.240/31 ¬ 2a03:2260:0:17f::/64 2a03:2260:0:180::/64 2a03:2260:0:181::/64 2a03:2260:0:182::/64 185.66.195.32 100.64.2.226/31 100.64.2.228/31 100.64.2.230/31 100.64.2.232/31 ¬ 2a03:2260:0:17b::1/64 2a03:2260:0:17c::1/64 2a03:2260:0:17d::1/64 2a03:2260:0:17e::1/64 Was- 185.66.195.33 100.64.2.218/31 100.64.2.220/31 100.64.2.222/31 100.64.2.224/31 ¬ serfloh 2a03:2260:0:177::1/64 2a03:2260:0:178::1/64 2a03:2260:0:179::1/6 2a03:2260:0:17a::1/64 ¬ ¬ ¬ Die nachfolgende Konfiguration erfolgt am Beispiel des Gateways Lotuswurzel. Interfaces In der /etc/network/interfaces legen wir die GRE-Tunnel an: # GRE-Tunnel zu bb-a.ak.ber auto ffrl-a-ak-ber iface ffrl-a-ak-ber inet static address 100.64.1.191 netmask 255.255.255.254 pre-up /sbin/ip post-up /sbin/ip post-up /sbin/ip post-down /sbin/ip tunnel add $IFACE mode gre local 144.76.209.100 remote 185.66.195.0 link set $IFACE mtu 1400 addr add 185.66.195.36/32 dev $IFACE tunnel del $IFACE iface ffrl-a-ak-ber inet6 static address 2a03:2260:0:e9::2 netmask 64 # GRE-Tunnel zu bb-b.ak.ber auto ffrl-b-ak-ber iface ffrl-b-ak-ber inet static address 100.64.1.21 netmask 255.255.255.254 pre-up /sbin/ip post-up /sbin/ip post-up /sbin/ip post-down /sbin/ip tunnel add $IFACE mode gre local 144.76.209.100 remote 185.66.195.1 link set $IFACE mtu 1400 addr add 185.66.195.36/32 dev $IFACE tunnel del $IFACE iface ffrl-b-ak-ber inet6 static address 2a03:2260:0:91::2 netmask 64 34 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta # GRE-Tunnel zu bb-a.ix.dus auto ffrl-a-ix-dus iface ffrl-a-ix-dus inet static address 100.64.2.85 netmask 255.255.255.254 pre-up /sbin/ip post-up /sbin/ip post-up /sbin/ip post-down /sbin/ip tunnel add $IFACE mode gre local 144.76.209.100 remote 185.66.193.0 link set $IFACE mtu 1400 addr add 185.66.195.36/32 dev $IFACE tunnel del $IFACE iface ffrl-a-ix-dus inet6 static address 2a03:2260:0:133::2 netmask 64 # GRE-Tunnel zu bb-b.ix.dus auto ffrl-b-ix-dus iface ffrl-b-ix-dus inet static address 100.64.1.23 netmask 255.255.255.254 pre-up /sbin/ip post-up /sbin/ip post-up /sbin/ip post-down /sbin/ip tunnel add $IFACE mode gre local 144.76.209.100 remote 185.66.193.1 link set $IFACE mtu 1400 addr add 185.66.195.36/32 dev $IFACE tunnel del $IFACE iface ffrl-b-ix-dus inet6 static address 2a03:2260:0:92::2 netmask 64 # GRE-Tunnel zu bb-a.fra3.fra auto ffrl-a-fra3-fra iface ffrl-a-fra3-fra inet static address 100.64.1.193 netmask 255.255.255.254 pre-up /sbin/ip tunnel add $IFACE mode gre local 144.76.209.100 remote 185.66.194.0 post-up /sbin/ip link set $IFACE mtu 1400 post-up /sbin/ip addr add 185.66.195.36/32 dev $IFACE post-down /sbin/ip tunnel del $IFACE iface ffrl-a-fra3-fra inet6 static address 2a03:2260:0:ea::2 netmask 64 # GRE-Tunnel zu bb-b.fra3.fra auto ffrl-b-fra3-fra iface ffrl-b-fra3-fra inet static address 100.64.2.87 netmask 255.255.255.254 pre-up /sbin/ip tunnel add $IFACE mode gre local 144.76.209.100 remote 185.66.194.1 post-up /sbin/ip link set $IFACE mtu 1400 post-up /sbin/ip addr add 185.66.195.36/32 dev $IFACE post-down /sbin/ip tunnel del $IFACE iface ffrl-b-fra3-fra inet6 static address 2a03:2260:0:134::2 netmask 64 Neben der ip tunnel-Direktive, die den GRE-Tunnel mit den äußeren IPv4-Adressen aufbaut, wird jeweils immer die entsprechende IP-Adresse aus dem Transfernetz für IPv4 + IPv6 auf das Tunnel-Interface gelegt. Darüber 3.9. Internet-Exit 35 Freifunk MWU Gateway Doku, Release 0.1 beta hinaus legen wir auf jedes Tunnel-Interface dieselbe IPv4-NAT-Adresse. Für IPv6 erhält jede Freifunk-Bridge nun eine IPv6-Adresse aus den entpsrechenden Netzen: auto mzBR iface mzBR inet static ... up /sbin/ip address add 2a03:2260:11a::a25:17/64 dev $IFACE ... auto wiBR iface wiBR inet static ... up /sbin/ip address add 2a03:2260:11b::a38:17/64 dev $IFACE ... Nach einem Neustart und vorausgesetzt die Gegenstellen sind alle konfiguriert sind die GRE-Tunnel nun up and running. Die Gegenstellen der Transfernetze sind nun erreichbar, aber wir können noch keinen Traffic über die Tunnel schicken. Für das Routing bedarf es noch BGP-Sessions. BGP Dynamisches Routing mittels BGP machen wir mit BIRD. Was brauchen wir alles für BGP? • Freifunk Rheinland ASN: 201701 • Mainzer ASN: 65037 • BIRD Routing-Tabelle: ffrl • Import-Filter • Export-Filter IPv4 Die BIRD Konfiguration für IPv4 liegt bei uns unter /etc/bird/bird.conf. Diese Konfiguration ist teils Geschmackssache und jeder Admin macht die etwas anders. Deshalb zeigen wir hier nur Ausschnitte, ein einfaches Copy & Paste wird nicht funktionieren: # interne BIRD Routing-Tabelle table ffrl; define ffrl_nat_address = 185.66.195.36; #ffrlnat # Funktionen, die später aufgerufen werden function is_ffrl_nat() { return net ~ [ 185.66.195.36/32 ]; } function is_ffrl_tunnel_nets() { return net ~ [ 100.64.1.20/31, 100.64.1.22/31, 100.64.1.190/31, 100.64.1.192/31, 100.64.2.84/31, 100.64.2.86/31 ]; 36 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta } # BGP Import Filter für Rheinland filter ebgp_ffrl_import_filter { if is_default() then accept; reject; } # BGP Export Filter für Rheinland filter ebgp_ffrl_export_filter { if is_ffrl_nat() then accept; reject; } # IP-NAT-Adresse legen wir in die interne BIRD Routing Table protocol static ffrl_uplink_hostroute { table ffrl; route 185.66.195.36/32 reject; } # Wir legen die Transfernetze in die interne BIRD Routing Table protocol direct { table ffrl; interface "ffrl-*"; import where is_ffrl_tunnel_nets(); } # Wir exportieren über Rheinland gelernte Routen in die Kernel Table 61 (ffinetexit) protocol kernel kernel_ffrl { scan time 30; import none; export filter { krt_prefsrc = ffrl_nat_address; accept; }; table ffrl; kernel table 61; }; # BGP Template für Rheinland Peerings template bgp ffrl_uplink { table ffrl; local as 65037; import keep filtered; import filter ebgp_ffrl_import_filter; export filter ebgp_ffrl_export_filter; next hop self; direct; }; # P E E R I N G S # FFRL Berlin bb-a.ak.ber protocol bgp ffrl_ber1 from ffrl_uplink { source address 100.64.1.191; neighbor 100.64.1.190 as 201701; default bgp_local_pref 200; }; 3.9. Internet-Exit 37 Freifunk MWU Gateway Doku, Release 0.1 beta # FFRL Berlin bb-b.ak.ber protocol bgp ffrl_ber2 from ffrl_uplink { source address 100.64.1.21; neighbor 100.64.1.20 as 201701; }; # FFRL Duesseldorf bb-ba.ix.dus protocol bgp ffrl_dus1 from ffrl_uplink { source address 100.64.2.85; neighbor 100.64.2.84 as 201701; }; # FFRL Duesseldorf bb-b.ix.dus protocol bgp ffrl_dus2 from ffrl_uplink { source address 100.64.1.23; neighbor 100.64.1.22 as 201701; }; # FFRL Frankfurt bb-a.fra3 protocol bgp ffrl_fra1 from ffrl_uplink { source address 100.64.1.193; neighbor 100.64.1.192 as 201701; }; # FFRL Frankfurt bb-b.fra3 protocol bgp ffrl_fra2 from ffrl_uplink { source address 100.64.2.87; neighbor 100.64.2.86 as 201701; }; Wenn die BGP-Sessions aufgebaut sind schauen wir uns mal die interne BIRD Routing Table an: [root@lotuswurzel ~] birdc show route table ffrl BIRD 1.5.0 ready. 0.0.0.0/0 via 100.64.1.190 on ffrl-a-ak-ber [ffrlber1 12:14:10] * (100/0) [AS201701i] via 100.64.1.20 on ffrl-b-ak-ber [ffrlber2 12:14:14] (100/0) [AS201701i] via 100.64.2.86 on ffrl-b-fra3-fra [ffrlfra2 12:14:13] (100/0) [AS201701i] via 100.64.2.84 on ffrl-a-ix-dus [ffrldus1 12:14:13] (100/0) [AS201701i] via 100.64.1.192 on ffrl-a-fra3-fra [ffrlfra1 12:14:08] (100/0) [AS201701i] via 100.64.1.22 on ffrl-b-ix-dus [ffrldus2 12:13:20] (100/0) [AS201701i] 100.64.1.20/31 dev ffrl-b-ak-ber [direct1 12:13:16] * (240) 100.64.2.84/31 dev ffrl-a-ix-dus [direct1 12:13:16] * (240) 100.64.1.22/31 dev ffrl-b-ix-dus [direct1 12:13:16] * (240) 100.64.2.86/31 dev ffrl-b-fra3-fra [direct1 12:13:16] * (240) 100.64.1.192/31 dev ffrl-a-fra3-fra [direct1 12:13:16] * (240) 100.64.1.190/31 dev ffrl-a-ak-ber [direct1 12:13:16] * (240) 185.66.195.36/32 unreachable [ffrl_uplink_hostroute 12:13:16] * (200) Hier erkennt man die über Rheinland gelernte IPv4 Default Route über 6 verschiedene Router. Wir announcen hingegen nur die IPv4-NAT-Adresse. IPv6 Die BIRD Konfiguration für IPv6 liegt bei uns unter /etc/bird/bird6.conf. Diese Konfiguration ist teils Geschmackssache und jeder Admin macht die etwas anders. Deshalb zeigen wir hier nur Ausschnitte, ein einfaches Copy & Paste wird nicht funktionieren: # interne BIRD Routing-Tabelle table ffrl; 38 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta # Funktionen, die später aufgerufen werden function is_default() { return net ~ [ ::/0 ]; } function is_ffrl_public_nets() { return net ~ [ 2a03:2260:11a::/48, 2a03:2260:11b::/48 ]; } function is_ffrl_tunnel_nets() { return net ~ [ 2a03:2260:0:91::/64, 2a03:2260:0:92::/64, 2a03:2260:0:e9::/64, 2a03:2260:0:ea::/64, 2a03:2260:0:133::/64, 2a03:2260:0:134::/64 ]; } # BGP Import Filter für Rheinland filter ebgp_ffrl_import_filter { if is_default() then accept; reject; } # BGP Export Filter für Rheinland filter ebgp_ffrl_export_filter { if is_ffrl_public_nets() then accept; reject; } # Wir legen die Transfernetze in die interne BIRD Routing Table protocol direct { table ffrl; interface "ffrl-*"; import where is_ffrl_tunnel_nets(); } # Wir legen unsere Public v6-Netze in die interne BIRD Routing Table protocol static ffrl_public_routes { table ffrl; route 2a03:2260:11a::/48 reject; route 2a03:2260:11b::/48 reject; } # Wir exportieren über Rheinland gelernte Routen in die Kernel Table 61 (ffinetexit) protocol kernel kernel_ffrl { scan time 30; import none; export filter { if is_default() then accept; reject; 3.9. Internet-Exit 39 Freifunk MWU Gateway Doku, Release 0.1 beta }; table ffrl; kernel table 61; } # BGP Template für Rheinland Peerings template bgp ffrl_uplink { table ffrl; local as 65037; import keep filtered; import filter ebgp_ffrl_import_filter; export filter ebgp_ffrl_export_filter; next hop self; direct; }; # P E E R I N G S # FFRL Berlin bb-a.ak.ber protocol bgp ffrl_ber1 from ffrl_uplink { source address 2a03:2260:0:e9::2; neighbor 2a03:2260:0:e9::1 as 201701; } # FFRL Berlin bb-b.ak.ber protocol bgp ffrl_ber2 from ffrl_uplink { source address 2a03:2260:0:91::2; neighbor 2a03:2260:0:91::1 as 201701; default bgp_local_pref 200; } # FFRL Duesseldorf bb-a.ix.dus protocol bgp ffrl_dus1 from ffrl_uplink { source address 2a03:2260:0:133::2; neighbor 2a03:2260:0:133::1 as 201701; } # FFRL Duesseldorf bb-b.ix.dus protocol bgp ffrl_dus2 from ffrl_uplink { source address 2a03:2260:0:92::2; neighbor 2a03:2260:0:92::1 as 201701; } # FFRL Frankfurt bb-a.fra3.fra protocol bgp ffrl_fra1 from ffrl_uplink { source address 2a03:2260:0:ea::2; neighbor 2a03:2260:0:ea::1 as 201701; } # FFRL Frankfurt bb-b.fra3.fra protocol bgp ffrl_fra2 from ffrl_uplink { source address 2a03:2260:0:134::2; neighbor 2a03:2260:0:134::1 as 201701; } Wenn die BGP-Sessions aufgebaut sind schauen wir uns mal die interne BIRD Routing Table an: 40 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta [root@lotuswurzel ~] birdc6 show route table ffrl BIRD 1.5.0 ready. ::/0 via 2a03:2260:0:91::1 on ffrl-b-ak-ber [ffrlber2 2015-11-19] * (100/0) [AS201701i] via 2a03:2260:0:92::1 on ffrl-b-ix-dus [ffrldus2 10:13:44] (100/0) [AS201701i] via 2a03:2260:0:ea::1 on ffrl-a-fra3-fra [ffrlfra1 2015-11-19] (100/0) [AS201701i] via 2a03:2260:0:134::1 on ffrl-b-fra3-fra [ffrlfra2 2015-11-19] (100/0) [AS201701i via 2a03:2260:0:133::1 on ffrl-a-ix-dus [ffrldus1 2015-11-19] (100/0) [AS201701i] via 2a03:2260:0:e9::1 on ffrl-a-ak-ber [ffrlber1 2015-11-19] (100/0) [AS201701i] 2a03:2260:0:133::/64 dev ffrl-a-ix-dus [direct1 2015-11-19] * (240) 2a03:2260:0:134::/64 dev ffrl-b-fra3-fra [direct1 2015-11-19] * (240) 2a03:2260:0:e9::/64 dev ffrl-a-ak-ber [direct1 2015-11-19] * (240) 2a03:2260:0:ea::/64 dev ffrl-a-fra3-fra [direct1 2015-11-19] * (240) 2a03:2260:0:91::/64 dev ffrl-b-ak-ber [direct1 2015-11-19] * (240) 2a03:2260:0:92::/64 dev ffrl-b-ix-dus [direct1 2015-11-19] * (240) 2a03:2260:11a::/48 unreachable [ffrl_public_routes 2015-11-19] * (200) 2a03:2260:11b::/48 unreachable [ffrl_public_routes 2015-11-19] * (200) Hier erkennt man die über Rheinland gelernte IPv6 Default Route über 6 verschiedene Router. Wir announcen hingegen unsere zugewiesenen /48er IPv6-Prefixe. iptables Für IPv4 natten wir weiterhin und legen dafür die entsprechenden iptables Regeln an: iptables iptables iptables iptables iptables -t -t -t -t -t nat nat nat nat nat -N -A -A -A -A ffrl-nat ffrl-nat -s ffrl-nat -s POSTROUTING POSTROUTING 10.37.0.0/16 -o 10.56.0.0/16 -o -s 10.37.0.0/16 -s 10.56.0.0/16 ffrl+ -j ffrl+ -j -o ffrl+ -o ffrl+ SNAT --to-source 185.66.195.36 SNAT --to-source 185.66.195.36 -j ffrl-nat -j ffrl-nat iptables-save > /etc/iptables/rules.v4 Die GRE-Tunnel haben alle eine MTU von 1400 Bytes. Leider filtern viele Systeme im Internet noch wichtige ICMP Pakete, sodass die wunderbare Path MTU Discovery nicht immer funktioniert. Ohne weiteren Eingriff würde das dazu führen, dass viele TCP Verbindungen einfach nicht aufgebaut werden können. Deshalb müssen wir die TCP MSS auf die Path-MTU anpassen und ergänzen folgende iptables Regeln: iptables iptables iptables iptables -A -A -A -A FORWARD FORWARD FORWARD FORWARD -i -i -i -i wiBR -o ffrl+ mzBR -o ffrl+ ffrl+ -o wiBR ffrl+ -o mzBR -p -p -p -p tcp tcp tcp tcp -m -m -m -m tcp tcp tcp tcp --tcp-flags --tcp-flags --tcp-flags --tcp-flags SYN,RST SYN,RST SYN,RST SYN,RST SYN SYN SYN SYN -j -j -j -j TCPMSS TCPMSS TCPMSS TCPMSS --clamp-mss-to-p --clamp-mss-to-p --clamp-mss-to-p --clamp-mss-to-p iptables-save > /etc/iptables/rules.v4 ip6tables ip6tables ip6tables ip6tables -A -A -A -A FORWARD FORWARD FORWARD FORWARD -i -i -i -i wiBR -o ffrl+ mzBR -o ffrl+ ffrl+ -o wiBR ffrl+ -o mzBR -p -p -p -p tcp tcp tcp tcp -m -m -m -m tcp tcp tcp tcp --tcp-flags --tcp-flags --tcp-flags --tcp-flags SYN,RST SYN,RST SYN,RST SYN,RST SYN SYN SYN SYN -j -j -j -j TCPMSS TCPMSS TCPMSS TCPMSS --clamp-mss-to--clamp-mss-to--clamp-mss-to--clamp-mss-to- ip6tables-save > /etc/iptables/rules.v6 Policy Routing Wie im Kapitel Policy Routing beschrieben müssen wir dafür sorgen, dass die richtige Routing Tabelle für das Routing befragt wird. Für das Internet-Routing über Freifunk Rheinland sind noch folgende IP Rules in der /etc/rc.local erforderlich: 3.9. Internet-Exit 41 Freifunk MWU Gateway Doku, Release 0.1 beta # Priority ... ip -4 rule ip -4 rule ip -4 rule ip -4 rule ip -4 rule ip -4 rule ... ip -6 rule ip -6 rule ip -6 rule ip -6 rule ip -6 rule ip -6 rule ip -6 rule ip -6 rule 7 - lookup rt_table mwu for all incoming traffic of freifunk related interfaces # Priority ... ip -4 rule ip -6 rule ip -6 rule 41 - lookup rt_table ffinetexit for all incoming traffic of freifunk bridges # Priority ... ip -4 rule ip -4 rule ip -4 rule ip -4 rule ip -4 rule ip -4 rule ... ip -6 rule ip -6 rule ... ip -6 rule ip -6 rule ip -6 rule ip -6 rule ip -6 rule ip -6 rule 61 - at this point this is the end of policy routing for freifunk related routes add add add add add add from from from from from from all all all all all all iif iif iif iif iif iif ffrl-a-fra3-fra lookup mwu priority 7 ffrl-b-fra3-fra lookup mwu priority 7 ffrl-a-ak-ber lookup mwu priority 7 ffrl-b-ak-ber lookup mwu priority 7 ffrl-a-ix-dus lookup mwu priority 7 ffrl-b-ix-dus lookup mwu priority 7 add add add add add add add add from from from from from from from from all iif ffrl-a-fra3-fra lookup mwu priority 7 all iif ffrl-b-fra3-fra lookup mwu priority 7 all iif ffrl-a-ak-ber lookup mwu priority 7 all iif ffrl-b-ak-ber lookup mwu priority 7 all iif ffrl-a-ix-dus lookup mwu priority 7 all iif ffrl-b-ix-dus lookup mwu priority 7 2a03:2260:11a::/48 lookup mwu priority 7 2a03:2260:11b::/48 lookup mwu priority 7 add from 185.66.195.36/32 lookup ffinetexit priority 41 add from 2a03:2260:11a::/48 lookup ffinetexit priority 41 add from 2a03:2260:11b::/48 lookup ffinetexit priority 41 add add add add add add from from from from from from all all all all all all iif iif iif iif iif iif ffrl-a-fra3-fra type unreachable priority 61 ffrl-b-fra3-fra type unreachable priority 61 ffrl-a-ak-ber type unreachable priority 61 ffrl-b-ak-ber type unreachable priority 61 ffrl-a-ix-dus type unreachable priority 61 ffrl-b-ix-dus type unreachable priority 61 add from 2a03:2260:11a::/48 type unreachable priority 61 add from 2a03:2260:11b::/48 type unreachable priority 61 add add add add add add from from from from from from all all all all all all iif iif iif iif iif iif ffrl-a-fra3-fra type unreachable priority 61 ffrl-b-fra3-fra type unreachable priority 61 ffrl-a-ak-ber type unreachable priority 61 ffrl-b-ak-ber type unreachable priority 61 ffrl-a-ix-dus type unreachable priority 61 ffrl-b-ix-dus type unreachable priority 61 ... # static mainz routes for rt_table mwu ... /sbin/ip -6 route add 2a03:2260:11a::/64 proto static dev mzBR table mwu # static wiesbaden routes for rt_table mwu ... /sbin/ip -6 route add 2a03:2260:11b::/64 proto static dev wiBR table mwu Siehe auch: • Routing Tabellen • Policy Routing 42 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta RAdvD Damit die Clients im Netz auch in den Genuss von öffentlichem IPv6 kommen, müssen die Public IPv6-Prefixe zusätzlich zu den ULA-Prefixes per Router Advertisements bekannt gegeben werden. Dazu ergänzt man die Public IPv6-Prefixe in der /etc/radvd.conf: interface mzBR { ... prefix 2a03:2260:11a::/64 { AdvValidLifetime 864000; AdvPreferredLifetime 172800; }; ... }; interface wiBR { ... prefix 2a03:2260:11b::/64 { AdvValidLifetime 864000; AdvPreferredLifetime 172800; }; ... }; Siehe auch: • RAdvD Spenden Der Freifunk Rheinland e.V. muss seine Infrastruktur am Leben erhalten, ausbauen, defekte Teile tauschen etc. Das kostet viel Geld. Liebe Communities, ihr habt bisher auch Ausgaben für die VPN Provider gehabt. Spendet an den Freifunk Rheinland e.V., damit ein so großartiger Provider Bestand hat! Wie ihr spenden könnt erfahrt ihr auf der Spenden-Seite des Freifunk Rheinlands. 3.10 Aufräumarbeiten 3.10.1 Lokaler DNS Resolver Nach dem die Konfiguration von BIND abgeschlossen wird der DNS-Eintrag auf sich selbst gesetzt. Dies kommt in die inet Section des Internet Interfaces, i.d.R. eth0. Dadurch wird der Nameserver-Eintrag /etc/resolv.conf geschrieben 3.10. Aufräumarbeiten durch resolvconf beim Hochkommen des Interfaces nach 43 Freifunk MWU Gateway Doku, Release 0.1 beta in die /etc/network/interfaces kommt also folgendes: iface eth0 inet static [...] dns-nameservers 127.0.0.1 Als Fallback DNS Server tragen wir zusätzlich noch 2 weitere freie DNS Resolver ein. Dies erledigen wir über resolvconf. Wir legen die Datei /etc/resolvconf/resolv.conf.d/tail an und tragen die freien DNS Server ein: nameserver 213.73.91.35 nameserver 85.214.20.141 Siehe auch: • BIND 3.10.2 Logging Freifunk steht unter Anderem für Netzneutralität und ist in keinster Weise an irgendwelchen Nutzer-, Meta-, Irgendwasdaten interessiert. Aus diesem Grund muss den sonst so redseligen Linux Daemonen das Logging abgewöhnt werden. Hier wird beschrieben, wie man das für die jeweiligen Daemons erreicht. Rsyslog Wir legen uns auf eine Log Facility fest, deren Ziel ein schwarzes Loch ist. • Black-Hole Log-Facility: local6 /etc/rsyslog.d/50-default.conf Die folgende Zeile: *.*;auth,authpriv.none -/var/log/syslog durch diese ersetzen: *.*;auth,authpriv.none;local6.none -/var/log/syslog /etc/rsyslog.d/99-freifunk.conf: local6.* /dev/null Nun kann jeder Daemon, der per default syslog für das Loggen benutzt angewiesen werden, die Log Facility local6 zu nutzen. Dadurch wird bewirkt, dass jegliche Infos im Nirvana landen. DHCP Server /etc/dhcpd/dhcpd.conf: log-facility local6; 44 Kapitel 3. Konfiguration Freifunk MWU Gateway Doku, Release 0.1 beta radvd Leider kann man dem radvd das Logging nur abgewöhnen, wenn man das Init-Script anpasst, /etc/init.d/radvd: OPTIONS="-m none -u radvd -p $PIDFILE" Das -m none ist hier dazugekommen und deaktivert das Logging komplett. fastd /etc/fastd/xxVPN/fastd.conf: log level warn; hide ip addresses yes; hide mac addresses yes; BIND /etc/bind/named.conf.logging: logging { channel null { null; }; category default { null; }; }; /etc/bind/named.conf: ... include "/etc/bind/named.conf.logging"; Apache ServerTokens in /etc/apache2/conf-available/security.conf weniger aussagekräftig einstellen und ServerSignature auf EMail setzen: ServerTokens Prod ServerSignature EMail Um Apache das Mitloggen der Zugriffe abzugewöhnen müssen in jeder aktivierten site die Log Direktiven auskommentiert werden: #ErrorLog ${APACHE_LOG_DIR}/error.log #CustomLog ${APACHE_LOG_DIR}/access.log combined Des Weiteren existiert eine Standardkonfiguration, die automatisch für jede site das Logging aktiviert, diese muss unbedingt deaktiviert werden: sudo a2disconf other-vhosts-access-log.conf sudo apachectl graceful 3.10. Aufräumarbeiten 45 Freifunk MWU Gateway Doku, Release 0.1 beta 46 Kapitel 3. Konfiguration KAPITEL 4 Betrieb 4.1 Funktionstests 4.1.1 Dienste Laufen alle Dienste? BIND: service bind9 status * bind9 is running DHCPd: service isc-dhcp-server status * isc-dhcp-server start/running, process 1337 fastd: service fastd status * fastd 'mzVPN' is running * fastd 'wiVPN' is running VPN Provider: service openvpn status * VPN 'mullvad' is running BIRD: service bird status bird start/running, process 1337 service bird6 status bird6 start/running, process 1337 RAdvD: service radvd status * radvd is running NTP: 47 Freifunk MWU Gateway Doku, Release 0.1 beta service ntp status * NTP server is running 4.1.2 Interfaces Sind die Netzwerk Interfaces in Ordnung? Ein ip a sollte folgende Interfaces auflisten: • lo • eth0 • mzBR • wiBR • mzVPN • wiVPN • mzBAT • wiBAT • exitVPN • icVPN Für ein spezifisches Interface nutzt man ip a show dev wiBR, Für eine Range ip a show to 10.37.0.0/16 bzw. ip a show to fd56:b4dc:4b1e::/64. Interessant ist in diesem Kontext ist auch ip a show scope global. 4.1.3 Routing Siehe auch: • Routing Tabellen • Policy Routing • Lokaler DNS Resolver Die IP Rules? ip rule 0: 7: 7: 7: 7: 23: 23: 41: 41: 61: 61: 61: 61: 61: 107: 48 from from from from from from from from from from from from from from from all all all all all all all all all all all all all all all lookup local iif mzBR lookup mwu iif wiBR lookup mwu iif icVPN lookup mwu iif exitVPN lookup mwu iif mzBR lookup icvpn iif wiBR lookup icvpn iif mzBR lookup ffinetexit iif wiBR lookup ffinetexit iif mzBR unreachable iif wiBR unreachable iif exitVPN unreachable iif icVPN unreachable iif eth0 unreachable lookup mwu Kapitel 4. Betrieb Freifunk MWU Gateway Doku, Release 0.1 beta 107: 32766: 32767: from all lookup icvpn from all lookup main from all lookup default ip -6 rule 0: from 7: from 7: from 7: from 7: from 23: from 23: from 41: from 41: from 61: from 61: from 61: from 61: from 61: from 107: from 107: from 32766: from all all all all all all all all all all all all all all all all all lookup local iif mzBR lookup mwu iif wiBR lookup mwu iif icVPN lookup mwu iif exitVPN lookup mwu iif mzBR lookup icvpn iif wiBR lookup icvpn iif mzBR lookup ffinetexit iif wiBR lookup ffinetexit iif mzBR unreachable iif wiBR unreachable iif exitVPN unreachable iif icVPN unreachable iif eth0 unreachable lookup mwu lookup icvpn lookup main Die Routing-Tables? ip route show table mwu 10.37.0.0/18 dev mzBR proto static scope link 10.56.0.0/18 dev wiBR proto static scope link ip -6 route show table mwu fd37:b4dc:4b1e::/64 dev mzBR proto static metric 1024 fd56:b4dc:4b1e::/64 dev wiBR proto static metric 1024 ip route show table ffinetexit 0.0.0.0/1 via 10.3.18.136 dev exitVPN src 10.3.18.136 unreachable default 10.3.18.136 dev exitVPN scope link src 10.3.18.136 128.0.0.0/1 via 10.3.18.136 dev exitVPN src 10.3.18.136 ip -6 route show table ffinetexit unreachable default dev lo metric 1024 error -101 ip route show table icvpn 10.0.0.0/24 via 10.207.0.59 dev icVPN proto bird src 10.207.0.56 10.0.1.0/24 via 10.207.0.79 dev icVPN proto bird src 10.207.0.56 10.5.0.0/16 via 10.207.0.114 dev icVPN proto bird src 10.207.0.56 10.7.0.0/16 via 10.207.0.11 dev icVPN proto bird src 10.207.0.56 10.8.0.0/16 via 10.207.0.36 dev icVPN proto bird src 10.207.0.56 10.11.0.0/18 via 10.207.0.17 dev icVPN proto bird src 10.207.0.56 ... u.v.m. ... ip -6 route show table icvpn 2001:67c:2d50::/48 via fec0::a:cf:0:82 dev icVPN proto bird src fec0::a:cf:0:38 metric 1024 2001:bf7:20::/48 via fec0::a:cf:0:ba dev icVPN proto bird src fec0::a:cf:0:38 metric 1024 2001:bf7:380::/64 via fec0::a:cf:0:28 dev icVPN proto bird src fec0::a:cf:0:38 metric 1024 2001:bf7:380::/44 via fec0::a:cf:0:28 dev icVPN proto bird src fec0::a:cf:0:38 metric 1024 2001:bf7:540::/44 via fec0::a:cf:1:c4 dev icVPN proto bird src fec0::a:cf:0:38 metric 1024 2001:bf7:550::/44 via fec0::a:cf:1:c4 dev icVPN proto bird src fec0::a:cf:0:38 metric 1024 ... u.v.m. ... 4.1. Funktionstests 49 Freifunk MWU Gateway Doku, Release 0.1 beta 4.1.4 B.A.T.M.A.N. Siehe auch: • Pakete • fastd Die momentan genutzte B.A.T.M.A.N.-Version ermittelt man mit: modinfo -F version /lib/modules/$(uname -r)/updates/dkms/batman-adv.ko 2014.3.0 bzw mit: batctl -v batctl 2014.3.0 [batman-adv: 2014.3.0] Gateway Status überprüfen: batctl -m mzBAT gw server (announced bw: 96.0/96.0 MBit) batctl -m wiBAT gw server (announced bw: 96.0/96.0 MBit) Schauen, was die Kollegen so treiben: batctl -m wiBAT gwl Gateway (#/255) Nexthop [outgoingIF]: advertised uplink bandwidth ... [B.A.T.M.A.N 02:00:0a:38:00:05 (255) 02:00:0a:38:00:05 [ wiVPN]: 96.0/96.0 MBit 02:00:0a:38:00:07 (255) 02:00:0a:38:00:07 [ wiVPN]: 96.0/96.0 MBit 4.1.5 A.L.F.R.E.D. Siehe auch: • Pakete • A.L.F.R.E.D. Wie geht’s Alfred? service alfred-wi status alfred-wi start/running, process 1337 service alfred-mz status alfred-mz start/running, process 1337 Sind Nodes online, die gluon-announce installiert und am laufen haben, sollte man json/gzip Daten erhalten: alfred -r 158 -u /var/run/alfred-wi.sock [...] { "xx:xx:xx:xx:xx:xx", "\xxx\xxx [...] \xxx\xxx" }, [...] Ist alfred-json installiert kann man sich die Daten gleich mit entpacken lassen: alfred -r 158 -s /var/run/alfred-wi.sock -z [...] { "xx:xx:xx:xx:xx:xx": { 50 Kapitel 4. Betrieb Freifunk MWU Gateway Doku, Release 0.1 beta "location": { "longitude": 0.0, "latitude": 0.0 }, "network": { "mac": "xx:xx:xx:xx:xx:xx", [...] }, [...] }, [...] } [...] Hier nervt: Zur Angabe des Sockets nutzt alfred-json den Flag -s, alfred hingegen -u. batadv-vis -u /var/run/alfred-mz.sock -f jsondoc { "source_version" : "2014.4.0", "algorithm" : 4, "vis" : [ { "primary" : "xx:xx:xx:xx:xx:xx", "neighbors" : [ { "router" : "xx:xx:xx:xx:xx:xx", "neighbor" : "xx:xx:xx:xx:xx:yy", "metric" : "1.0" }, { "router" : "xx:xx:xx:xx:xx:xx", "neighbor" : "xx:xx:xx:xx:yy:xx", "metric" : "1.1" } ], "clients" : [ "xx:xx:xx:xx:xx:xx", "xx:xx:xx:xx:yy:yy" ] }, [...] } 4.2 Workflows 4.2.1 fastd-keys Damit die Nodes eine VPN-Verbindung aufbauen können, muss der öffentliche fastd Schlüssel auf die Gateways gelangen. Wir verwalten diese Keys in Git-Repositories: • Mainz: peers-ffmz.git • Wiesbaden: peers-ffwi.git Bei dem ersten Start der Gluon Node wird ein fastd Schlüsselpaar erzeugt. Im Beschreibungstext steht, man solle den erzeugten öffentlichen Schlüssel per Mail an unsere Listen schicken. Alternativ lässt sich auch ein Link klicken, der das Email-Programm öffnet und eine neue Mail ausfüllt. • Mainz: keys (at) freifunk-mainz.de 4.2. Workflows 51 Freifunk MWU Gateway Doku, Release 0.1 beta • Wiesbaden: keys (at) freifunk-wiesbaden.de Die Empfänger dieser Liste sind am Besten auch Mitglieder des fastd-keys GitHub Teams - Mitglieder dieser Gruppe haben Schreibrechte auf die peers Repositories. Die neuen Keys von der Liste werden wie unten gezeigt lokal eingetragen, die Änderungen wie gewohnt gepusht. Bemerkung: Damit der Nodebesitzer und die anderen Empfänger der Keys-Listen bescheid wissen, muss nach dem Eintragen der Keys die Mail beantwortet werden. Den Nodebesitzer ins To:-Feld, keys@freifunk-... ins CC: (Oder einfach auf Reply-All klicken..). Alle 15 Minuten kommt ein Script vorbei und synchronisiert die neuen Keys von GitHub auf die Gateways. Siehe auch: • fastd • Backend Scripte 4.2.2 fastd-keys Format Ein fastd-key ist ein 64-Zeichen langer HEX-String: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef Damit der fastd-daemon den Schlüssel lesen kann, muss noch etwas Syntax drum rum: key "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; Bei Start oder Neuladen des fastd-daemons wird das Config-File neu eingelesen. In diesem steht, fastd möge zusätzlich noch alle Dateien aus dem peers-Ordner mit einlesen (== peers-... .git Repository). fastd nimmt den Dateinamen des keys als peer name. Hat die Node z.B. den Namen Wurstsalat ist die Struktur denkbar einfach: • Dateiname: Wurstsalat: key "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; Einige Dateinamen werden zur einfachen Zuordnung mit einem Prefix markiert. In Benutzung/Angedacht sind: gw Für Gateways (gw_Lotuswurzel, gw_Spinat). srv Für Dienste-Server (srv_Aubergine). chaos Für Nodes im cccmz (chaos_Haggis). peng Für Nodes im pengland. 4.2.3 exitVPN Accounts Anfragen aus dem Freifunknetz in das Internet tunneln wir durch das exitVPN, um die Störerhaftung zu umgehen. Dies hat den Vorteil, dass Anfragen in das Internet anonymisiert werden, Anbieter sehen nur dass die Anfrage aus dem Freifunk-Netz kommt. Hierbei handelt es sich um OpenVPN-Angebote, meist in Schweden oder Niederlande. Diese werden im Vorraus gezahlt, und müssen von Hand aufgeladen werden. Problem - Dies wird all zu gerne verpeilt! 52 Kapitel 4. Betrieb Freifunk MWU Gateway Doku, Release 0.1 beta Im gateway-configs.git findet sich eine exitvpn.yaml Dort wird pro Gateway hinterlegt, welcher VPN-Account hinterlegt ist, und bis zu welchem Datum dieser bezahlt ist. Einmal tägtlich kommt ein Script vorbei, und schreibt bei nähern des Datums Mails auf die admin@-Listen, ansonsten wird ein mal pro Woche eine Übersicht verschickt. Siehe auch: • VPN Provider • Backend Scripte 4.2.4 Firmware updates Firmware updates müssen nach dem kompilieren noch signiert werden. So stellt Gluon die Integrität der Firmware Dateien sicher. Dazu wird die manifest datei, die Teil jedes kompilierten Gluon releases ist mittels ecdsasign signiert. Je nach Einstellungen in der site.conf und je nach build (experimental, beta, stable) sind eine verschiedene Anzahl von signaturen nötig. Ecdsa utils intallieren & Key generieren Siehe hier: http://wiki.freifunk-flensburg.de/wiki/ECDSA_Util Der öffentliche Schlüssel muss dann noch in die site.conf im imagebuilder eingetragen werden. Firmware signieren Man braucht den Inhalt aus der manifest Datei, vom Anfang bis zum Ende Der Dateinamen der Router (also bis zum —–). Diesen speichert man ab und generiert die Signatur mit: ecdsasign manifest < $private_keyfile Die erhaltene Signatur fügt man jetzt unten an die manifest Datei an (unter dem —–) an. 4.3 Backend Scripte Um sich das Leben einfacher zu machen, werden immer wiederkehrende Probleme mittels Scripte gelöst. Diese werden in einem Repository gesammelt und nutzen selbst Photon als Backend. Repository freifunk-mwu/backend-scripts Backend Photon 4.3.1 Installation Photon liegt im neuesten Release im Python Package Index und wird wiefolgt installiert: sudo pip3 install -U photon_core --pre Die eigentlichen Backend Scripte werden normal geklont: mkdir -p ~/clones/backend-scripts git clone https://github.com/freifunk-mwu/backend-scripts.git ~/clones/backend-scripts 4.3. Backend Scripte 53 Freifunk MWU Gateway Doku, Release 0.1 beta 4.3.2 Einrichten Um den Backend Scripten (Schreib-) Zugriff auf die benötigten Repos unter GitHub zu gewähren müssen diese erst eingerichtet werden. Dazu dient das Script bootstrap_git_all.py: python3 ~/clones/backend-scripts/bootstrap_git_all.py Dieses erzeugt ein SSH-Schlüsselpaar und legt es unter ~/.ssh/%hostname%_rsa ab sofern dieses noch nicht existiert. Die ~/.ssh/config wird um einen Eintrag erweitert (sofern dieser noch nicht existiert), so dass ein Zugriff auf GitHub mittels frisch erzeugtem Schlüssel möglich ist. Momentan: github_mwu Den Öffentlichen Teil des Schlüssels bekommt ein extra erstellter GitHub Account hinterlegt, der duch eine Gruppen Zugriff auf die entsprechenden Repos erhält. Für uns ist dies der Nutzer freifunkmwu der innerhalb der Gruppe machines verweilt. Ob alles korrekt funktioniert lässt sich durch einen einfachen Aufruf zeigen: ssh github_mwu Die Ausgabe sollte folgendes enthalten: Hi freifunkmwu! You've successfully authenticated, but GitHub does not provide shell access. Connection to github.com closed. Die restlichen Scripte sind in der Readme des Repos beschrieben. 4.3.3 Cronjobs Damit verschiedene Datenquellen atuell bleiben, sind eine ganze Reihe von Cronjobs notwendig. Die outputs werden im Fehlerfall auch direkt auf die admin@ liste geleitet. Zunächst ruft man seinen Crontab editor auf: crontab -e Da ein Teil der neu installieren binaries unter /home/admin/ liegen, müssen wir den Pfad setzen: PATH=/home/admin/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin Jede Minute annouced das gateway per Alfred seine Daten: # alfred announce * * * * * $HOME/clones/ffnord-alfred-announce/announce.sh -i mzBR -b mzBAT -f mzVPN -u /var/run/alfre * * * * * $HOME/clones/ffnord-alfred-announce/announce.sh -i wiBR -b wiBAT -f wiVPN -u /var/run/alfre Die aktuellste Firmware wird dreimal pro Tag vom Buildserver geholt: # firmware sync 23 */8 * * * /usr/bin/rsync -avh --delete rsync://pudding.freifunk-mwu.de:2873/firmware /var/www/html Die Backend Scripte werden ebenfalls aufgerufen: # backend scripts */5 * * * * /usr/bin/python3 $HOME/clones/backend-scripts/draw_traffic_all.py > $HOME/.cronlog/draw_t */5 * * * * /usr/bin/python3 $HOME/clones/backend-scripts/check_bind_gw.py > $HOME/.cronlog/check_bin */5 * * * * /usr/bin/python3 $HOME/clones/backend-scripts/check_exitvpn_gw.py > $HOME/.cronlog/check_ */5 * * * * /usr/bin/python3 $HOME/clones/backend-scripts/check_radvd_gw.py > $HOME/.cronlog/check_ra 23 * * * * /usr/bin/python3 $HOME/clones/backend-scripts/gen_website_all.py > $HOME/.cronlog/gen_webs */15 * * * * /usr/bin/python3 $HOME/clones/backend-scripts/sync_meshkeys_gw.py > $HOME/.cronlog/sync_ 54 Kapitel 4. Betrieb Freifunk MWU Gateway Doku, Release 0.1 beta 23 5,23 * * * /usr/bin/python3 $HOME/clones/backend-scripts/snapshot_configs_all.py > $HOME/.cronlog/ 42 19 * * 2 /usr/local/bin/photon-dangerous-selfupgrade.py --sudo --repos $HOME/clones/backend-script Die Logs der Cronjobs werden im admin Homeverzeichnis unter .cronlog (versteckt) abgelegt. Damit das funktioniert, müssen wir es anlegen: mkdir $HOME/.cronlog Als letztes müssen noch die ICVPN Daten aktuell gehalten werden: # 0 0 0 icvpn 3 * * 4 * * 5 * * prototypes U /usr/bin/python3 $HOME/clones/backend-scripts/update_tinc_conf_gw.py > $HOME/.cronlog/updat U /usr/bin/python3 $HOME/clones/backend-scripts/update_bird_conf_gw.py > $HOME/.cronlog/updat U /usr/bin/python3 $HOME/clones/backend-scripts/update_bind_conf_gw.py > $HOME/.cronlog/updat Dabei sollte darauf geachtet werden, dass U so gewählt wird, dass diese sich möglichst nicht mit den Tagen der anderen Gateways überlappen. Bei Änderungen der Anzahl der Gateways können hier Verschiebungen auf allen Gateways nötig werden; U kann (und wird) mehr als einen Tag enthalten, an jedem Tag sollte auf einem Gateway das Update laufen. Sollte sich dort eine Fehlkonfiguration einschleichen, so werden auf diese Weise nicht alle ICVPN Verbindungen gleichzeitig disfunktional. Bemerkung: Um das oben genannte zu erreichen hier eine Übersicht der momentanen Konfiguration. Wir müssen verhindern, dass wir uns durch ein fehlerhaftes Update gleichzeitig alle Gateways zersägen, zumindest sollte dies zeitversetzt geschehen. Weiterhin sollte der Zugriff auf die Git Repos auch nicht gleichzeitig stattfinden um Merge-Conflicts vorsorglich zu verhindern. Nächste Schritte: • Nur Scripte nach oben gennanten Kriterien in der Tabelle auflisten • Schema ausknobeln, wie man (z.B. anhand der Gateway-Nummer) eindeutige Zeitpunkte festlegen kann: – Wochentag, Stunde, Minute • Schema auf die Tabelle anwenden • Cronjobs auf den Gateways anpassen • ??? • Profit! 4.3. Backend Scripte 55 Freifunk MWU Gateway Doku, Release 0.1 beta Script/Gate Kaschu alfred announce firmare sync draw traffic check bind check exitvpn check radvd gen website sync meshkeys snapshot configs selfupgrade * * * * * update tinc conf update bird conf update bind conf alfred to zone ffmap-d3 Spinat Wasserfloh Aubergine x */5 * * * * 23 * * * * */15 * * * * x 23 5,23 * * * 42 19 * * 2 0 3 * * 3,6 0 4 * * 3,6 0 5 * * 3,6 x x x cleanup node states mirror openwrt repo nagg exitvpn accouts autobuild gluon x x x x Pudding Linse x 23 */8 * * * */5 * * * * */5 * * * * */5 * * * * meshviewer 56 Lotuswurzel 42 5,23 * * * 42 17 * * 2 0 3 * * 3,6,7 0 4 * * 3,6,7 0 5 * * 3,6,7 x x x x x 23 5,23 * * * 42 19 * * 2 0 3 * * 2,5 0 4 * * 2,5 0 5 * * 2,5 23 5,23 * * * 42 19 * * 2 0 3 * * 2,5 0 4 * * 2,5 0 5 * * 2,5 42 5,23 * * * 42 17 * * 2 x 42 5,23 * * * 42 17 * * 2 42 5,23 * * * 42 17 * * 2 x 0 5 * * 0,1,5 */15 * * * * * * * * * * * * * * */15 * * * * 19 1 * * * * x 23 19 * * * 23 17 * * * x #42 5 * * 0,4 x x x x x x Kapitel 4. Betrieb KAPITEL 5 Mitwirken Du hast eine Stelle entdeckt, die Schreibfehler enthält, was unsauber oder falsch erklärt, nicht existiert aber sollte, oder veraltet ist? Gerne nehmen wir sinnvolle Vorschläge und Ergänzungen mit auf, über den Issue-Tracker (mit dem Label ‘Doku’) oder am besten gleich per Pull Request. 57
© Copyright 2024 ExpyDoc