pfctl - wie man einen Anker hinzufügt und aktiviert / lädt

So kann ich der bereits aktivierten Firewall einen Anker hinzufügen, indem ich so etwas mache:

$ pfctl -a anchor_name -f /etc/anchor_rules.txt

die Datei "anchor_rules.txt" könnte so etwas enthalten:

table <some-hosts> persist file /etc/someHostsToBlock.txt
block quick from any to some-hosts

Jetzt kann ich die Regeln im Anker sehen, indem ich Folgendes mache:

$ pfctl -a anchor_name -sr
No ALTQ support in kernel
ALTQ related functions disabled
block drop quick from any to some-hosts

Wenn ich jedoch den aktuellen aktiven Regelsatz zeige mit:

$ pfctl -sr
No ALTQ support in kernel
ALTQ related functions disabled
scrub-anchor "com.apple/*" all fragment reassemble
anchor "com.apple/*" all

Ich sehe den Anker namens „ anker_name “, den ich gerade hinzugefügt habe, nicht . Der Anker ist also nicht wirklich aktiv / geladen ...

Warum nicht und wie wird es geladen?

Antworten (2)

Nach meinem Verständnis von pf fehlt Ihr Hauptanker. Sie können entweder Apples Anker oder einen benutzerdefinierten Anker verwenden.

Ein benutzerdefinierter Anker wird bevorzugt:

  1. Ändern Sie /private/etc/pf.conf:

    Fügen Sie pf.conf zwei Zeilen wie folgt hinzu:

    ...
    load anchor "com.apple" from "/etc/pf.anchors/com.apple"
    
    #
    # usr.home anchor point
    #
    anchor "usr.home/*"
    load anchor "usr.home" from "/etc/pf.anchors/usr.home"
    
  2. Erstellen Sie eine Datei usr.home . Im folgenden Beispiel erstelle ich einen Anker-SSH, der den SSH-Zugriff von einem lokalen Netzwerk auf einige IPs des Hosts blockiert:

    sudo nano /etc/pf.anchors/usr.home
    

    und hinzufügen

    #
    # usr.home ruleset, referred to by the modified /etc/pf.conf file.
    # See notes in that file regarding the anchor point in the main ruleset.
    #
    
    #
    # SSH anchor point.
    #
    
    anchor "SSH"
    load anchor "SSH" from "/etc/pf.rules/pfssh.rule"
    
  3. Erstellen Sie nun ein neues Verzeichnis

    sudo mkdir /etc/pf.rules
    

    und die referenzierte Datei mit:

    sudo nano /etc/pf.rules/pfssh.rule
    

    und folgenden Inhalt:

    block in quick inet proto { tcp, udp } from 10.0.0.0/8 to { 10.128.8.145, 10.129.8.145 } port 22
    
  4. Analysieren und testen Sie Ihre pf.conf und Ihre Ankerdatei, um sicherzustellen, dass sie fehlerfrei sind:

    sudo pfctl -vnf /etc/pf.conf
    sudo pfctl -vnf /etc/pf.anchors/usr.home
    
  5. pf neu laden:

    sudo pfctl -d
    sudo pfctl -e -f /etc/pf.conf
    

Sie können Ihrem Hauptanker usr.home zusätzliche Anker hinzufügen, wie im Hauptanker com.apple demonstriert.

Sie können auch zusätzliche dynamische Unteranker mit dem folgenden Befehl hinzufügen (hier füge ich eine temporäre Block-HTTP-Regel ähnlich der SSH-Regel hinzu - überprüfen Sie die Erstellung eines vorübergehenden Unterankers: usr.home/HTTP hier!):

echo "block drop in quick proto tcp from 10.0.0.0/8 to any port 80" | sudo pfctl -a usr.home/HTTP -f -

Der temporäre Anker überlebt keinen Neustart!

Ein möglicher Befehl zum sofortigen Entfernen der temporären Regel lautet:

echo "" | sudo pfctl -a usr.home/HTTP -f -

Ein praktisches Skript zum Überprüfen aller geladenen Anker und Regeln ist pfdump:

pfdump.sh:

#!/bin/bash

function pfprint() {
  if [ -n "$1" ];then
    sudo pfctl -a "$2" -s"$1" 2>/dev/null
  else
    sudo pfctl -s"$1" 2>/dev/null
  fi
}

function print_all() {

  local p=$(printf "%-40s" $1)
  (
    pfprint r "$1" | sed "s,^,r     ,"
    pfprint n "$1" | sed "s,^,n     ,"
    pfprint A "$1" | sed "s,^,A     ,"
  ) | sed "s,^,$p,"

  for a in `pfprint A "$1"`; do
    print_all "$a"
  done
}

print_all

Alle genannten Dateien benötigen am Ende eine leere neue Zeile!

etwas, auf das Sie achten sollten ... es scheint, dass pfdump.sh die Ausgabe / Anker NICHT in der ORDER auflistet, die sie auswerten werden. Man könnte also sagen, dass es Dinge in der falschen Reihenfolge ausgibt - was sich auf das Ergebnis auswirkt.
Wenn Sie /private/etc/pf.confdirekt modifizieren, bleiben diese Änderungen über Betriebssystem-Upgrades hinweg bestehen?
@Tom Ich bin mir nicht 100% sicher, aber ich glaube, dass zusammenführungsfähige Änderungen an /etc/pf.confbeibehalten werden. Ich kann jedoch mit Sicherheit sagen , dass Änderungen an nicht erhalten bleiben /etc/pf.anchors/com.apple. Hüten Sie sich vor Anleitungen oder Skripten, die eine Änderung dieser Datei beinhalten.
@macserv sollen Sie nicht einen Anker auf Benutzerebene und eine launchd-Plist erstellen, die pfctl anweist, diesen Anker zu aktivieren? Dies scheint wartungsfreundlicher zu sein, als Dateien auf Systemebene zu bearbeiten (obwohl ich es persönlich nie mit Ankern zum Laufen gebracht habe.)

Ich habe eine Weile gebraucht, um herauszufinden, wie es zu funktionieren scheint, ohne Systemdateien zu ändern. Eine offizielle Dokumentation zur richtigen Verwendung von pf unter macOS wäre großartig, aber ich konnte keine finden.

Um alle Anker anzuzeigen, müssen Sie zunächst sudo pfctl -vsA.

Ihre "anchor_rules.txt" scheint falsch zu sein. Ich habe meine unter "/etc/pf.anchors/block" abgelegt. Zumindest unter macOS 12.0.1 habe ich Fehler mit bekommen sudo pfctl -vnf /etc/pf.anchors/block. Die Arbeitsregeln sehen wie folgt aus. Aber ich bin mir nicht sicher, ob es das tut, was du denkst.

table <some-hosts> persist file "/etc/someHostsToBlock.txt"
block quick from any to <some-hosts>

Um den Anker zu laden und pf zu aktivieren, müssen Sie verwenden sudo pfctl -a 'com.apple/block' -f /etc/pf.anchors/block -e.

Um pf zu starten und Ihren benutzerdefinierten Anker beim Systemstart zu laden, müssen Sie launchd verwenden.

/Library/LaunchDaemons/block.pfctl.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>Label</key>
    <string>block.pfctl</string>
    <key>WorkingDirectory</key>
    <string>/var/run</string>
    <key>Program</key>
    <string>/sbin/pfctl</string>
    <key>ProgramArguments</key>
    <array>
        <string>pfctl</string>
        <string>-a</string>
        <string>com.apple/block</string>
        <string>-f</string>
        <string>/etc/pf.anchors/block</string>
        <string>-e</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

sudo launchctl load /Library/LaunchDaemons/block.pfctl.plist