Ich habe ein Problem. Und dieses Problem hatte und hat so mancher Admin auch in seinem Netzwerk. User, die meinen eine Zugriffs-Policy mit einer statischen IP-Adresse zu umgehen, weil man ja mehr möchte.
Mein Problem an dieser Sache ist zum Einen, die Problematik mit doppelten IP-Adressen im Netzwerk und die Sicherheit der Firewall. Da ich Firewall-Regeln habe, die bestimmten IP-Adresse den Internetzugang zeitlich beschränken, ist eine von User selbst-vergebene IP nicht wünschenswert. Was also tun?
Im ersten Schritt sollte man den User bitten, von der statischen IP-Adresse wieder auf DHCP zu wechseln. Leider fruchtet dies nicht immer und der User ist uneinsichtig. Leider haben machen User auch so hohe Rechte die Netzwerk-Einstellungen selber einzurichten.
Wenn also der erste Schritt nichts bringt und es immer noch arp-Meldungen hagelt, dann könnte der pf mit der Freigabe für das surfen helfen. Wie das?
Der Zugang zum Internet ist für alle Netzwerk-Teilnehmer elementar und grenzt schon fast an ein Menschenrecht. Warum nicht unseren uneinsichtigen User überzeugen, freiwillig auf DHCP wechseln. Mit dnsmasq kann man recht einfach eine Zugriffs-ACL für den pf erstellen, denn es gibt die Möglichkeit bei jedem Event im DHCP ein Skript zu starten. Diese Option kann man in der dnsmasq.conf mit folgender Zeile zu testen aktivieren:
dhcp-script=/<pfad>/<zum>/<Skript>/<Skript-name>
Mit folgenden Test-Skript kann man sich in /var/log ein Test-File schrieben lassen und beobachten, wie es funktioniert_
#!/bin/sh
LOG=“/var/log/clients.log“
DATE=`date +“%Y-%m-%d %H:%M:%S“`echo „$DATE $2 $3 $4 ($1)“ >> $LOG
Folgende Parameter können die Skript mitgegeben werden:
- $1: Aktion (add, old, del)
- $2: MAC-Adresse
- $3: Vergebene IP-Adresse
- $4: Hostname
Da auf der Firewall meistens das gesamte Subnetz für das surfen freigegeben wird haben wir hier Möglichkeiten, dies besser einzuschränken. Warum nicht nur die IP-Adressen eintragen, die auch wirklich online sind. Dafür gibt es ja Tabellen im pf.
Wie kann man nun die Sicherheit erhöhen? Jedes Mal, wenn der DHCP-Server etwas macht, passt er den Zugriff auf den pf an.
Meldet sich eine Maschine (Aktion = add) an, wird die IP in der Tabelle für das surfen eingetragen. Meldet sich die Maschine wieder ab (Aktion = del), wird sie ausgetragen.
Was ist dafür zu tun?
- Die Regeln des pf für das Surfen müssen so umgeschrieben werden, dass Server eigene Regeln haben und immer durch dürfen. Diese haben ja eigentlich eine statische IP.
- Für die Clients gibt es eine Regel mit einer Tabelle <surfen>.
table <surfen> { }
…
pass log inet proto tcp from <surfen> to any port { 80, 443 } - Der dnsmasq bekommt folgende Option und die Lease-Zeit für DHCP sollte verringert werden. Ich habe 2 Stunden definiert. Das heißt, dass nach 2 Stunden die IP-Adressen noch einmal angefragt wird. Existiert ein Eintrag mit der MAC-Adresse, dann wird die IP-Adresse weiter verwendet. Wird der Rechner runter gefahren, dann wird die IP wieder freigegeben.
dhcp-script=/<pfad>/<zum>/<Skript>/<Skript-name> - Nun wird noch das folgende Skript erstellt.
#!/bin/shlogfile=“/var/log/clients-leases.log“
datum=`date +“%Y-%m-%d %H:%M:%S“`
cleanupfile=“/tmp/cleanupfile.txt“echo „$datum $2 $3 $4 ($1)“ >> $logfile
if [ $1 == „add“ ]; then
# IP-Adresse einfügen
echo „pfctl -a web -t surfen -T add $3“ >> $logfile
pfctl -a web -t surfen -T add $3elif [ $1 == „old“ ]; then
# IP-Adresse ist bereits vorhanden und wird weiter genutzt.
echo „IP gefunden: `pfctl -a web -t surfen -T show | grep $3`“ >> $logfileelif [ $1 == „del“ ]; then
# IP-Adresse wieder löschen
echo „pfctl -a web -t surfen -T delete $3“ >> $logfile
pfctl -a web -t surfen -T delete $3elif [ $1 == „update“ ]; then
# <surfen> neu schreiben
echo „update Table surfen“ >> $logfile
more /var/db/dnsmasq.leases | awk ‚ { print $3 }‘ >> $cleanupfile
for ip in `more $cleanupfile`; do
pfctl -a web -t surfen -T add $ip
done
rm $cleanupfile
fiZunächst werden temporäre Dateien wie .log-Datei und update-Datei definiert.
Im ersten Teil wird die IP-Adresse der Tabelle <surfen> hinzu gefügt. Im zweiten Teil wurde festgestellt, dass die IP immer noch gültig ist und deshalb die Lease-Zeit verlängert wird. Im dritten Teil wird die IP-Adresse aus der Tabelle <surfen> wieder entfernt.
Der letzte Teil dient dazu, die Tabelle <surfen> aud den lease-db des dnsmasq neu zu schreiben. Warum könnte dies wichtig sein? Falls Regeln in einen Anker neu geladen werden, dann kann man die Werte der Tabelle mit dem Aufruf
./dhcp-pf.sh update
neu schreiben. 😉
Wenn man nun den dnsmasq und den pf neustartet, ist schluss mit statischer IP und Surfen, weil dies IP-Adressen nicht in die Tabelle <surfen> gelangen.
Viel Spass damit.
Bobby