Simpler Zugang zum Netz, oder nicht? CaptivePortal in einfach – Logging

In meinem ersten Artikel bin ich nicht so wirklich auf das logging eingegangen. Die Lösung die ich bis dahin hatte war auch nicht wirklich hübsch. Nun hab ich eine Lösung mit der ich leben kann ;-)

Was ist das Problem?

Das Problem ist, dass wir eine Verbindung zwischen den Logs aus iptables und den Einträgen in der Datenbank haben müssen. In der Datenbank steht die MAC – der eindeutige Schlüssel. In den iptables-Logs steht allerdings nur die IP. Die IP Adresse kann sich ändern, wenn sich beispielsweise jemand längere Zeit nicht anmeldet wird er vom DHCP Server eine neue IP bekommen. Also müssen wir die Zuordnung direkt – Just-in-Time vornehmen.

Gar nicht so schwierig

iptables kann nicht die MAC mitloggen, da ihm an dieser Stelle die MAC nicht bekannt ist (FORWARD Chain). Also brauchen wir was anderes. Rsyslog loggt bereits die mit captivePortal getaggten Einträge in ein gesondertes Logfile. Nun werden wir ihm beibringen die Meldungen an ein Script zu übergeben. Dieses Script schreibt die MAC dazu und loggt das ganze. Am Ende haben wir die IP und die MAC im Logfile und damit unsere Verbindung zwischen den Datensätzen.

iptables

iptables muss loggen:

$IPTABLES -t filter -A POSTROUTING -s 192.168.199.0/24 -p tcp -j LOG --log-prefix "captivePortal: "

Das ganze fügen wir in Zeile 45 in unserem iptables Script ein (s. hier). Dadurch bekommen wir für jeden Zugriff eine Meldung per Syslog – getaggt mit “captivePortal: “.

Rsyslog

Rsyslog nutzen wir nun um die Meldungen an ein Script weiterzugeben. Die Konfiguration sieht so aus:


$template Alert,"%TIMESTAMP% %msg%"
:msg, contains, "captivePortal:" ^/opt/captivePortal/LogCP2script;Alert
& ~

Um mit Hilfe von Rsyslog Meldungen / Events an ein Script zu übergeben muss man ein Template benutzen. Das Template setzt in diesem Fall nur einen Timestamp vor den Eintrag und belässt ansonsten die Meldung so wie sie ist. Das ganze gilt natürlich nur für Meldungen mit dem Inhalt “captivePortal: “.

Log-Script

Das Script ist recht simpel. Ich bediene mich – mal wieder – dem arp Cache um die Zuordnung vorzunehmen.

Für jede Meldung wird also die MAC aus /proc/net/arp gesucht, hinter die IP geschrieben und das ganze dann in ein Logfile geschrieben.


#!/bin/bash

IP="`echo "$*" | grep -o "192.168.199.[0-9]*"`"
MAC="`grep $IP /proc/net/arp | awk '{print $4}'`"

LOG="`echo $* | sed "s/$IP/$IP($MAC)/"`"

echo "$LOG" >> /var/log/captivePortal.log

Achtung! In dem grep muss ggf. die IP Range angepasst werden!

Damit haben wir das iptables Log um die MAC erweitert. Generell muss man natürlich sagen dass wir in dem Log aus iptables lediglich die Ziel-IPs sehen und nicht – wie beispielsweise bei Proxy Logs – die komplette URL und weitere Informationen. Ich denke im Fall des Falles sollte dieses Logging jedoch ausreichen.

One Response to Simpler Zugang zum Netz, oder nicht? CaptivePortal in einfach – Logging

  1. Seb

    Warum nicht einfach im PREROUTING-Chain loggen? Da gibt’s auch die MAC-Adresse. Nur nicht das ausgehende Interface, aber das brauchts üblicherweise auch nicht.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>