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

4

Así que puedo agregar un ancla al firewall habilitado haciendo algo como esto:

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

el archivo "anchor_rules.txt" podría 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_de_control " que acabo de agregar. Así que el ancla no está realmente activa / cargada ...

¿Por qué no, y cómo cargarlo?

    
pregunta Daps0l 15.01.2018 - 22:25

1 respuesta

3

En mi entendimiento de pf , falta su ancla principal. Puede utilizar los anclajes de Apple o un ancla definida por el usuario.

Se prefiere un anclaje definido por el usuario:

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

    Agregue dos líneas a pf.conf como esto:

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

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

    y agregar

    #
    # 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 de referencia 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 de usr.home principal como se muestra en el ancla principal de aplicaciones.

También puede agregar sub-anclajes dinámicos adicionales con el siguiente comando (aquí agrego una regla HTTP de bloqueo temporal similar a la regla SSH - verifique la creación de un sub-ancla transitoria: 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 comando posible para eliminar la regla temporal inmediatamente es:

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

Un script práctico para comprobar todos los anclajes y reglas cargados 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!

    
respondido por el klanomath 17.01.2018 - 03:33

Lea otras preguntas en las etiquetas