pfctl: cómo agregar un ancla y activarlo / cargarlo

6

Entonces puedo agregar un ancla al firewall ya habilitado haciendo algo como esto:

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

el archivo "anchor_rules.txt" puede contener algo como esto:

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

Ahora, puedo ver las reglas dentro del ancla haciendo esto:

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

Sin embargo , cuando muestro el conjunto de reglas activo actual con:

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

no veo el ancla llamada " nombre_ancla " que acabo de agregar. Entonces el ancla no está realmente activa / cargada ...

¿Por qué no y cómo cargarlo?

Motsel
fuente

Respuestas:

5

Según tengo entendido de pf , falta tu ancla principal. Puede usar los anclajes de Apple o un ancla definida por el usuario.

Se prefiere un ancla definida por el usuario:

  1. Modifique /private/etc/pf.conf:

    Agregue dos líneas a pf.conf así:

    ...
    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. Cree un archivo usr.home . En el siguiente ejemplo, creo un SSH de anclaje que bloquea el acceso SSH desde una red local a algunas IP del host:

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

    y añadir

    #
    # 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. Ahora crea un nuevo directorio

    sudo mkdir /etc/pf.rules
    

    y el archivo referenciado con:

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

    y el siguiente contenido:

    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. Analice y pruebe su pf.conf y su archivo de anclaje para asegurarse de que estén libres de errores:

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

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

Puede agregar anclas adicionales a su ancla principal usr.home como se muestra en el ancla principal com.apple.

También puede agregar sub-anclajes dinámicos adicionales con el siguiente comando (aquí agrego una regla HTTP de bloque temporal similar a la regla SSH - verifique la creación de un sub-anclaje transitorio: usr.home / HTTP aquí):

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

¡El ancla temporal no sobrevive al reinicio!

Un posible comando para eliminar la regla temporal de inmediato es:

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

Un script útil para verificar todas las anclas y reglas cargadas es 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

¡Todos los archivos mencionados requieren una nueva línea vacía al final!

klanomath
fuente
1
algo a tener en cuenta ... parece que pfdump.sh NO enumera la salida / anclas en el PEDIDO que se evaluarán. Por lo tanto, podría decir que muestra las cosas en el orden incorrecto, lo que tiene efecto en el resultado.
Motsel
Si modifica /private/etc/pf.confdirectamente, ¿sobrevivirán estos cambios en las actualizaciones del sistema operativo?
Tom
@Tom No estoy 100% seguro, pero creo que los cambios fusionables /etc/pf.confse conservarán. Sin embargo, puedo afirmar con certeza que los cambios a /etc/pf.anchors/com.apple, no se conservarán. Tenga cuidado con las guías o secuencias de comandos que impliquen modificar ese archivo.
macserv
@macserv ¿no se supone que debes crear un ancla de nivel de usuario y una lista de lanzamiento que le dice a pfctl que habilite ese ancla? esto parece más fácil de mantener que editar archivos a nivel del sistema (aunque personalmente nunca lo hice funcionar con los anclajes ...)
Tom