Gatling auf OpenWrt

Ideen und HowTo's für ein paar nützliche Gatling-Funktionen

Gatling ist ein High-Performance-Webserver vom deutschen IT-Sicherheitsexperten Felix von Leitner. Er ist komplett in C geschrieben und hat bei nur ca. 125 KiB Binarygröße ein ganz ansehnliches Featureset. Unter anderem:

  • sehr schnell
  • HTTPS support
  • CGI, SCGI und Fast-CGI
  • Virtual Hosts
  • eingebauter FTP-Server

Der Name ist bei gatling Programm. Selbst auf meinem Freifunkrouter, der ja nicht sehr viel Leistung hat, kann gatling statische HTML-Seiten innerhalb eines einstelligen Millisekundenbereichs ausliefern.

Zum Zeitpunkt des Schreibens dieses Artikels, muss man gatling noch selbst kompilieren, da es noch nicht in OpenWrt eingefügt wurde. Aber ich arbeite dran. ;-)

Nützliche gatling-Features im Freifunk-Netz

OpenWrt kommt schon von Haus aus mit einem sehr guten Webserver ohne viel Schick-Schnack: uhttpd. Dieser Webserver liefert auch die LuCI-Weboberfläche aus.

Für diesen Zweck ist uhttpd ideal. Wenn wir allerdings unseren eigenen Webseiten im Freifunknetz deployen wollen, gibt es ein paar Nachteile:

  • Port 80 ist schon von LuCI belegt
  • uhttpd unterstützt leider keine Virtual Hosts (mehrere Webseiten auf gleicher Adresse und Port)
  • uhttpd wird mit root-Rechten ausgeführt

Wenn wir unsere Webseiten mit uhttpd ausliefern wollen, bleibt uns deshalb leider nichts anderes übrig, andere Ports als 80 zu wählen.

Und dass uhttpd mit root-Rechten läuft, ist eher so ein bisschen meh. Sollte jemand es schaffen, eine Lücke in uhttpd auszunutzen, hätte er automatisch root-rechte auf dem System.

Beide Dinge lassen sich mit gatling lösen: Man kann gatling unter einem unprivilegierten Nutzer laufen lassen und es unterstützt außerdem Virtual Hosts.

Gatling starten

Weil ich noch nicht herausgefunden habe, wie man LuCI auf einem anderen Port betreiben kann, ohne dass es kaputt geht, bleibt es vorerst auf Port 80 und wir nehmen für die Webseiten Port 81. Dabei gehe ich von dem grundlegenden Setup aus, wie es schon hier beschrieben ist.

Zuerst müssen wir den Abschnitt, der unsere Website über uhttpd ausliefert, aus der Datei /etc/config/uhttpd entfernen und uhttpd neu starten

Danach können wir in unser eigenes Webroot unter /tmp/www/WEBSEITE wechseln und gatling mit diesem Befehl starten:

gatling -p 81 -F -S -u nobody

Damit beginnt gatling, das aktuelle Verzeichnis auf Port 81 auszuliefern. -F deaktiviert den FTP-Server und -S deaktiviert den Samba-Server. Beide Features werden die wenigsten Nutzer brauchen. Mit -u nobody wechselt gatling, nachdem es den Port 81 mit root-Rechten alloziert hat, in den Kontext des Benutzers nobody. Da dieser kaum Berechtigungen auf dem System hat, schränkt es die Dinge, die Angreifer im Falle eines Exploits tun können, stark ein.

Gatling mit Virtual Hosts nutzen

Eine einzelne Website ist schön und gut, aber die maximale Coolness entfaltet gatling erst, wenn wir das Virtual-Hosts-Feature mit -v anschalten.

cd /tmp/www/
gatling -p 81 -v -F -S -u nobody

Mit Virtual Hosts können wir von einer IP-Adresse (und dem gleichen Port) mehrere Webseiten ausliefern. Dabei liest gatling die URL aus, die eine Nutzer:in sehen möchte, wechselt in das Verzeichnis, das der URL entspricht und liefert den Inhalt (meistens die index.html) aus.

Ein Beispiel:

Das Webroot unter /tmp/www/ sieht so aus:

root@freifunk:/tmp/www# ls -l
drwxr-xr-x    2 root     root          60 Jul 30 15:23 default
drwxr-xr-x   10 1000     1000         380 Jul 30 15:23 ff-schnipsel.olsr
lrwxrwxrwx    1 root     root          18 Jul 30 15:23 ff-schnipsel.olsr:81 -> ff-schnipsel.olsr/
drwxr-xr-x   12 1000     1000         300 Jul 30 15:23 freifunk-ag.olsr
lrwxrwxrwx    1 root     root          17 Jul 30 15:23 freifunk-ag.olsr:81 -> freifunk-ag.olsr/

Wenn eine Nutzer:in nun in ihrem Browser http://ff-schnipsel.olsr:81/ eingibt, wird gatling in das Verzeichnis ff-schnipsel.olsr:81 wechseln und die Website ausliefern. Es funktioniert dabei genauso gut, dass ff-schnipsel.olsr:81 ein symbolischer Link auf ff-schnipsel.olsr ist. Dadurch haben wir einen Alias definiert.

Bei der Website http://freifunk-ag.olsr:81 funktioniert es genauso. Dadurch haben wir nun zwei Webseiten, die vom gleichen Router auf dem gleichen Port ausgeliefert werden.

Das Verzeichnis default hat eine etwas besondere Bedeutung. Sein Inhalt wird immer ausgeliefert, wenn das Wechseln in ein anderes Verzeichnis fehlschlägt. Das kann z.B. daran liegen, wenn ein DNS-Eintrag auf unseren Router zeigt, aber es kein Verzeichnis für die entsprechende URL gibt. Oder wenn jemand direkt die IP-Adresse des Routers eingegeben hat.

Anstatt eine kleine Hinweis-Seite auszuliefern, kann default selbstverständlich auch wieder ein Symlink auf andere Seite sein.

Wie betreibe ich gatling dauerhaft?

So wie wir gatling bisher gestartet hatten, ist der Webserver natürlich wieder offline, sobald wir die ssh-Session schließen. Ich habe mir bisher damit beholfen, dass ich gatling in einer tmux-Session gestartet habe. Diese kann man problemlos in den Hintergrund versetzen, sodass gatling weiter läuft. Ich werde das vermutlich auch noch so lange machen, bis ich ein paar nette startup-scripte geschrieben habe.

Ich hoffe, dieses Tutorial konnte dir weiterhelfen. Auf dass wir bald viele schöne neue Webseiten im Freifunknetz sehen. :)

 Share!