openBSD: Paketfilter einrichten mit pf - wie sichere ich meinen Server

Chromatin

Moderator
Mitarbeiter
Du kannst einzelnen Rules ein Log Parameter mitgeben.
OpenBSD PF: Logging

Desweiteren kannst du noch dem pf Logging Daemon (pflogd) Parameter mitgeben.
pflogd( 8 ) - OpenBSD manual pages
Die Hostangabe beim pflogd könnte sein was du suchst.


*edit*

Ich habe noch deinen anderen Beitrag gesehen. Ganz stumpf könntest du auch dein logrotate selbst basteln, indem du das binary Log durch tcpdump schickst - mit entsprechendem Filter - und dann das original Log leerst :)
 
Danke für die Information.

Mit der von mir geposteten Regeln wurde ja alles geblockt.
Danach habe ich pf.conf geändert und es wurde plötzlich nichts mehr mitgeloggt.
Das habe ich vergessen zu posten.

Die Regeln (Auszug) sahen so aus:
Code:
block in log on egress from any to egress
block all
Hatte oben eine falsche Reihenfolge der Regeln. "block all" war nicht die erste Regel.
Habe jetzt die Reihenfolge geändert und das gewünschte Verhalten erreicht.
 
OpenBSD pf.conf script ausfuehren

Hallo,

Holle den Thread wieder einmal wegen einer speziellen Frage aus der Versenkung.

Derzeit schaut ein Teil meiner Regeln so aus:
Code:
[...]
table <tbl_bruteforce> persist
[...]
block quick log from <tbl_bruteforce>
[...]
pass in on $if_ext inet proto tcp from any to $if_ext port $port_ssh keep state \ 
      (max-src-conn-rate 100/10, overload <tbl_bruteforce> flush global)
[...]
Jetzt zur Frage:

Kann man die Regeln in der Konfigurationsdatei von PF so umschreiben, dass z.B. ein Script ausgeführt wird? Habe unter pf.conf(5) - OpenBSD manual pages derzeit noch nichts derartiges gefunden.
Würde gerne informiert werden (z.B.: Mail mit der IP-Adresse und Datum/Uhrzeit an root), wenn eine IP-Adresse in der Tabelle landet.

Vorweg vielen Dank!
 

Chromatin

Moderator
Mitarbeiter
Nein, das geht so nicht.

Du könntest aber alternativ, in einem Zyklus die Table via pfctl testen und "diffen" und so feststellen ob etwas hinzugekommen ist.
 
Vielen Dank für die Antwort!

[...] Du könntest aber alternativ, in einem Zyklus die Table via pfctl testen und "diffen" und so feststellen ob etwas hinzugekommen ist.
Das wollte ich eben vermeiden, da ich mit der Ausführunggeschwindigkeit nicht ganz zufrieden bin. Habe per CRON ein anderes Script
am laufen, das was Ähnliches macht.

Aber da es nicht ohne größeren Aufwand (z.B.: Quellcode von PF umschreiben) geht, dann bleibt mir für mein Vorhaben sowieso nichts
anderes übrig.
 

Chromatin

Moderator
Mitarbeiter
Das wollte ich eben vermeiden, da ich mit der Ausführunggeschwindigkeit nicht ganz zufrieden bin. Habe per CRON ein anderes Script
am laufen, das was Ähnliches macht.
Wo ist denn dein konkretes Problem? pf reagiert on-demand also technisch wird deine Liste ja in Echtzeit gepflegt.
Kannst du mal einen Beispieloutput deiner Table liefern?


Aber da es nicht ohne größeren Aufwand (z.B.: Quellcode von PF umschreiben) geht, dann bleibt mir für mein Vorhaben sowieso nichts
anderes übrig.
Auf Maschinen, die richtig Druck haben, willst du ohnehin keinen Packetfilter der SO etwas macht ;)
 
Wo ist denn dein konkretes Problem? pf reagiert on-demand also technisch wird deine Liste ja in Echtzeit gepflegt.
Kannst du mal einen Beispieloutput deiner Table liefern?
PF mag intern schnell reagieren. Nur sind die Aufrufe mit pfctl recht langsam.

Für mein beschriebenes Vorhaben, wird die Geschwindigkeit schon reichen,
da in der Tabelle derzeit nur wenige IP-Adressen (~5 Adressen pro Tag) landen.

Hier ein ähnliches CRON-Script von meinem V-Server:
Code:
$ cat /etc/pfblocklist                                                                                
#!/bin/sh

URL="https://lists.blocklist.de/lists/"
FILE="all.txt"
TABLE="tbl_blocklist"

cd /tmp
ftp "$URL$FILE" > /dev/null 2>&1

if [ -e $FILE ]
then

    while IFS= read -r line
    do
        RESULT=`/sbin/pfctl -t "$TABLE" -T test "$line" 2>&1`
        NUMBER=`echo "$RESULT" | sed -r 's/(^[0-9]+)\/[0-9]+ addresses match\.$/\1/g'`
        
        if [ $NUMBER -eq 0 ]
        then
            /sbin/pfctl -t "$TABLE" -T add "$line" > /dev/null 2>&1
        fi
    done <"$FILE"

    rm $FILE
else
    echo "ERROR: Could not get file $FILE from $URL"
fi

unset URL FILE TABLE RESULT NUMBER
Ein einfaches - vielleicht nicht gerade sauberes - Script. Aber die Ausführungsgeschwindigkeit für nur ca. ~40000 Adressen dauert IMHO schon sehr lange:
Code:
$ time sh /etc/pfblocklist                                                                            
    1m53.59s real     0m19.92s user     1m18.88s system
Auf Maschinen, die richtig Druck haben, willst du ohnehin keinen Packetfilter der SO etwas macht ;)
Das wird sein. Nur fehlt mir hier die Erfahrung. Man muss ja auch mal klein anfangen.
Ist noch kein Meister vom Himmel gefallen. :)
 
Zuletzt bearbeitet:

Chromatin

Moderator
Mitarbeiter
In deinem Skript machst du einen pfctl Call je Eintrag in der Blocklist.
Besser wäre es, du holst dir den kompletten Inhalt mit "-T Show" und parst das durch. So haste nur einen Call zu machen :)
Weiterhin könntest du Einträge in eine Datei machen und diese Datei dann als Grundlage für die Table ( (persist)) file) benutzen und am Ende aktualisieren.
So musst du nicht die Table Häppchenweise füttern.

So oder so - du kannst auch einfach die Blocklist in die Table laden und deine eigene Liste separat füttern. Wenn du die Blocklist vorher abturnst, laufen auch keine doppelten auf, sodass dein Test gar nicht nötig wird :)
 
Okay, werde die Verbesserungvorschläge bei Gelegenheit umsätzen. Sind die besseren Ansätze. :)
Habe das Script ohne viel Überlegen schnell erstellt und nicht mehr überarbeitet. :rolleyes:

Nochmals Vielen Dank!
 
Oben