„Mal eben in eine Netzwerk-Verbindung hineinschauen“ – Level2 Bridge auf einem Raspberry Pi

Vorrede

Vor kurzem hatte ich ein Problem: Ich wollte eine IP-Telefonanlage hinter einer Fritzbox anschließen. Die Installation verlief problemlos und alle Netzwerkeinstellungen schienen zu stimmen, aber es wollte einfach nicht funktionieren.
Wenn ich das gleiche Problem an meinem PC gehabt hätte, hätte ich „schnell mal eben“ Wireshark gestartet, um mir den Datenstrom anzuschauen und in den Netzwerk-Paketen Hinweise darauf zu finden, was schief geht. Nun ist es aber so, dass Wireshark und ähnliche Programme den Datenstrom „sehen“ können müssen, um ihn zu analysieren. Das bedeutet zumeist, dass diese Programme auf einem der beiden Endpunkte installiert sein müssen, da in modernen Netzen die Daten von Gerät A an Gerät B nicht bei Gerät C vorbei kommen.

In meinem Fall war das schwierig, denn weder die Fritzbox noch die IP-Telefonanlage ließen mich in den Datenstrom hineinschauen und Software konnte ich dort auch nicht installieren.
Ich hätte mich also ZWISCHEN die beiden Geräte hängen müssen, um sie zu belauschen: eine klassische „Man-In-The-Middle“ Attacke.

ACHTUNG: Das Abfangen und Abhören von Daten anderer ist illegal. Die hier gezeigte Technik darf nur für die Fehlersuche der eigenen(!) Netzwerke verwendet werden. Andere Teilnehmer im Netz müssen zuvor informiert werden!

Da ich schon vorher mal in einer ähnlichen Situation war, wollte ich fürs nächste Mal vorbereitet sein, und habe mir meinen Raspberry Pi geschnappt, um ihn in ein Netzwerk-Analyse-Tool zu verwandeln:

Vorbereitung

Der Linux-Kernel enthält bereits die notwendigen Werkzeuge: Netzwerk-Brücken. In manchen fällen muss jedoch noch das Paket „bridge-utils“ installiert werden (Beispiel für Debian, Ubuntu etc.):

sudo apt install bridge-utils

Beim Erstellen einer Bridge werden zwei oder mehr Netzwerk-Schnittstellen zu einem virtuellen Netzwerkgerät zusammengefügt und alles was auf einer Seite an Datenverkehr geschieht, wird auf die jeweils andere(n) Seite(n) „gespiegelt“.
Ein Netzwerkteilnehmer an Port 1 der Bridge kann also durch die Bridge hindurch mit dem restlichen Netzwerk so kommunizieren, als wäre die Bridge nicht da. Das gilt nicht nur für TCP und UDP sondern auch für die Anmeldung im Netz via DHCP, da die Schnittstellen schon auf Level 2 miteinander verbunden sind (vgl. OSI-Schichtenmodell).

Da Raspberry Pis nur eine einzige physische Netzwerk-Schnittstelle haben, benötigt man noch einen USB-Ethernet-Adapter, den man für wenige Euros bekommt – ich habe für meinen unter 10€ bezahlt (USB 3 mit 1000Mbit) .

Je nach verwendeten Geräten und Betriebssystem bekommen die Schnittstellen unterschiedliche Namen, ich werde im folgenden „eth0“ für die eingebaute Schnittstelle verwenden und „eth1“ für das USB-Gerät (die Schnittstellen erhalten aber zuweilen auch sehr lange Bezeichner wie enp3s0f1 oder noch längeres, das sollte nicht abschrecken). Welche Schnittstellen vorhanden sind, kann man mit dem Befehl „ip addr“ sehen. Die Schnittstelle „lo“ ist nur für die interne Kommunikation und kann ignoriert werden.

Da die Schnittstellen eth0 und eth1 demnächst nur noch Teil der Bridge sein werden, dürfen sie selbst nicht mehr als Netzwerk-Verbindungen konfiguriert sein. Bei meinem RaspberryPi musste ich hierfür zunächst den Network-Manager deinstallieren, damit er nicht dazwischenfunkt:

sudo apt remove network-manager

Achtung: Das Entfernen des Netzwerk-Managers kann zur Folge haben, dass Sie sich nicht mehr (ohne Weiteres) mit dem Netzwerk verbinden können. Entfernen Sie den Netzwerk-Manager nur auf einem Gerät, bei dem Sie nicht darauf angewiesen sind (z.B. ein Rechner, den Sie nur per Netzwerk erreichen).

Einrichten der Bridge

Man kann die Bridge zwar auch „on-the-fly“ mit dem Befehl „brctl“ erstellen, aber auf diesem Wege wäre sie nach einem Reboot wieder weg. Ich halte es daher für sinnvoller, sie in der Datei /etc/network/interfaces einzutragen, so dass sie immer sofort bereitsteht.
Die Netzwerk-Schnittstellen eth0 und eth1 müssen wir dort auf „manual“ stellen, damit sie dem System zwar bekannt sind, aber nicht automatisch eine Konfiguration verpasst bekommen. Der Bridge geben wir hier auch einen beliebigen Namen, ich werde hier br0 verwenden:

#/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto eth1
iface eth1 inet manual

auto br0
   iface br0 inet dhcp
   bridge_ports eth0 eth1

Hierbei ist zu beachten, das eth0 und eth1 zwar weiterhin zusehen sind, aber br0 ist die Schnittstelle, über die das System ins Internet kommt, also wird sie hier auch so konfiguriert, ihre eigene IP-Adresse per DHCP zu beziehen. eth0 und eth1 bekommen keine IP-Adressen. Dies kann man auch  – nach einem Reboot – durch einen Aufruf von ip addr sehen:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel master br0 state DOWN group default qlen 1000
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 192.168.222.22/24 brd 192.168.222.255 scope global dynamic br0

(Diese Ausgabe wurde zur Übersichtlichkeit etwas gekürzt – nicht wundern, wenn bei Ihnen deutlich mehr steht)

Verwendung der Bridge

Ab nun ist alles eigentlich recht simpel. Ich verwende eth0 (also die eingebaute Schnittstelle), um mich mit meiner Fritzbox zu verbinden, dank DHCP geht das auch vollautomatisch.

Das zu untersuchende Netzwerkgerät stöpsele ich von der Fritzbox ab und stecke es in den USB-Ethernet-Adapter – dass es nun hinter der Bridge hängt, bekommt es nicht mit. Es kann aber gut sein, dass der Netzwerkverkehr nun etwas langsamer ist, da er ja nun durch die beiden Schnittstellen und den Prozessor des Raspberry Pi muss – es ist also keine Dauerlösung, sondern sollte nur zur Fehlersuche verwendet werden.

Auf dem Raspberry Pi kann ich nun mit der Software meiner Wahl alles mitlesen, was durch die Bridge hindurch geht. Wireshark ist dabei ein mächtiges Tool, welches aber mit seiner speicherhungrigen graphischen Oberfläche auf älteren Raspberry Pis etwas träge läuft. Auf die schnelle sehen, was so läuft, kann man mit tcpdump und iptraf-ng. Wie üblich installieren wir diese via:

sudo apt install iptraf tcpdump wireshark

iptraf-ng und tcpdump laufen im Terminalfenster, man kann sich damit an die virtuelle Schnittstelle br0 hängen, dann sieht man aber auch die Kommunikation die vom eigenen RasperryPi ausgeht. Wenn man dagegen an eth1 lauscht sieht man nur die Kommunikation die vom und zum zu untersuchenden Gerät übermittelt wird (incl. Network-Broadcasts).

Was man noch machen kann

Hiervon ausgehend kann man natürlich weiter arbeiten. Hat man einen USB-WLAN-Adapter oder ein RasPi-Modell, welches mit eingebauten WiFi aufwarten kann, kann man dieses so konfigurieren, dass es als WLAN-Access-Point für andere Geräte fungiert. Die Bridge würde man dann zwischen eth0 und wlan0 erstellen und kann dann die Pakete einsehen, die darüber laufen.
Heutzutage sollte eigentlich jegliche wichtige Kommunikation verschlüsselt sein, daher ist es meist nicht möglich den Inhalt der Kommunikation einzusehen, aber es ließe sich so feststellen, ob eine bestimmte App „nach Hause telefoniert“ oder ob Daten wirklich – wie vom Hersteller versprochen – verschlüsselt werden.
Oder man kann, wie ich, sehen, dass ein Gerät eine falsche Absender-IP-Adresse zur Kommunikation verwendet.

VPN als Sicherheitsmaßnahme

Für jemanden mit ein bisschen Linux Erfahrung ist es also möglich in Windeseile einen RaspberryPi Zero-W so zu konfigurieren, dass er als WLAN eines Cafes erscheint oder zwischen einem PC und dem DSL-Router des Ex-Freunds oder der Ex-Freundin geklemmt wird. Dies ist, wie Eingangs erwähnt, illegal und wird empfindlich bestraft, dennoch wird es solche Attacken immer wieder geben.
Wie ich wunderbar beobachten konnte, ist ein VPN eine gute Schutzmaßnahme: Nachdem ich mich auf dem zu analysierenden PC mit dem VPN der Uni Köln verbunden habe (wichtig: Option „Full Tunnel“), konnte mein lauschender RasPi als Angreifer nur noch verschlüsselte VPN-Pakete sehen, die ohne Schlüssel nur Datenmüll enthalten und keine Rückschlüsse mehr darauf zulassen, ob ich gerade auf Facebook bin, oder per IP-Telefonie mit meiner Oma telefoniere.

Aber Achtung: VPNs bieten keine Ende-Zu-Ende-Verschlüsselung! Im Falle des VPN der Uni Köln wird der Internetverkehr lediglich dorthin umgeleitet. Ein Angreifer dort oder ein unseriöser VPN-Anbieter können den Netzverkehr wieder mitlesen. Ab dem VPN-Server laufen die Daten wieder genau so (unverschlüsselt) wie ohne VPN. Sitzt der Angreifer jedoch nicht an meinem DSL-Router, sondern zapft die Leitung meiner Oma an, kann er wohl möglich trotzdem mitlauschen, wie sie mir ihr Geheim-Rezept für ihren Apfelkuchen mitteilt.

Hinweis: Diese Dinge wurden nicht auf einem RaspberryPi sondern auf einem BananaPi mit Armbian Linux getestet. Es sollte so jedoch auf jedem Linux-Gerät umzusetzen sein, dessen Kernel die Bridge-Module enthält, und auf dem die benötigten Pakete bridge-util, iptraf, tcpdump und ggf. wireshark vorhanden sind. Die Befehle zum installieren von Pakten und die Dateien in denen das Netzwerk konfiguriert werden muss, können dabei abweichen.

Webseitenstatistiken und SEO mit Matomo: Hinweise und Tipps

Immer wieder werden wir nach der richtigen Verwendung von Matomo gefragt, und wir helfen gern, soweit wir können.
Es gibt hier aber oft Fehleinschätzung der Bedeutungen der Statistiken. Das häufigste Problem ist das der Sample Size: Eine signifikante Statistik über eine Seite mit nur 2-3 Besuchern am Tag zu erstellen, wird nicht funktionieren.
Daher hier etwas Lesestoff mit Hinweisen und Tipps, die man verinnerlicht haben sollte, bevor man ein großen SEO-Programm oder eine Reichweiten-Analyse beginnt.

HINWEISE:

1. Fast alle Browser bringen eine Funktion mit, die das Tracken von Zugriffen untersagt, bei vielen Browsern ist diese per Default aktiviert. Sie sehen also nur einen Bruchteil der Klicks.

2. Sehr viel häufiger als von Menschen, werden die Webseiten von Bots, Crawlern und auch von böswilligen Angreifern besucht. Um halbwegs verwendbare Zahlen zu liefern, muss Matomo also ordentlich ausfiltern. Diese Filter sind nicht perfekt so dass eine Vielzahl von registrierten Klicks gar nicht auf reale Menschen zurückzuführen ist.

3. Aus der Sicht von Matomo ist jeder Browser zunächst eine eigene Person. Sind Sie mit Ihrem Mobilgerät mal im WLAN, mal im Funk-Netz und mal in einem anderen WLAN oder im VPN, sieht es so aus als wären es mehrere Personen. Haben Sie zuhause eine normale DSL Leitung bekommen Sie wahrscheinlich täglich eine andere IP-Nummer und zwar eine, die an anderen Tagen von anderen Kunden Ihres Providers genutzt wurde.
Aus dieser sehr schmutzigen Datenlage versucht Matomo mit „schlauen“ Filtern anhand von Indizien mehrere scheinbare Besucher zu eindeutigen Besuchern zusammenzufügen. Dies wird niemals perfekt gelingen, so dass die Anzahl von eindeutigen Besuchern immer zu hoch sein wird.

4. Viele Betreiber von Webseiten unterschätzen grob, wie viele Personen fälschlicherweise auf eine Webseite kommen, merken dass es nicht das ist, was sie suchten und wieder gehen. Die „Verweildauer“ einer Person auf der Seite ist sehr wichtig. Selbst reale Personen, die nur wenige Sekunden auf einer Seite bleiben, sollten statistisch eigentlich nicht berücksichtigt werden.

Die Zahlen der „korrekten“ Messungen werden also immer zu niedrig ausfallen, die Zahlen von „falschen“ Messungen immer zu hoch. Dies führt dazu, dass die absoluten Zahlen äußerst unzuverlässig sind, besonders wenn sie klein sind. Sie messen also nicht die tatsächliche Zahl der Besucher, sondern die nur die Wirksamkeit der Matomo-Filter.

Als Faustregel sagen wir immer:

Solange Sie nicht mindestens 100 Besucher am Tag angezeigt bekommen, dürfen Sie die Zahlen in Matomo ignorieren.

TIPPS:

Aber Matomo kann auch für Seiten mit wenigen Besuchern sehr nützlich sein, man muss lediglich mit den relativen Angaben in Matomo arbeiten. Es gilt also immer, zwei aussagekräftige Messungen zu finden und diese in Relation zu einander zu betrachten. Hier ein paar Beispiele:

1. Mobil-Anteil: Wählen Sie links unter „Besucher“/“Geräte“, und sie erhalten Auswertungen, mit was für Geräten Ihre Webseite aufgerufen wird. Oft wird unterschätzt, dass heute (Stand 2020) schon 30-50% Smartphone-User normal sind.

2. Uhrzeiten: Wenn Sie wissen, dass Ihre Zielgruppe aus Deutschland stammt, wählen Sie links unter „Besucher“/“Zeiten“, und Sie erhalten Auswertungen, zu welchen Uhrzeiten sich Personen auf Ihren Seiten bewegen. Haben Sie im Vergleich(!) zu den Spitzenzeiten ungewöhnlich viele Aufrufe zu Zeiten, zu denen Ihre Zielgruppe schlafen sollte, können Sie sehen, dass hier viele falsche Messungen erfasst wurden, und Sie somit auch den anderen Zahlen nicht trauen können. Man kann aber auch Abschätzungen treffen, ob Personen eher zu normalen Arbeitszeiten tagsüber auf Ihre Seite kommen, oder in der Freizeit am Wochenende oder Abend.

3. A/B-Vergleich: Bauen Sie zwei (oder mehrere) unterschiedliche Seiten mit dem gleichen Inhalt, Verlinken Sie diese auf unterschiedliche Weise: In Mailanschreiben, auf Postern, auf Ihrer Startseite als Teaser (verlinktes Bild) oder im Fließtext. Schauen Sie nach einer angemessenen Zeit nach, welche Seite mehr Klicks bekommen hat.

4. Vorher/Nachher-Vergleich: Erstellen Sie eine Seite und bewerben Sie diese eine Zeit lang nicht. Dann ergreifen Sie nacheinander und dokumentiert verschiedene Maßnahmen: Mail-Anschreiben, Verlinkungen auf anderen Seiten, Facebook, Twitter etc. und schauen Sie ob sich die Besucherzahlen nach einer dieser Maßnahmen signifikant ändern.

5. Verweildauer: Wie oben schon erwähnt sind die Verweildauer und die sog. Absprungrate extrem wichtige Messwerte um die Attraktivität Ihrer Seite einzuschätzen. Hier geht es selten um optisches Gefallen, sondern darum, ob ein Besucher nach dem Klick auf Ihre Seite glaubt, am richtigen Ort zu sein. Wird nach einer Detailfrage gegoogelt, man kommt aber auf einer Plakativen Startseite an, wird so manch einer abgeschreckt, auch dann, wenn die gesuchte Information irgendwo auf der Seite zu finden gewesen wäre. Das Verhältnis zwischen der Zahl derer, die Sofort gegangen sind, und derer, die geblieben sind, lässt Rückschlüsse auf die Qualität von Maßnahmen und der Seite als ganzes zu.

6. Transitions: Die Auswertung der Transitions ist ein komplexes Feld in sich welches hier zu erklären zu weit führen würde, doch man sollte dieses Tool zumindest kennen: Im Dashboard finden Sie die Aufzählung Ihrer Seiten und wie viele Klicks diese erhalten haben. Wenn Sie mit der Maus über einer Zeile (ggf. muss ein Order zunächst ausgeklappt werden) hovern, erscheinen drei Symbole, das mit den sich überkreuzenden Pfeilen steht für Transitions. Klicken Sie hierauf und erhalten Sie eine Darstellung, woher die Besucher auf Ihre Seite gekommen sind, und wohin sie danach gegangen sind, oder ob ein Download getätigt wurde. Dies kann gute Erkenntnisse darüber bringen, wie Ihre Seiten aufgebaut werden sollten. Beachten Sie dabei dass es mittlerweile vollkommen normal ist das die überwältigende Mehrheit der Besucher von Suchmaschinen kommt. Selbst wenn jemand die genaue Adresse einer Seite kennt, wird oft eine Suchmaschine verwendet, weil man „zu faul“ ist die Adresse als ganzes zu tippen.

Bedenken Sie aber bei all diesen Überlegungen, dass Matomo lediglich das Verhalten der Besucher aufzeichnet, die Ihre Seite tatsächlich gefunden haben. Nicht erfasst wird das eigentlich viel wichtigere Verhalten der Personen, die Ihre Seiten nützlich gefunden hätten, aber aufgrund falscher Suchbegriffe oder einfach dem Umstand dass die Suchenden gar nicht wissen, wonach sie suchen sollen, Ihre Seite nie gefunden haben.
Auch wissen Sie nicht, was Besucher eigentlich vor hatten, die es auf Ihre Seite geschafft haben.

Ich hoffe diese Informationen helfen Ihnen. Gerne beantworten wir Rückfragen, beachten Sie aber, dass das RRZK Matomo nur bereitstellt. Wir sind keine SEO- und schon gar keine Marketing-Experten.
Matomo ist ein Tool, mit welchem erfahrene Personen Probleme aufdecken können und den Erfolg gezielter Marketingstrategien bewerten können. Wenn Sie in dieses Thema einsteigen wollen, wenden Sie sich bitte an Personen, die sich hiermit beruflich beschäftigen.

 

Noch ein persönlicher Kommentar zu SEO (Suchmaschinenoptimierung):

Wir möchten gerne darauf hinweisen, dass SEO hauptsächlich von Redakteuren umgesetzt werden muss.
Es hält sich hartnäckig der Irrglaube, dass SEO nur die Anwendung technischer Tricks ist. Diese sind wichtig, keine Frage, aber die Suchmaschinen werden immer gute Webseiten belohnen. Wichtiger als dem neusten SEO-Trend hinterherzulaufen ist es meist, verständliche, übersichtliche Webseiten zu erstellen, die den Besuchern bereitwillig die Informationen geben, die gesucht werden, statt ihnen Informationen aufzudrängen, die nicht wirklich nachgefragt werden. (vgl. https://xkcd.com/773/)
Kurze, prägnante Überschriften, klare Einleitungen sind wichtig. Absatz-lange Überschriften, die sich in Details verlieren schrecken ab und lesen sich so gut wie das deutsche Steuergesetzbuch. Bedenken Sie dass Suchmaschinen-Benutzer mit unterschiedlichstem Vorwissen irgendwo auf Ihren Seiten einsteigen. Wer sich sofort gut aufgehoben fühlt, weiß wo man gelandet ist und findet, was er sucht, wird mit einer besseren Meinung die Webseiten verlassen.
Ein wesentlicher Bestandteil in Googles Bewertungssystem war und ist, ob eine Webseite von anderen Seiten verlinkt wird. Verlinken Sie Partnerseiten untereinander und sorgen Sie dafür, dass Sie an wichtigen Stellen erwähnt werden. (Haben Sie aber dabei Verständnis, dass die Startseite der Uni und ähnliche Seiten nur einen begrenzten Platz haben und nicht jede Seite ganz oben stehen kann.)
Beachten Sie aber auch, dass keine Suchmaschinen Optimierung nötig ist, wenn die Suchenden gezielt zu Ihnen wollen: Solange es keine zweite konkurrierende Uni-Köln gibt, werden die Suchbegriffe „Uni Köln“ immer zu uns führen. Finden Sie lieber die Schlagworte, die Sie von anderen Suchergebnissen abgrenzen, und verwenden Sie diese prominent in Überschriften und Seitentiteln.

LOGIN:
Haben Sie eine Webseite, auf der die Statistik Erfassung aktiviert ist, loggen Sie sich mit Ihrem Uni-Account ein unter: https://matomo.rrz.uni-koeln.de. Haben Sie mehrere Webseiten, für die Sie zuständig sind, können Sie zwischen diesen innerhalb von Matomo hin und her wechseln.

Die Statistikerfassung ist bei den meisten TYPO3 Seiten der Uni-Köln bereits aktiviert, falls nicht, wenden Sie sich an Ihren Administrator.

Mit freundlichen Grüßen
Thomas Moll

Web-Browser und -Server… was reden die da eigentlich??? Server-Sockets mit nc

Wer sich mit Webservern und -browsern beschäftigt, wird irgendwann an den Punkt kommen, wo man einfach mal wissen will, „Was zur Hölle der Browser und der Server da genau bereden“

Tools wie wget helfen einem zwar, zu überprüfen, ob ein Server eine Datei wirklich ausliefert, aber viele Funktionen werden im HTTP-Header ausgehandelt und die Server reagieren dabei speziell auf die unterschiedlichen, browserspezifischen Anfragen.

Wenn es also so aussieht, als würde der Server einem Firefox andere Daten schicken, als einem Chrome, möchte man sicherlich wissen, ob es wirklich so ist und wie sich die Kommunikation generell unterscheidet.

Hier kann ein Trick helfen, über den ich kürzlich gestolpert bin. Er beruht auf dem Befehl nc (netcat), der in vielen Konstellationen hilfreich sein kann.

nc (netcat)

nc öffnet entweder eine Verbindung zu einem Server-Port (z.b. dem HTTP-Port (80) eines Webservers) und verhält sich dabei sehr ähnlich zu telnet.
Im Gegensatz zu telnet kann nc jedoch auch selbst einen Socket öffnen und auf eingehende Anfragen antworten. Hierfür wird der Switch -l verwendet.

Egal, in welcher Richtung die Kommunikation aufgebaut wird, verbindet nc immer die Standard-Eingabe (stdin) mit dem Kommunikationspartner.
Wird der Befehl also einfach so verwendet, können Sie direkt mit der Tastatur eingeben, was dem Kommunikationspartner gesendet werden soll.
Startet man auf einem Rechner ein lauschenden Server-Socket auf Port 54321:

# nc -l 54321

… kann man sich von einem anderen Rechner aus damit verbinden:

# nc hostname.des.servers 54321

Nun hat man eine Verbindung, die man zum Chatten verwenden kann.

Auf dem üblichen Weg lassen sich per Pipe auch die Ausgaben anderer Befehle über diese Leitung zu übertragen, statt die Tastatur Eingabe zu verbinden.
Startet man den Server z.B. so:

# ls -l | nc -l 54321

… bekommt man beim Verbinden mit dem Socket das aktuelle Verzeichnis, in dem der Server gestartet wurde angezeigt. Danach schließt sich die Verbindung und sowohl Server- als auch Client-Prozesse werden gestoppt.

Sehen was der Browser sendet:

So ist nc also schon nützlich: Man kann einen Server-Socket öffnen und im Webbrowser dessen Adresse eingeben. Im obigen Beispiel also http://localhost:54321/. Zwar wird im Browser so nicht unbedingt etwas sinnvolles angezeigt, weil unser nc-Server kein HTTP spricht, aber auf der Konsole können wir nun sehen, welche Anfrage genau der Browser an unseren Server geschickt hat:

GET / HTTP/1.1
Host: localhost:54321
Connecdern: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36 Vivaldi/1.0.403.20
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: _pk_id.2478.1fff=bda69bf5b5894886.1457526065.1.1457526065.1457526065.

Dies ist nun aber nur eine einzelne Anfrage und wir können nicht die Antwort des Servers sehen, der uns eigentlich interessiert.

Umleiten einer Verbindung

Hier kommt nun eine weitere praktische Zutat ins Spiel: Named Pipes. Während wir mit dem Pipe-Symbol (Senkrechter Strich: |) nur die Ausgabe eines Programms mit der Eingabe des direkt folgenden Programms verbinden können, werden Named Pipes im Filesystem abgelegt und können auf diese Weise angesprochen. Diese Pipes werden mit dem Befehl mkfifo angelegt, sie verhalten sich dabei weitgehend wie Dateien.

Named Pipes können wir nun dazu verwenden, zwei nc-Prozesse miteinander zu verbinden: Einen, der auf Verbindungen vom Browser wartet, einen der eine Verbindung zu einem Webserver herstellt:

Anlegen der Named Pipe (der Name und Pfad können frei gewählt werden):

# mkfifo /tmp/proxyfifo

Zwei nc-Prozesse starten und verbinden

# nc -l -p 54321 </tmp/proxyfifo | nc server.domain.de 80 >/tmp/proxyfifo

Löschen der Pipe:

#rm /tmp/proxyfifo

Statt http://server.domain.de geben wir nun im Browser ein: http://localhost:54321.

Der Browser zeigt uns nun die Webseite des Servers an. Da unsere nc-Prozesse aber nur jeweils eine Verbindung aufbauen und sich danach beenden, werden wahrscheinlich Bilder und CSS-Dateien nicht vollständig geladen. Beherrschen Browser und Webserver beide „Keep-Alive“ werden jedoch durchaus mehrere Ressourcen übertragen bevor die Verbindung beendet wird – nur halt nicht alle.

Dies ist bis jetzt noch wenig sinnvoll, aber da die Verbindung nun durch unsere Hände geleitet wird, können wir uns einklinken, und mitlesen, was die beiden Gesprächspartner miteinander austauschen.

Belauschen der Verbindung:

# mkfifo /tmp/proxyfifo
# nc -l -p 8080 </tmp/proxyfifo | tee /dev/stderr | nc server.domain.de 8480 | tee /dev/stderr >/tmp/proxyfifo
# rm /tmp/proxyfifo

Der Einfachheit halber werden hier beide Kommunikationsrichtungen per tee zusätzlich auf der Standard-Fehlerausgabe (stderr) ausgegeben, was zum Mitlesen ausreicht.

In manchen Fällen möchte man darüber hinaus in die Kommunikation Eingreifen und die übertragenen Daten „on-the-fly“ manipulieren, auch dies ist mit diesem Ansatz möglich.

Da der Browser im obigen Beispiel glaubt mit „localhost“ zu kommunizieren, überträgt er in seinem HTTP-Request einen falschen Host, dies könnte man beispielsweise mit sed korrigieren wollen:

# mkfifo /tmp/proxyfifo
# nc -l -p 8080 </tmp/proxyfifo | sed -u "s/Host: localhost:8080/Host: rrzk.uni-koeln.de/g" | tee /dev/stderr | nc rrzk.uni-koeln.de 80
# rm /tmp/proxyfifo

Mit diesem Beispiel kann man die Webseite des RRZK über den Aufruf http://localhost:8080 laden und sich anschauen welche Daten ausgetauscht werden. (Wie erwähnt wird die Seite so nicht vollständig geladen).

Aufräumen:

Damit keine Bruchstücke liegenbleiben sollte man eine Named Pipe immer wieder neu anlegen und nach dem Aufruf direkt löschen.

Andere Anwendungsgebiete:

nc kann hier mit jeder Art TCP/IP-Verbindung umgehen, es ist also nicht auf Webkommunikation begrenzt. Besonders bei Anwendungen mit dauerhaft gehaltenen Verbindungen kann nc hier sein volles Potenzial ausspielen. Dies kann besonders Interessant sein bei:

  • Mail-Servern
  • Chat-Servern
  • Spiele-Servern
  • generell allem, bei dem man eine Serveradresse angeben muss

Sie können so rausfinden, welches Protokoll Ihr Netzwerkdrucker spricht und ob eine angeblich verschlüsselte Verbindung wirklich verschlüsselt ist (nc zeigt Binärdaten, wie verschlüsselte oder komprimierte Verbindungen und Dateiinhalte natürlich nur in Form von Datenmüll an).

Fazit:

Mit nc lassen sich auf viele Weisen Daten sammeln, die einem bei der Fehlersuche und -analyse hilfreich sein können.
Obige Beispiele sind nur ein erster Ansatz, sicherlich gibt es noch raffiniertere Kombinationen. Schreiben Sie gerne Ihre eignen Tricks zu diesem Thema in die Kommentare.

Was ist ein CMS? Oder: Manchmal muss man das Einfache komplizierter machen, um das Komplizierte einfach machen zu können.

Die Uni Köln setzt schon seit vielen Jahren Content Management Systeme (CMS) für die Gestaltung ihrer Webseiten ein. Dabei werden verschiedenste Systeme bunt gemischt. Das Rechenzentrum setzt dabei auf TYPO3, für das ich als Webmaster verantwortlich bin.
Ich möchte hier auf kein spezielles CMS eingehen weil Joomla, Drupal, WordPress, TYPO3 und die vielen anderen Systeme vor der gleichen Aufgabe stehen. Die einen können das eine besser, die anderen etwas anderes, unterm Strich unterscheiden sie sich nicht viel.

Doch CMS werden häufig missverstanden. Im Gegensatz zu den Anfangszeiten des Internets, in denen jeder, der Webseiten erstellte, auch ein profundes Wissen über die zugrundeliegende Technik hatte, ist – zumindest an der Uni – die Verantwortung für die Erstellung von Web-Inhalten längst von den „Techies“ weg-gewandert und zählt nun im Grunde zur normalen Büro- und Schreibarbeit.

Das Internet lässt sich jedoch nur deswegen so kinderleicht bedienen, weil viele schlaue Köpfe sich die komplizierte Arbeit gemacht haben, es einfach zu machen.

Zudem wachsen – von vielen oft unbemerkt – die Anforderungen. Der Masse verborgen bleiben, zum Beispiel, die Bemühungen, die Webseiten auch für Sehbehinderte und Menschen mit anderen Handicaps bedienbar zu machen. Dies wird aber wieder interessant, wenn wir versuchen Webseiten mit unseren Smartphones und anderen Mobilgeräten zu bedienen.
Die neusten Generationen von Smartphones mögen mit ihren hohen Bildschirmauflösungen in der Lage sein, Webseiten darzustellen wie es ein Computer mit großem Monitor macht, aber die Schrift wird auf den kleinen Displays unleserlich klein, während – im Vergleich zur Bildschirmgröße – unsere Finger viel zu groß für Links sind, die für die Bedienung mit einem kleinen Mauszeiger optimiert sind.

Was ist „Content“?

Wikipedia bescheinigt Content Management Systemen: „Besonderer Wert wird bei CMS auf eine medienneutrale Datenhaltung gelegt. So kann ein Inhalt auf Wunsch beispielsweise als PDF- oder als HTML-Dokument abrufbar sein“.
In der Theorie schreibt ein Redakteur also seine Texte frei von den Beschränkungen des Mediums, welches zur Auslieferung der Inhalte verwendet wird. Die Inhalte wären in dieser Philosophie also reine Information.

Wer aber schon einmal unsäglich missverstanden wurde, weil eine eigene E-Mail vom Adressaten völlig anders interpretiert wurde, als sie gemeint war, weiß, dass die bloßen Wörter eines Texts nicht alle Informationen übertragen. Im persönlichen Gespräch kann man zusätzliche Gestik, Mimik, Betonung und dramatische Pausen nutzen. Im Geschriebenen versuchen wir diese Stilelemente mit Fettdruck, Kursivschrift, farbigen Unterlegungen und nicht zuletzt auch mit Smileys und anderen Emoticons zu simulieren.

Diese Methoden sind jedoch nicht „medienneutral“. Ein Farbenblinder übersieht vielleicht rote Unterlegungen. Und wie erklärt man einem Text-To-Speach-Programm, wie es von Blinden benutzt wird, was ein kursiver Text ist, und wie dieser vorzulesen ist?
Es ist aber nicht nur die Barrierefreiheit, in der Industrie werden teilweise „Hands-Free“-Systeme nachgefragt, wie Sie sie vielleicht von (SMS-)Vorlesefunktionen neumodischer Autoradios kennen.
In vielen Bereichen ist es einfach praktisch, sich das Medium, mit dem man Inhalte konsumiert jederzeit frei aussuchen zu können.

Ein weiteres Schlagwort ist dabei auch das „Semantische Web“. Gemeint ist dabei der Versuch, die Inhalte im Internet so aufzubereiten, dass Computer (Hauptsächlich die der großen Suchanbieter) auch die Bedeutung dessen verstehen, was auf einer Seite steht, anstatt Webseiten als einfache Zeichenketten zu betrachten. Wie viel besser wären Suchmaschinen, wenn sie unterscheiden könnten, ob ein Text von „Frau Rosa Blume“ handelt, oder von einer Blume, die rosa ist?

Wie kann mir ein CMS dabei helfen?

Natürlich muss zwischen der Theorie und dem praktisch Anwendbaren ein Kompromiss gefunden werden, der mal besser, mal weniger gut auf einen konkreten Anwendungsfall passt.

Die meisten Content-Managemant-Systeme haben natürlich ein Hauptausgabemedium, welches in den allermeisten Fällen eine normale Webseite ist. Daher werden von den meisten CMS Rich-Text- oder gar vollständige WYSIWYG-Editoren angeboten. Die Funktionen (Textstil, Überschriften, Absätze, Einrückungen, Einfügen von Tabellen und Bildern…) kennen die meisten aus Office-Programmen. Und an dieser Stelle kommt es häufig zu einem Missverständnis: Ein CMS ist kein Word. Man arbeitet nicht auf einer freien weißen Seite, dessen Layout frei bestimmt werden kann, sondern eher auf einem Formular mit Textbereichen, welche mit Inhalt gefüllt werden sollen.
Idealerweise positioniert man also nicht die Elemente, sondern man zeichnet sie aus, um die fehlenden Informationen medienneutral und für den Computer verständlich nachzutragen.

Beispiele:

Will man einen Textabsatz, zu dem ein Bild gehört, anlegen, so wäre es nicht medienneutral cm-genau oder Pixel-weise die Position des Bildes zu bestimmen. Besser wäre es, den Text und das Bild zu speichern und die Beziehung dazwischen einzutragen. Diese Text-Bild-Beziehungen könnten sein:

  • „Das Bild ist eng mit dem Inhalt des Textes verknüpft, beide bilden eine Einheit, der Text sollte das Bild umfließen.“
  • „Das Bild begleitet den Text eher lose, und kann auch einfach daneben stehen.“
  • „Der Text, erklärt das Bild, welches der eigentlich wichtige Inhalt ist. Das Bild sollte also so groß wie möglich dargestellt werden, und der Text darunter stehen.“

Dies ist natürlich nur ein kleiner Auszug der Möglichkeiten, die so vielseitig sein können, wie die Menschen, welche die Inhalte erstellen. Um dies also nicht allzu sehr ausufern zu lassen, wird ein CMS daher eher vereinfachte Optionen anbieten, ohne auf den konkreten Grund für die Text-Bild-Beziehung einzugehen:

  • „Text mit Bildumfluss“
  • „Text mit Bild daneben“
  • „Text mit Bild darüber“

Ein anderes Beispiel ist ganz pragmatischer Natur: Wichtige Textpassagen werden gerne rot markiert. Wenn man mal von den Schwierigkeiten von Menschen mit Rot/Grün-Schwäche absieht, kann das Problem entstehen, dass bei einem Wechsel des Designs diese Passage unleserlich wird, wenn sich auch die Farbe des Texthintergrundes im neuen Design geändert hat. Häufiger ist aber der Fall, dass die konkret gewählte Farbe nicht mehr mit dem Farbkonzept des Designs harmoniert. Vorleseprogramme kommen hier, wie gesagt, ebenfalls an ihre Grenzen.
In diesem Fall ist es ratsam, den Textteil als „wichtig“ zu markieren. Im Design würde man dann wiederum definieren, wie „wichtiger Text“ dargestellt werden soll – dies kann dann wieder, wenn es zum Design passt, rot sein, später aber leicht von zentraler Stelle dem Design entsprechend geändert werden können.

Dem Semantischen Web würden hier natürlich Auszeichnungen helfen, die besagen „Das ist ein Name“, „Hier steht eine Adresse“ oder auch „Dies ist ein Akronym“. Von Suchmaschinen ausgewertet, könnte man schnell Suchanfragen formulieren, die einem zum Beispiel alle Seiten anzeigen, auf denen eine bestimmte Person erwähnt wird. Dies ist jedoch – zumindest bei redaktionell erstellten Texten – Zukunftsmusik, für die aber derzeit die Grundlagen geschaffen werden.

Natürlich kann nicht mit allem so abstrakt verfahren werden, und dem Redakteur sollen durchaus noch Möglichkeiten bleiben, seine Inhalte auch optisch ansprechend zu gestalten. Ob ein Bild im Text Rechts oder linksbündig sein soll, um die Gesamtseite aufzulockern, oder ob er zum Verdeutlichen von Zusammenhängen auch Farbmarkierungen anbringen kann, auf die in nicht-visuellen Darreichungsformen verzichtet werden kann, sollte ihm dabei offen stehen.
Dennoch sollte man das Credo „Weniger ist manchmal mehr“ nicht aus den Augen verlieren und hin und wieder einen Kompromiss eingehen, um in der Zukunft weniger Probleme zu haben.

Fazit:

Zwischen dem utopischen Ideal, alle Informationen mitsamt aller Metadaten zu jeder Zeit und über jede denkbare Kommunikationsform in jeweils bester Weise zur Verfügung gestellt zu bekommen, und einem aramäischen Pergament, welches Sie nur nach jahrelangem Studium entziffern können, liegt irgendwo ein Kompromiss, der die Kommunikation für uns alle vereinfacht. Dazu ist es also manchmal nötig, etwas weniger darüber nachzudenken, wie ich einen Inhalt grafisch aufbereite, und dafür etwas mehr darüber, warum ich ihn genauso haben möchte, wie ich mir das vorgestellt habe.
Oder überspitzt ausgedrückt: „Frage nicht (immer) was das CMS für Dich tun kann, frage auch mal, was Du für das CMS tun kannst (damit es Dich besser versteht)“

MySQL-Speicherverbrauch

Wer sich ein wenig mit MySQL beschäftigt hat, weiß, dass es nicht nur in den Features, sondern auch im Handling einige Unterschiede zwischen den DB-Engines MyISAM und InnoDB gibt.
Die Transaktionssicherheit von InnoDB erkauft man sich u.a. durch eine geringere Transparenz, wo welche Daten liegen und auch wie viel Speicherplatz von den einzelnen Tabellen und Datenbanken belegt werden, da die InnoDB im Gegensatz zur MyISAM ihre Daten nicht in separaten Dateien ablegt, sondern alle Daten aller Datenbanken in nur einer Datei vereint.. Hat man viele Datenbanken mit vielen Tabellen, erschwert dies die Fehlersuche und Optimierung ungemein.

Ich habe hier ein paar MySQL-Queries zusammen gestellt, welche die gewünschten Informationen aus den Tabellen der MySQL-eigenen Datenbank „information_schema“ lesen.

Wer sich ein wenig mit MySQL beschäftigt hat, weiß, dass es nicht nur in den Features, sondern auch im Handling einige Unterschiede zwischen den DB-Engines MyISAM und InnoDB gibt.
Die Transaktionssicherheit von InnoDB erkauft man sich u.a. durch eine geringere Transparenz, wo welche Daten liegen und auch wie viel Speicherplatz von den einzelnen Tabellen und Datenbanken belegt werden, da die InnoDB im Gegensatz zur MyISAM ihre Daten nicht in separaten Dateien ablegt, sondern alle Daten aller Datenbanken in nur einer Datei vereint.. Hat man viele Datenbanken mit vielen Tabellen, erschwert dies die Fehlersuche und Optimierung ungemein.

PHPMyAdmin zeigt zwar die Größe der Tabellen an, aber man muss dazu jede einzelne Datenbank anklicken und verliert so den Überblick.

Ich habe hier ein paar MySQL-Queries zusammen gestellt, welche die gewünschten Informationen aus den Tabellen der MySQL-eigenen Datenbank „information_schema“ lesen.

Voraussetzung für alle folgenden Queries ist eine SQL-Verbindung zum Server mit einem Account, der für das Lesen der Informationen aus der Datenbank „information_schema“ berechtigt ist – also z.B. „root“;

Warnung: Diese Anweisungen sammeln Daten über sämtliche Inhalte eines Servers, bei großen Datenmengen und langsamen Servern können diese eine Laufzeit von mehreren Minuten haben und den Betrieb des Servers stark beeinflussen!

Gesamt-Verbrauch aller DBs

Möchte man die Größe aller Datenbanken auf einem Datenbank-Server erfahren, so kann dazu der folgende SQL-Befehl verwendet werden:
SELECT concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES ;

Hierbei wird die Speicherplatzbelegung, die in Bytes vorliegt gleich in MB umgerechnet, für Fälle, in denen das nicht sinnvoll ist, lässt man natürlich die Funktionen round und concat weg und teilt auch nicht durch ( 1024*1024 ).
Diese Abfrage addiert den Speicherplatz-Verbrauch der Daten und ihrer Indices, wer diese Größen getrennt braucht, kann obige Abfrage leicht modifizieren.

Diese Abfrage lässt sich natürlich weiter verfeinern. Da man die Speicherplatzbelegung der MyISAM-Tabellen leicht anhand der Größen der einzelnen Dateien ablesen kann, gehen wir ab hier nur noch auf die InnoDB ein.

Gesamt-Verbrauch aller InnoDB-Tabellen

Die Daten der InnoDB-Engine liegen, wie gesagt, in nur einer Datei. Häufig ist diese Datei mit der Option „autoextend“ konfiguriert, so dass die Datei automatisch vergrößert wird, sobald neue Daten in die Datenbank geschrieben werden. Jedoch schrumpft sie nicht, wenn Daten gelöscht werden. Der freigewordene Speicherplatz innerhalb der Datei, kann wieder von Daten in der InnoDB belegt werden, es dauert also, bis die InnoDB-Datei wieder voll ist, und sie mittels autoextend vergrößert werden muss, aber auf der Festplatte des Servers wird dieser Speicherplatz nie wieder freigegeben. So kann es sein, dass die Datei auf der Festplatte deutlich größer ist, als die Nutzdaten darin.
Um zu erfahren, wie viele Nutzdaten sich also derzeit wirklich in der InnoDB befinden, ist folgende Abfrage nützlich:
SELECT concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB' ;

InnoDB-Speicherverbrauch pro Datenbank

Um zu erfahren, in welcher Datenbank der Speicher verbraucht wird, kann man sich hiermit leicht einen Überblick verschaffen:
SELECT table_schema 'database', concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
GROUP BY table_schema
ORDER BY sum( data_length + index_length );

In diesem Fall wird das Resultat auch noch nach der Größe sortiert.

Hinweis: Nicht vergessen, in diesen Größen-Angaben werden alle Daten, die nicht mit der Engine InnoDB verwaltet werden ignoriert. Will man alle Daten sehen muss die Anweisung WHERE ENGINE='InnoDB' weggelassen werden.

InnoDB-Speicherverbrauch pro Tabelle

Um zu erfahren, in welcher Tabelle einer bestimmten Datenbank der Speicher verbraucht wird, kann hiermit die Datenbank näher inspizieren, dabei muss in der Abfrage natürlich der Name der betreffenden Datenbank anstelle des Platzhalters [DATABASE_NAME] eingetragen werden:
SELECT table_name 'table', concat(round((data_length+index_length)/(1024*1024),2),'M') size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
AND table_schema = '[DATABASE_NAME]'
ORDER BY ( data_length + index_length );

Große InnoDB-Tabellen auf einem Server finden

Möchte man einen ganzen Server nach Tabellen einer bestimmten (Mindest-)Größe durchsuchen, ohne den Umweg über die Größe der Datenbanken zu nehmen, kann man dies auch direkt in einer Anweisung formulieren. Da viele Tabellen sehr klein sind, ist es selten sinnvoll sich die Größe aller Tabellen eines Servers anzuzeigen, daher dient die letzte hier vorgestellte Abfrage dazu, alle Tabellen eines Servers anzuzeigen, die in der InnoDB mindestens 100MB belegen. Die Angabe der Mindestgröße geschieht hierbei in Byte, daher steht in der WHERE-Anweisung des SQL die Zahl 104857600 (=100*1024*1024):
SELECT table_schema 'database', table_name 'table', concat(round((data_length+index_length)/(1024*1024),2),'M') size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
AND data_length + index_length >104857600
ORDER BY ( data_length + index_length );

CSS neu laden, ohne die Webseite neu laden zu müssen…

Mit dem Add-on CSS Reloader kann man im Firefox, den CSS-Code einer Webseite neu laden, ohne den HTML-Code neu laden zu müssen.

Wer Webseiten erstellt und an dem Punkt angekommen ist, an dem das Fine-Tuning des CSS-Codes beginnt, kennt das Problem:

Eigentlich will man nur schauen, ob die jüngste Anpassung den gewünschten Effekt hatte aber beim Drück auf F5 muss man die ganze Seite neu laden, PHP-Skripte müssen gestartet werden, Datenbanken abgefragt usw.

Einfacher können es nun Benutzer des Firefox-Browsers haben: Mit dem Add-on „CSS Reloader“.

Einfach installiert, lädt er beim Druck auf F9 lediglich das CSS einer Seite neu, ohne den HTML-Code neu abzufragen.

Das Add-on kann man hier herunterladen: https://addons.mozilla.org/en-US/firefox/addon/46211/