PF lädt beim booten keine Rules

Daemotron

Well-Known Member
Moin,

in meiner rc.conf ist pf IMO korrekt eingetragen und aktiviert:
Code:
pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"

Beim booten werden nun zwar die beiden Kernel-Module (pflog.ko und pf.ko) geladen, obwohl sie nicht in /boot/loader.conf eingetragen sind (habe auch die Variante mit Eintrag in loader.conf versucht), das Ruleset in /etc/pf.conf wird aber ignoriert.

Das Ruleset selbst ist aber o.k.; mit service pf start|restart|reload kann ich es problemlos laden, nur eben geschieht dies nicht automatisch beim Start des Servers - äußerst ungünstig, da vom Laden der Regeln die Erreichbarkeit diverser Dienste in Jails abhängig ist.

Das Problem besteht sowohl unter FreeBSD 8.3 als auch unter FreeBSD 9.2.
 
Wenn pf initialisiert wird und ein Interface aus welchen Gründen auch immer noch nicht 'voll da' ist, können keine rules für dieses Interface geladen werden.
Die späteren 'restart...' Aktionen finden ein 'voll' initialisiertes Interface und sind dann erfolgreich.
Vorschlag: Schau dir netwait in /etc/defaults/rc.conf an.

hth
 
Danke für Eure Unterstützung. Lösen konnte ich das Problem noch nicht, aber ich sehe jetzt etwas klarer. Eine kurze, einfache Regeldatei wird bei Einsatz von netwait korrekt geladen und übernommen. Werde jetzt alle Regeln noch mal zeilenweise prüfen - eine davon muss ja der Übeltäter sein, den generell scheint es ja zu funktionieren...
 
Das Problem ist gelöst: Stein des Anstoßes war eine Regel, die einen FQHN verwendet:
Code:
table <update> { update.freebsd.org }
Generell funktioniert so etwas zwar, allerdings löst pf bereits beim parsen des Rulesets alle FQHNs in IP-Adressen auf, was offensichtlich während des Bootvorgangs noch nicht möglich ist (oder ggf. auch zu lange dauert). Ob das Verhalten von pf sich ändert, wenn es sich nicht wie hier um eine Round-Robin Auflösung handelt, habe ich allerdings nicht mehr getestet.
 
Hostnames in rulesets sollte man wenn möglich vermeiden. Wenn man weniger statische Hosts unbedingt im ruleset haben muss, dann sollte man z.B. ein Unterverzeichnis anlegen und dort alle Hosts als Datei anlegen.

In der pf.conf hat man dann z.B.
Code:
table <update.freebsd.org> file /etc/pf/hosts/update.freebsd.org
stehen. Per Cronjob dann:
Code:
cd /etc/pf/hosts
for hostname in *; do
   pfctl -T replace -t ${hostname} ${hostname}
   pfctl -T show -t ${hostname} >${hostname}
done
 
Zurück
Oben