pfctl, um Regeln zur Laufzeit hinzuzufügen, OHNE /etc/pf.conf zu bearbeiten?

Ich habe eine App, die (während sie läuft und nur während sie läuft) Änderungen am Paketfilter ( pf) vornehmen muss, damit sie bestimmten Datenverkehr blockiert oder zulässt. Diese Regeln sollten zusätzlich zu den eigenen Regeln des Benutzers enthalten sein /etc/pf.conf- aber ich möchte nicht direkt bearbeiten, /etc/pf.confda dies extrem aufdringlich ist.

Ich kann dies trivial unter Linux iptablesund sogar unter Windows tun wfp, ohne Dateien auf der Festplatte zu ändern. Kann ich dasselbe in OSX mit erreichen pf?

Die Lösung muss nur in yosemite(10.10) und höher funktionieren

Hallo, ich frage mich, ob Sie inzwischen einen Weg gefunden haben, dieses Ziel zu erreichen ... Ich kämpfe mit dem gleichen Szenario. wenn ja, bitte teilen :-) danke
@Zohar81sicher, ich habe es herausgefunden, mach das: cat /etc/pf.conf my_rules.conf | sudo /sbin/pfctl -Ef -Das -Argument to pfctlbewirkt, dass es von stdin liest, also verketten wir einfach pf.conf mit unseren eigenen Regeln, damit es von beiden gelesen wird, aber um sicherzustellen, dass unsere Regeln Vorrang haben (deshalb unsere Regeln werden zuletzt verkettet)
@ Zohar81 siehe auch meine Antwort unten
Vielleicht kennen Sie auch eine Option, um eine Benachrichtigung zu erhalten, wenn ein anderer Root-Prozess pfctlmit unterschiedlicher Konfiguration aufruft, die Ihre außer Kraft setzt? Ich kann die derzeit geltenden Regeln regelmäßig überprüfen, aber ich wünschte, ich könnte sofort eine Benachrichtigung erhalten, wenn sie sich ändert ... eine Idee, wie?

Antworten (2)

Ich habe das selbst gelöst.

cat /etc/pf.conf my_rules.conf | sudo /sbin/pfctl -Ef -

Wo my_rules.confunsere eigenen Regeln enthalten sind, werden diese mit den Regeln verkettet pf.conf, haben jedoch Vorrang, da sie pf.confim catBefehl angehängt werden.

pfctl -Ef -Beachten Sie auch, dass wir die -Kräfte pfctlzum Lesen von stdin verwenden

Wir können diese Lösung noch einen Schritt weiterführen und unsere eigenen Regeln von stdin laden, indem wir Folgendes verwenden:

echo "block out all" | cat /etc/pf.conf - | sudo /sbin/pfctl -Ef -
Was bedeutet das -E? Das man pfctlDokument ist nicht sehr klar: Es sagt, dass es die Filterung wie aktiviert, -eaber es sagt auch: "(...) und inkrementiere den pf enable reference count." und ich habe nicht bekommen, was das genau ist.

Dies hängt von der Art der Anwendung und der Programmiersprache ab. Der wahre programmgesteuerte Weg wäre das Öffnen /dev/pfund Verwenden von ioctl. Ich habe das nicht selbst gemacht, aber die folgenden Links sollten hilfreich sein.

Wenn der Aufruf pfctlaus der App ausreicht, würde ich immer noch Anker verwenden.

Ohne Datei:echo "block out all" | sudo /sbin/pfctl -a 'com.apple/app_name' -f -

Mit einer Datei:sudo /sbin/pfctl -a 'com.apple/app_name' -f /path/to/file