Dans ma compréhension de pf votre ancre principale est manquante. Vous pouvez soit utiliser l'ancre ou les ancres d'Apple, soit une ancre définie par l'utilisateur.
Une ancre définie par l'utilisateur est préférable :
-
Modifier /private/etc/pf.conf :
Ajoutez deux lignes à pf.conf comme ceci :
...
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"
-
Créer un fichier usr.home . Dans l'exemple ci-dessous je crée une ancre SSH bloquant l'accès SSH depuis un réseau local à certaines IP de l'hôte :
sudo nano /etc/pf.anchors/usr.home
et ajouter
#
# 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"
-
Créez maintenant un nouveau répertoire
sudo mkdir /etc/pf.rules
et le fichier référencé avec :
sudo nano /etc/pf.rules/pfssh.rule
et le contenu suivant :
block in quick inet proto { tcp, udp } from 10.0.0.0/8 to { 10.128.8.145, 10.129.8.145 } port 22
-
Analysez et testez votre pf.conf et votre fichier d'ancrage pour vous assurer qu'ils sont exempts d'erreurs :
sudo pfctl -vnf /etc/pf.conf
sudo pfctl -vnf /etc/pf.anchors/usr.home
-
Rechargez le pf :
sudo pfctl -d
sudo pfctl -e -f /etc/pf.conf
Vous pouvez ajouter des ancres supplémentaires à votre ancre principale usr.home, comme le montre l'ancre principale com.apple.
Vous pouvez également ajouter des sous-ancres dynamiques supplémentaires avec la commande suivante (ici j'ajoute une règle HTTP de blocage temporaire similaire à la règle SSH - vérifier la création d'un sous-ancre transitoire : usr.home/HTTP ici !) :
echo "block drop in quick proto tcp from 10.0.0.0/8 to any port 80" | sudo pfctl -a usr.home/HTTP -f -
L'ancre temporaire ne survit pas à un redémarrage !
Une commande possible pour supprimer la règle temporaire immédiatement est :
echo "" | sudo pfctl -a usr.home/HTTP -f -
Un script pratique pour vérifier toutes les ancres et règles chargées est 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
Tous les fichiers mentionnés nécessitent une nouvelle ligne vide à la fin !