Interface geht sporadisch down …

Frei nach dem Motto „wenn man nichts zu sagen hat, …“ ist es hier in letzter Zeit sehr ruhig gewesen. Meine IT zu Hause läuft einfach zu rund, es gibt nichts zu Berichten. Nun ja bis heute…

Seit geraumer Zeit läuft auf meinem StorageServer ein TV Headend. Das lief bis vor kurzem Problemlos. Nur seit ein paar wochen plagen mich kurze Verzögerungen/Aussetzer. Anfangs konnte ich das auf einen schlechten SAT Empfang schieben aber immer gehäufter traten folgende Fehlermeldungen in den Logs auf:

Das eth-Interface geht Down und kommt sofort wieder hoch. Fast alle Protokolle und Dienste (NFS, SAMBA,…) scheinen damit gut klar zu kommen nur TV Headend goutiert das mit einem Connection-Reset und am Client sieht man „negative Auswirkungen“.

Davon abgesehen, warum geht das Interface unmotiviert down. Kurze Analyse später, das passiert häufiger: 2-5 mal am Tag. Meine postulierte Verfügbarkeit von 99.999% war dahin. Es folgten 2 Wochen Fehlersuche:

  • Kabel tauschen
  • Interface tauschen
  • Verschiedene Switcheinstellung (Powersave) abgeschaltet…
  • div. Optionen testen
  • vieles mehr …

Dank des sporadischen Auftretens hieß es nach jeder Änderung Stunden warten …

Ein Switch Tausch brachte die nötigen Hinweis. Der eigentliche Switch konnte als Fehlerquelle ausgeschlossen werden, da der Fehler auf allen Ports auftrat aber immer nur, wenn an dem Port mein Server hing. Alle anderen Geräte wiesen diese Disconnects nicht auf. An dem „notfall“-Switch traten die Disconnects aber auch nicht auf, die OnBoard-Netzwerkkarten waren also auch nicht defekt.

Schnell nochmal alle Switch-Einstellungen kontrolliert und dann die kryptische Option IEEE802.3az gefunden. Google angeworfen und geflucht.

IEEE802.3az (oder Energy Efficient Ethernet/EEE) ist eine Powersaving-Option (die Sinnigerweise nicht unter Powersaving aufgeführt wurde …) bei der zwei Geräte untereinander aushandeln ob und wann sie ihre Transmitter am Interface abschalten. Das erklärte auch das Fehlerverhalten. Immer wenn ich einen Lasttest gefahren hab, trat das Problem nicht auf, da EEE nicht zugeschlagen hat. Erst wenn nur Sporadisch Bandbreite benötigt wurde, kam es zu Disconnects.

Der erste Versuch EEE vie ethtool abzuschalten brachte keine Besserung:

Erst als am Switch EEE für den ServerPort abgeschaltet wurde verschwand das Problem.

ExpireDate von Zertifikat überwachen.

Wer, wie ich, eine eigene (private) CA betreibt, wird irgendwann mal überrascht feststellen, dass auch das Root-Zertifikat ausläuft. Standardmäßig nach 4 Jahren. Wenn plötzlich der Radius keine Clients mehr ins Netz lässt, wenn jede interne HTTPS-Verbindung auf Warnung läuft und man sich plötzlich wieder mit Notfall-Passwörtern anmelden muss, weiß man, dass man vergessen hat, sein Root-Zertifikat rechtzeitig zu erneuern.

Was bei einzelnen Clients noch mit vertretbaren Aufwand zu beheben ist, nervt beim Zwangs erneuern der CA doch ziemlich, besonders wenn man gerade etwas anderes vor hatte.

Für diesen Zweck hab ich mir ein kleines Script gebastelt, das via Munin alle Cert-Restlaufzeiten ermittelt und rechtzeitig Alarm schlägt.

wie immer unter GPL hier zu beziehen: Check Expire Date

IP-Connection-Track erkennt keine stehenden Verbindungen

Wer das Problem hat, dass bei iptables-Rules wie der folgenden keine (oder nur vereinzelt) Verbindungen nach draußen zustande kommen hat das gleiche Problem wie ich es hatte:

Die Regel besagt, alles von „Drinnen“ (eth1) nach „Draußen“ (pppoe0) zuzulassen und alle Pakete der Verbindungstatus als ESTABLISHED oder RELATED erkannt wird zuzulassen. Kurz: eine StateFull-Firewall die alles von drinnen nach draußen routet aber von draußen nur angefragtes rein lässt.

Wer auf etwas „stabilere“ (oder ältere) Software setzt (in Worten: debian squeeze) ist noch mit einem 2.6er Kernel unterwegs. Bei diesem sind die Module fürs ConnectionTracking wohl noch etwas schärfer/unbrauchbarer.

Erst mit folgendem Befehl verhält sich das ConnectionTracking wie man es erwarten würde:

Ab Kernel 2.6.22 ist dies nicht mehr notwendig.

Quelle: http://conntrack-tools.netfilter.org/manual.html

EdgeMax Lite – eine kurze Review

Seit 14 Tagen verrichtet ein Router der Marke „EdgeMax Lite“ von Ubiquiti seinen Dienst in meinem Netzwerk. Hier eine kleine Zusammenfassung meiner Erfahrungen.

Kurzfazit: Dieser Router wurde darauf ausgelegt 1Gbit über alle drei Ethernet Interfaces zu routen. Dafür wurde auf die üblichen Dinge wie WLAN, integrierter Switch, TK-Anlage und weitere Features verzichtet. Wer hingegen einen leistungsstarken Router und nur „einen Router“ braucht, der liegt mit diesem Gerät goldrichtig.

Der EdgeMax Lite wird es als Produkt nicht leicht haben, dass wird schon bei einem einfachen Blick auf die Featureliste und Technischen Daten klar. Andere Produkte im 100€ Segment bieten für die „normale Nutzung“ wesentlich mehr zusätzliche Features. Spätestens 30 Minuten nach Inbetriebnahme dürfte der Normalnutzer entgeistert aufgeben und bereuen sich keine „Eierlegende Wollmichsau“ zum gleichen Preis gekauft zu haben. Wie ein solcher „Vergleich“ sich dann in einem Test niederschlägt, kann man bei SmallnetBuilder nachlesen. Den EdgeMax mit einer FritzBox zu vergleichen ist ungefähr so als wolle man einen Combi mit einem Sportwagen vergleichen. Das kann man machen, viel Sinn macht es aber nicht.

Ich hab mich für einen Einsatz des EdgeMax entschieden, da mein „alter“ Buffalo AG300H einige Features einfach nicht abdecken konnte. Das Killer-Feature war dabei der Routing-Durchsatzt. Ich wollte meinen Server von meinem lokalen LAN isolieren. Etwas was jeder IT-Azubi im ersten Lehrjahr lernen sollte. Mit dem Buffalo war das nicht möglich. Ein frisches OpenWRT mit geflushten Iptables brachte gerade mal 400mbits über den Router. Sobald ein paar Iptables Rules zum Einsatz kamen, sank der Durchsatz auf unter 300mbits. HD Filme die von einem NAS gestreamt werden, fangen jetzt an zu ruckeln. Das war keine Option.

Der EdgeMax gibt sich hier keine Blöße. Wie von Ubiquiti beworben legt er das Gigabit auf die Leitung. Der Einsatz von Firewall-Regeln oder QoS  hat dabei keinen Einfluss auf den Durchsatz, wenn man sich an kleinere Einschränkungen hält (erleuterung folgt gleich). Mittels IPerf konnte ich 850mbits ermitteln. Wobei mein Switch 900mbits auf die Leitung legt. Dieser Durchsatz wird erreicht, ohne dass der CPU auch nur Notiz davon nimmt (Load von 0).

Ein Blick auf die technischen Daten macht aber klar, dass dieses Ergebnis zu erwarten ist. Zum Einsatz kommt ein Cavium Octeon 500MHz Dual Core (Hardware Einheit zur Paketverarbeitung inklusive), 512MB RAM und 2GB Flashspeicher. Das ist einfach eine andere Hausnummer als meine bisherige Routerhardware. Auch so hinterlässt der EdgeMax einen anderen Eindruck als jeder SoHo Router den ich bis jetzt in die Finger bekommen habe. Er blinkt nicht wie ein Weihnachtsbaum und buhlt auch nicht um Aufmerksamkeit wie die letzten Asus und Netgear Geräte.

EdgeMaxLite
EdgeMax-Lite während der Konfiguration

Das auffälligste ist im ersten Moment der vierte RJ45 Port – die gute alte Serielle Schnittstelle ist zu Wartungszwecken raus geführt worden. Gut selbst Cisco nutzt dafür jetzt USB Ports aber egal, ob Hauptsache sie ist raus geführt. Danach bekommt man (normalerweise) als erstes die (Web) GUI zu Gesicht. Diese kann man wohlwollend mit „managementtauglich“ Beschreiben. Man kann quasi jedem Azubi Zugriff geben, viel kaputt machen kann er nicht… Selbst für das Konfigurieren der Interfaces braucht man Zugriff via Konsole. Eine Konsole kann man zwar auch über die GUI bekommen, aber dass ist dann nicht mehr Klicki-Bunti. Überhaupt die GUI noch die sichtbarste Baustelle. Das einrichten einer Firewall Rule geht noch alles andere als intuitive von der Hand.

Wenn man sich via SSH (muss aktiviert werden) oder gar Seriellen Konsole auf den Router verbindet bekommt man direkten Zugriff auf das Router OS. Zum Einsatz kommt ein von Ubiquiti geforktes Vyatta. Dies ist eine Debian basierte Router Distribution. Anders als z.B Chanonical setzt Ubiquiti aber auf die standart Debian (squeeze) Quellen.

Die zur Verfügung gestellte vbash lehnt sich in Aufbau und Bedienung an die IOS (Cisco) Devices an. Das kann man mögen, muss aber man nicht. Standardmäßig wird zudem eine eingeschränkte Quagga Routing Suite eingesetzt. Wobei ich das Gefühl nicht loswerden, dass diese nur eingeschränkt wurde, weil man noch nicht das ganze Spektrum in der Konfigurations-Schnittstelle abdecken kann.

Das Konfigurieren geht dabei gut von der Hand. Schnittstellen und Routing sind schnell und übersichtlich Konfiguriert und der Router einsatzbereit. Besonders angenehm fällt dabei die „Commit/Rollback“-Fähigkeit der Konfigurationsoberfläche auf. Änderungen müssen erst via „Commited“ freigegeben werden bevor man sie final in den VRAM raus schreiben kann. So kann man zu jedem Zeitpunkt seine Änderungen „einsehen“. Beim Commit werden die neuen Einstellungen auf „Konsistenz“ geprüft. Firewall Rules ohne Interface werden gar nicht erst gespeichert. Anschließend werden alle Änderungen wirksam gemacht: Befehle angewendet, Dienste neu gestartet usw. Erst jetzt kann der finale „Save“ ausgeführt werden. Fehlkonfigurationen bei denen man sich selber Aussperrt, werden so erschwert. Zusätzlich können mehrere Einstellungssets vorgehalten werden. Das wirkt alles ausgereift und durchdacht. Nur leider bleibt das was man konfigurieren kann, weit hinter dem zurück, was dieser Router bietet.

Für mich war bei der Einrichtung der Firewall Schluss mit der vbash. Ich weiß nicht wie viele Versuche ich gesehen habe das Iptables-Kommando vor dem Benutzer zu verstecken. Dies ist ein weiterer auf der Liste. Kurz: ich führe nur noch das Nötigste (interfaces, web-gui abschalten, logins) in der Konfiguration, danach geht es über einen zweiten Benutzer (alternativ sudo su) an das „eigentliche“ Debian.

Ab jetzt spielt der „Router“ seine Stärke aus: brachiale Performance, Platz und Debian halt. 2GB sind für den Anfang mehr als genug um ein paar zusätzliche Dienste zu installieren. Da man die kompletten Debian-Quellen im Zugriff hat, findet man eigentlich jeden Dienst, den man irgendwie im Netzwerk gebrauchen könnte. Man hat aber auch nur 2GB Speicher. Eine Erweiterung via USB oder anderen BusSystem ist nicht vorgesehen. Zum Hosten kleiner WebSites würde es reichen, ist aber nicht zu empfehlen. Begründung folgt gleich…

Bei muss der Router FreeRadius , Kerberos  zur Verfügung stellen und mehrere Clients mit einer 2 DMZ-Lans verbinden. Zu Testzwecken hab ich vier simultane (unterschiedliche Rechner) bonnie++ auf eine NFS Freigabe losgegangen. Der Durchsatz über den Router lag immer  im Bereich 750 bis 850 mbits und die CPUs langweilten sich bei einem Load von 0. Auch versuche die CPU mit normalen Radius/Kerberos anfragen zu quälen, waren nicht von Erfolg gekrönt. Das sollte für den „Heimgebrauch“ reichen. Der Durchsatz ist aber stark vom Einsatz-Szenario abhängig. Die Hardwarebeschleunigung greift nicht überall. Sobald Bridging oder VLANs in Spiel kommen, muss die CPU rann. IPv6 wird erst mit der neusten Firmware auch „beschleunigt“ (disabled by default.). Wenn die Hardwarebeschleunigung fehlt bricht der Durchsatz rapide ein. Jeh nach Szenario landet man bei 500mbits oder gar 400 mbits (Firewall, NAT, QOS, IPv6 ohne HW) und der CPU ist am Limit. Der Router war allerding noch  ansprechbar, und gut bedienbar. Ich hab es mit fünf Simultanen Floodings nicht geschafft, den Router so weg zu schießen, dass er nicht mehr bedienbar war. Ob er einem richtigen DDOS angriff stand hält würde ich mal bezweifeln.

Ein Wort zu den VLANs/Bridging Einschränkungen. Es ist möglich auf einem Interface „ungebridged“/“ungetagged“ und gleichzeitig „bridged“/“tagged“ zu arbeiten. Dabei wird der „ungebridged“/“ungetagged“ Traffic durch die Hardware beschleunigt und der Rest muss über die CPU. Man hat also, wenn man es clever anstellt, genügend Spielraum diesen „Makel“ zu umgehen. Zumal der Hersteller in Aussicht gestellt hat, dass sich dieser Umstand in Zukunft noch verbessert, sprich VLANs auch Hardware beschleunigt werden. Überhaupt sind noch viele der Eckpunkte des EdgeMax „im Fluss“. Ubiquiti erweitert mit jedem Update die Funktionalitäten, den Umfang der Hardwarebeschleunigung und behebt (natürlich) Bugs. Dabei hatte ich nie das Gefühl eine Beta im Einsatz zu haben. (Wobei man sich für selbige anmelden kann.) Die FirmwareUpdates machen immer einen sehr runden Eindruck.

Wo wir bei den Firmware Updates waren. Die kommen momentan recht zügig (zwischen 1.1.0 und 1.2.0 lagen 4 Monate). Das Firmwareupdate läuft dabei ähnlich wie bei OpenWRT. Einmal geflasht gehen alle Informationen verloren. Einzig die ConfigDatei und alles was in bestimmten Ordnern liegt wird erhalten. Größere Datenmengen oder gar Datenbanken verbieten sich da. Da nach einem Update sowieso die zusätzlichen Dienste neu installiert werden müssen, sollte man sich nur Keys, Certs und ähnliches auf dem Router vorhalten. Ein richtiger Webserver schließt sich somit fast aus. Komfortabel ist das noch nicht. Ein Mitarbeiter von Ubiquiti hat jedoch erläutert, dass in späteren Versionen auf einen RollingRelease angeboten werden könnte…

Wo wir beim letzten wichtigen Thema sind: dem Support von Ubiquiti. Der wird recht häufig gescholten. Ich hatte bis jetzt nur das „Vergnügen“ ihn in den Foren zu erleben und muss sagen, dass es wirklich ein Vergnügen ist. Es scheinen ein paar Mitarbeiter der EdgeMax Produktlinie abgestellt worden zu sein, durch die Foren zu streifen. Zu jeder wichtigeren Frage findet man immer eine, meist sogar mehrere Antworten von Ubiquiti-Mitarbeitern. Sie begründen Entscheidung, gehen auf Testergebnisse ein oder geben Hilfestellungen. Alles in allem macht es einen ungewohnt offenen Eindruck. Dies ist aber angesichts der Funktionalität und der (fehlenden) Dokumentation auch nötig. Während die meisten etablierten Router-Hersteller eine selbsterklärende GUI oder dicke (sinnfreie) Manuals anbieten, baut Ubiquiti gerade erste ihre KnowledgeBase auf. Bei vielen Fragen muss man aufs Forum zurückgreifen. In diesem Fall sehe ich das aber nicht als Nachteil. Die Suche funktioniert gut die passenden Antworten sind markiert.

Ein letztes Wort zum Thema OpenSource: Hier blick ich nicht mehr ganz durch. Laut Ubiquiti ist es möglich sich einen eigenen Kernel oder gar Image selber zu erzeugen. Bei Freebsd und OpenWRT gibt es auch Builds die wohl den Chip unterstützen. In wie weit dort die Hardware-Beschleunigung inbegriffen ist konnte ich in Ermangelung an Zeit nicht Testen. Interessant ist in jedem Fall, das für einen SDK von Cavium erst mal ein NDA unterzeichnet werden muss. Man bekommt also einen Kernel mit ClosedSource Binaries. Für Leute die nur 100% frei Software im Einsatz haben wollen, ist die Büchse aktuell erst mal nichts.

Für alle anderen, die einen „echten“ Router suchen, ist der EdgeMax genau das richtige. Klein, Unscheinbar, Leistungsstark und wenn man Linux beherrscht simpel in der Bedienung. Hatte ich den serielle Konsole schon erwähnt? Ende des Jahres sollte die 5Port POE Version des Routers im Handel verfügbar sein, dann werden meine Buffalos endgültig ausgemistet…

Zertifikatseigenschaften von FreeRadius prüfen lassen

Ich hab seit einiger Zeit einen FreeRadius-Server um mein WLAN abzusichern und mein VPN Zugang zu regeln. Das System war so konfiguriert, dass der Client ein Zertifikat vorzeigt, einen Tunnel aufbaut und dann via EAP/PAP autorisiert wird. Das Gruppenmanagement übernahm dabei LDAP und die das Passwort wurde via Kerberos geprüft. Alles in allem sehr flexibel aber auch sehr komplex. Vor allem der LDAP Server störte mich doch extrem. Zum einen ist der so ganz anders zu konfigurieren und zu verwalten, als alle anderen Dienst ein meiner Landschaft, zum anderen hab ich ihn nie so richtig verstanden. Kurz der musste weg. Ich wollte aber weiterhin die Option haben, eine Nutzer via VPN auf Subnets „Zugang“ zu lassen aber vom Heimnetz „Sicher“ fern zu halten. Insofern man den aktuellen FreeRadius einsetzt bietet dieser eine sehr elegante Möglichkeit an, dass auf Zertifikatsbasis zu lösen.

Der Grundgedanke: Insofern man der CA wirklich vertraut bzw. die CA selber stellt, kann man davon ausgehen, dass ein Client nur das Zertifikat hat, dass er haben darf. Verlust und Diebstahl wird über eine aktuelle „Revocation Liste“ gelöst. Vertraut man der CA, kann man somit die Zugangsinformationen ins Zertifikat hinterlegen. Zum Beispiel kann man das OU (OrganisationUnit) oder gar das CN Feld nutzen. In meinem Fall, hab ich mich auf das CN Feld bzw den ganzen Zertifikats-Pfad verlassen. Meine Netz ist in verschiedene Bereiche getrennt: Sicher, Gesichert, Offen (Radius entfällt). Alle Clients haben schon jetzt Zertifikate die wie folgt aussehen: hostname.sicher.ca oder bekannter.gesichert.ca. Ich musste den Radius nur noch dazu bekommen, dass ein Client der in das „Sichere“ Netz will auch ein „sicher.ca“-Zertifakt vorweißt.

Umsetzung: Was man vorher braucht, ist ein Radius der TLS beherrscht. Das wird hier beschrieben: Ubuntusers:Wiki – FreeRadius. Läuft der TLS Modus stehen nun eine Reihe von Variablen innerhalb der FreeRadius-Configuraiton zur Verfügung. Eine komplette Liste konnte ich nicht auftreiben aber laut einigen Mailinglisten sind die folgenden Variablen wohl verfügbar:

  • TLS-Cert-Serial
  • TLS-Cert-Expiration
  • TLS-Cert-Issuer
  • TLS-Cert-Subject
  • TLS-Client-Cert-Serial
  • TLS-Client-Cert-Expiration
  • TLS-Client-Cert-Issuer
  • TLS-Client-Cert-Subject

Interessant ist die TLS-Client-Cert-Subject – Variable. Diese stellt das Subject via String zur verfügung. Jetzt muss man nur noch mittels RegExp seine gewünschte Prüfung durchführen. Dass kann dann so aussehen.

Die „Huntgroup“ ist eine Eigenschaft die durch beliebige Regeln vorher gesetzt wird. In meinem Fall sieht die Regel so aus:

Was folgt ist folgende Prüfung. Wenn eine TLS-Verbindung über einen Zugangspunkt mit der IP 10.11.1.2 und NAS-ID (vorher vereinbart) „sicheres-lan“ ankommt muss das CLientZertifikat auf „*.sicher.ca“ ausgestellt sein. Alles andere wird abgeleht. Mann kann da noch weitere else-Zweige einbauen. Aber das Prinzip bleibt das gleiche.

Servergespeicherte Profile mit unison

Da CSync leider nicht meine Erwartungen erfüllt hat bzw. nicht im Ubuntu-Repository versorgt wird musste ich mich vor ein Weile nach Alternativen umschauen.

Dabei bin ich auf Unison gestoßen. Installiert man es auf Client und Server kann man via ssh sehr schnell große Datenmengen in beide Richtungen abgleichen. Man kann sogar eine Konfliktlösungsstrategie angeben, falls es sowohl auf Server als auch Clients zu Änderungen kam.
Mittels Exclude-List kann man gezielt steuern was übertragen werden soll. Sogar via Regex.

Beispielconfig:

Das ganze kann man ohne Probleme über ein Skript beim Start oder Login automatisieren:

Bleibt nur noch das Problem wie man den ssh-Daemon auf der Server-Seite dazu bekommt ohne weitere Passwortabfrage eine Verbindung zuzulassen. Da gibt es verschiedene Varianten wie z.b. das Public-Key-Verfahren (wobei der keyring automatisch aufgemacht werden muss) oder GSSAPI. Letztere ist relativ bequem einzusetzen, wenn man mal einen Kerberos eingerichtet hat. Dann muss man einfach folgende Konfiguration im SSH Daemon vornehmen.

Anschließend akzeptiert der SSH Daemon nach einem Neustart auch Kerberos Tickets anstatt ein Password abzufragen.

Bird: strange next-hop

Nach meinem Umzug auf OpenWRT kam ich in den Genuss, das bei einem Reconnect nicht jeder Dienst neu gestartet wird. Leider hatte dieses „normale“ verhalten dazu geführt, das BIRD nicht mehr alle Routen propagiert hat. Das Problem: Es tauchten unvermittelt meldungen in folgendem Format im Syslog auf:

Zu Meldungen dieser Art kommt es wenn eine Routing-Regel aus der Kernel-Routing Tabelle gelernt wird, die ein direkt angeschlossenes Netz über einen entfernten Gateway schleifen will. Typisch für P-T-P und P-T-MP Verbindung wie OpenVPN oder PPPD. Interessanterweise stört BIRD das nur bei neu erlernten Routen. Ist die Route beim Dienst-Start schon in der Routing-Tabelle gibt es keine Probleme. Die Meldung kann man Unterdrücken, was jedoch stört ist die Tatsache, dass die entsprechende Routing-Rule nicht an die anderen Protokolle übertragen wird. Die möglichen Lösungen:

  • Eine statische Route über das Interface definieren und via Filter verhindern, dass diese Route zurück in den Kernel geschrieben wird.
  • BIRD nach einem Reconnect neu starten.
  • Diverse Protokolle bieten es an Netzwerke zu propagieren, die sie eigentlich nicht kennen. Unter OSPF kann man z.B. ein stubnet Konfigurieren. Dies hat den Charme, dass man der Route gleich entsprechende Kosten auferlegen kann. Die Route wird nur an die OSPF-Neighbors weitergereicht nicht an irgendein ein anderes Protokoll in der BIRD Instanz.

Welche der Lösungen man wählt hängt wohl vom Einsatzgebiet ab, ich hab mich für letztere entscheiden.

IPSec/L2TP VPN mit OpenWRT

Da ich mehrere Android Geräte in Benutzung habe die ich nicht „rooten“ darf und dennoch einen VPN Tunnel in mein Heimnetzwerk brauche, hatte ich das „Vergnügen“ mich mit IPSec/L2TP – Tunneln auseinander zu setzten. Android bietet native aktuell vier VPN-Varianten an: PPP, L2TP, IPSec/L2TP (PSK), IPSec/L2TP (Certificate)

PPTP fällt aus, da der Android-Client nur primitive Authentifizierungen anbietet, welche als leicht angreifbar gelten. L2TP ist nur ein Layer2-Tunnel-Protokoll um darüber wiederum ein PPP-Tunnel aufzubauen. Da L2TP selber nicht Verschlüsselt ist das ganze nur so sicher wie der PPP Tunnel. Bei welchem wieder nur primitive Authentifizierungen angeboten wird. Bleibt als letzte Alternative nur den L2TP-Tunnel via eines IPSec Tunnel zu sichern. Sowohl die PSK (PreSharedKey) als auch zertifikatsbasierte Lösung sollten hinreichend sicher sein.

Damit beginnt aber auch schon der Ärger.  IPSec-Gateways findet man nur in wenigen SOHO Geräten vorkonfiguriert (z.b. einigen Fritzboxen) und das aus gutem Grund. Das Zusammenspiel Clients, Netze, Netzanbieter und IPSec läuft nicht so reibungslos wie es sollte. Dazu gleich mehr.

OpenWRT bietet gleich mehrere IPSec und L2TP Dienste an. Ich hab mich für den StrongSwan4 – Daemon als IPSec Dienst entschieden. Da dieser auch IKEv2 anbietet, in der Hoffnung dass dies vom auf Android eingesetzten Racoon-Daemon auch mal genutzt wird.

Des weiteren komm der xl2tp-Daemon oder der standardmäßig installierte ppp-Daemon zum Einsatz.

Bevor man die Sache angeht sollte man folgendes beachten um sich viel Zeit und Ärger zu ersparen: Das fehleranfälligste an einem IPSec/L2TP-VPN ist der IPSec-Anteil. Man sollte diesen also getrennt testen. Als sinnvoll hat es sich gezeigt, den Zielrouter mal vom Netz ab zu klemmen, die Firewall abzuschalten und plain den xl2tp-Daemon im Zusammenspiel mit dem PPP-Daemon zu testen. Das ganze geht einfach von der Hand und ist robust und stressfrei.

Danach kann man den IPSec Tunnel via PSK hochziehen und im internen Netz testen. Anschließend kann man ggf noch Zertifikate zur Authorisierung nutzen. Erst wenn das alles im internen Netz klappt sollte man Versuchen von „Außen“ auf das VPN zuzugreifen. Es empfiehlt sich an dieser Stelle für die Mobilen Devices einen LogReader zu installieren. Für Android ist das die App aLogcat. Leider gibt der racoon-Daemon nur in die Logfiles aus warum er einen Tunnel wieder zu macht oder warum er erst gar keinen aufbauen will.

Wie eingangs erwähnt gibt es mehrere Stolpersteine. Es war mir z.b. nicht möglich eines meiner Geräte dazu zu bewegen, den IPSec Tunnel aufzubauen. Das lies sich aber zweifelsfrei auf das Netzsegment zurückführen. Eine SIM-Karte des gleichen Netzanbieters aus einem anderen Gerät (anderes Netzsegment) eingewechselt und schon konnte der Tunnel aufgebaut werden. Es scheint Probleme beim Zusammenspiel Racoon – open/strong-Swan zu geben wenn mehrfaches „NAT“ing zum Einsatz kommt.1

Diesen Widrigkeiten zum Trotz kann man das ganze relativ leicht auf OpenWRT oder Ubuntu wie folgt einrichten:

Man benötigt  als Pakete den PPP-Daemon, XL2TP-Daemon und StrongSwan.

Configuration – /etc/ppp/options.xl2tpd

Hinweis ich erzwinge das unsichere PAP weil der IPSec-Tunnel via Zertifikaten gesichert ist (sehr schwer zu brechen, eigene CA) und FreeRadius für alles andere Klartextpasswörter im Zugriff braucht. Das muss man ggf. an seine Anforderungen anpassen!

Configuration xl2tp – Achtung hier verwende ich keine Authentifizierung. Das überlasse ich IPSec und PPPd
/etc/xl2tpd/xl2tpd.conf

Nun zu IPSec

Anschließend sollte man sich noch vor der Dummheit der Nutzer und Clients schützen. Wenn der Racoon unter Andoid die Verbindung abbricht, versucht es der L2TP-Daemon dennoch aufzubauen. Die Verbindungsverwaltung bemerkt das zwar und beendet die Verbindung sofort, dummerweise wurden schon die Authentisierungs-Daten im Klartext gesendet. (Nein auch MS-Chap-v2 zählt als Klartext). Ein Angreifer kann so gezielt (über NAT) ein kurzes Downgrade erzwingen, die Daten abgreifen und dann selber ohne IPSec einen L2TP-Tunnel aufbauen.
Um das zu verhindern muss man IPTables dazu bringen Verbindungen für Port 1701(L2TP) nur dann anzunehmen, wenn diese über IPSec reingekommen sind. Früher war das einfach, da gab es ein ipsec-Device, heute muss man über die mangle-Table rann. Das ganze sieht dann wie folgt aus

Mittels dieser Regel lehnt der Gateway alle L2TP Pakete ab, die nicht über IPSec gesichert wurden.

Linux Bandbreiten-Monitor/Traffic-Accounting

Wenn man unter Linux einen Rechner betreibt findet man einen Haufen an Möglichkeiten den Bandbreitenverbrauch zu ermitteln. Betreibt man hingegen einen Router und will nicht nur den eigenen Verbrauch, sondern den Transfer-Traffic aufgeschlüsselt nach gewissen Attributen, wird es dünn im Lösungsumfeld. Soll das ganze dann noch auf einem handelsüblichen SOHO-Router laufen, wird es richtig kniffelig.

Das erste Problem ist, dass man wissen muss nach,nach was man sucht. Unter „Bandbreiten-Monitor“ verstehen die meisten Lösungsvorschläge das Monitoring des eigenen Verbrauchs/Traffic oder nur das „Gesamtaufkommen“ an einem Interface. Kurzum: Werte die sich leicht ermitteln lassen. Das aufschlüsseln des Transfertraffics bezeichnet man häufig als IP-Accounting. Danach teilt sich das Feld in folgende Lösungen auf:

  • Promiscuous Mode Basiert: Hierbei wird ein Interface in den Promiscuous-Mode geschaltet und der komplette Netzwerktraffic mitgeschnitten. Die Lösungen unterscheiden sich dann darin, wo und wie die Daten ausgewertet werden. Im einfachsten Fall werden die Pakete vorverarbeitet und an eine Sammelstelle weiter geleitet. Bekannteste Vertreter sind NTop, NProbe und bandwidthd.
  • IPTables/NetFilter Basiert: Hierbei wird ausgenutzt, dass IPTables mit protokolliert wie viele Pakete/Bytes über eine Filter-Regel gelaufen sind. Dies kann man dann asyncron über Bash-Befehle auslesen.

Der Promiscuous Mode basierten Lösungen sind die allumfassenden Lösungen. Sie schneiden alles mit und können die detailliertesten Auswertungen bieten. Sie haben jedoch immer zwei massive Nachteile. Erstens ist die benötigte CPU-Leistung enorm. Selbst die schlanke NPrope schaffte bei einem 600MHz Prozessor nicht mal Ansatzweise den zu erwartenden Transfertraffic (100Mbit/s). Auch wird das Analyseziel stark belastet. Sowohl was die Bandbreite als auch die CPU-Last betrifft. Das ist für eine einfache Bandbreitenanalyse ein wenig übertrieben. Des weiteren ist es mehr als fraglich ob das ganze rechtlich überhaupt zulässig ist. Immerhin handelt es sich hierbei um eine DPI,  jeh nach Ausführung sogar mit ungesicherter Ausleitung.

Die IPTables -Variante hat den Vorteil, dass die Pakete sowieso durch IPTables verarbeitet werden müssen. Der Overhead für das zusätzliche Monitoring hält sich in Grenzen. Auf besagtem 600 MHz Prozessor war keine Leistungsabfall durch Zu- oder Abschalten der Filter-Regeln zu messen, noch gab es eine nennenswerte CPU-Last. Der Nachteil ist jedoch, dass man wissen muss was man Monitoren will. Wenn man nur wissen will, wie viel Traffic auf ein Netzsegment entfällt, ist das einfach umsetzbar. Will man jedoch wissen auf welchen Client im Netzsegment der Traffic aufgelaufen ist, wird es schwierig. Besonders wenn es sich um ein Netzsegment mit ständig wechselnden Clients handelt wird es nahezu unmöglich das mit IPTables alleine zu bewerkstelligen.

Abhilfe schafft ein die ULog Schnittstelle und ein Daemon aus dem pmacct.net-Project. IPTables führt das Decoding und Vorfilterung durch und leitet das Paket dann an den uacctd weiter. Dieser filtert, aggregiert und verarbeitet die Daten oder leitet sie an ein Sammelstelle weiter.

Das Ganze ist denkbar einfach zu konfigurieren. Als erstes braucht es nur IPTables-Regeln die die interessanten Pakete ausleiten.

Durch diese Regeln werden alle Pakete die das 192.168-Netz betreffen an die ULog-Schnittstelle weitergeleitet. Die weiteren Parameter bewirken, dass immer gewartet wird bis sich 50 Pakete gesammelt haben und nur die ersten 48 Bytes weitergeleitet werden. Die Group-Angabe ist später für die Auswertung wichtig.

Der entsprechende uacctd ist wie folgt konfiguriert:

Durch diese Konfiguration werden zwei Endpunkte angelegt, jeweils einen für ein- und ausgehendem Traffic und nach internem Client aggregiert. Der Speicherverbrauch und die Prozessorlast ist in meinem Einsatzgebiet zu vernachlässigen (selten mehr als 20 Clients gleichzeitig) kann jedoch je nach Einsatzart stark ansteigen. Ob das ganze bei 10k Clients und „portgenauem“ Monitoring noch skaliert habe ich nicht ausprobiert.

Auswerten kann man das ganze wie folgt:

Mit der eigenen Wunsch-Skriptsprache kann man nun die wildesten Skriptes zum überwachen des Traffics basteln.
Hier mein Beispiel für einen Perl-Skript/Munin-Plugin: munin-bandwidth.perl

Kerberos und NFS einrichten.

Ich kämpfe schon eine weile mit CIFS/Samba her rum. Bisher hab ich es leider nicht geschafft die Transferraten über mehr als 40MByte/s zu bekommen. Was bei Gigabit-Ethernet unbefriedigend ist. Vor einem Wechsel auf NFS habe ich mich aber immer gedrückt. Zum Einen weil dann immer die „Böse“ LDAP-Konfiguration im Raum stand, zum Anderen, weil ich der Meinung war Kerberos nicht zu brauchen.

Nun hat sich in den letzten Tagen herausgestellt, dass ich ein paar mehr Dienste brauche, die alle eine eigenen Authentisierung mit sich bringen. Darauf hatte ich keine Lust, ergo Kerberos musste her. Zweitens hat sich gezeigt, dass man LDAP nicht braucht. Das Maping von Usernamen/Groups funktioniert auch so Prima.

Es gibt ein gutes Tutorial, mit dem man innerhalb von einer Stunde einen NFS-Share mit Kerberos Unterstützung einrichten kann: NFSv4-Howto

Das Tutorial hat nur zwei Schönheitsfehler:

  • Der wichtigste Hinweis wird nicht hervorgehoben. Wer es ums verrecken nicht hinbekommt, dass sich NFS über Kerberos Authentifiziert sollte  seine /etc/krb.conf checken. Dort muss unter [libdefaults] der Eintrag „allow_weak_crypto = true“ gemacht werden.
  • Die Angaben für die /etc/exports Datei sind veraltet. Es wird noch die „gss/krb5“ verwendet. Aussehen sollten die exports aber so.

    So kann man auch gleich dem Benutzer überlassen welche „Absicherung“ er gerade benötigt.

Des bin ich beim Einrichten des NFS-Shares noch über eine Stolperstein gefallen:

Aus irgendeinem Grund war der NFS-Server im all_squash Modus. Soll heißen alle User wurden auf „Nobody/Nogroup“ gemapt. Was zur folge hatte, dass ich zwar den Share mounten konnte aber keine Berechtigung hatte. Mit der Option „no_all_sqash“ war das behoben.

Anschließend hab ich mal Bonnie++ auf den Share los rennen lassen. Das Ergebnis waren 95.1MByte/s Read/Write. Kein Vergleich zu CIFS. Einzig wenn ich die höchste Sicherheitsstufe (krb5p – Transportverschlüsselung) ging die Performance in Knie (20 MByte/s).