En corto

1
2
3
4
5
6
7
8
9
pfctl -sT                                    # tablas cargadas
pfctl -t <tabla> -T show                     # contenido
pfctl -t <tabla> -T add 192.168.1.10         # añadir IP o red (también 10.20.0.0/16)
pfctl -t <tabla> -T delete 192.168.1.10
pfctl -t <tabla> -T test 192.168.1.10        # ¿está dentro? (match / no match)
pfctl -t <tabla> -T flush                    # vaciar la tabla
pfctl -t <tabla> -T replace -f /ruta/lista   # reemplazar todo el contenido desde un archivo

pfctl -t sshguard -T flush                   # pfSense: quitar el bloqueo por intentos de login fallidos

Qué es una tabla

Una tabla de PF es un conjunto de direcciones y redes al que las reglas hacen referencia como <nombre>. Se cambia en caliente, sin recargar el ruleset, y aguanta miles de entradas con búsqueda rápida; por eso PF la usa para listas de bloqueo, bogons y cualquier cosa que cambie más a menudo que las reglas.

En pf.conf:

1
2
table <blocklist> persist file "/etc/pf/blocklist.txt"
block in quick from <blocklist>

persist mantiene la tabla aunque ninguna regla la use en ese momento; file la carga desde un archivo (una IP o red por línea).

Comandos

Todos con la forma pfctl -t <tabla> -T <comando>:

ComandoQué hace
showLista las entradas. Con -v, contadores por entrada (paquetes/bytes in/out)
add <ip|red> …Añade una o varias entradas
delete <ip|red> …Quita entradas
test <ip> …Dice si la dirección cae dentro de la tabla (sin tocarla)
flushVacía la tabla; la tabla sigue existiendo
killBorra la tabla entera (si no la usa ninguna regla)
replace -f <archivo>Sustituye el contenido completo por el del archivo, en una sola operación
expire <segundos>Borra las entradas cuyos contadores llevan más de N segundos sin actividad
zeroPone a cero los contadores de la tabla (o de una entrada, si la indicas)

Y sin -t:

1
2
3
4
pfctl -sT                    # nombres de todas las tablas
pfctl -vvsT                  # info global por tabla: entradas, evaluaciones, referencias
pfctl -T load -f /etc/pf.conf   # recarga solo las definiciones de tabla del pf.conf
pfctl -sr | grep '<nombre>'  # qué reglas usan una tabla

Tablas en pfSense

  • Los aliases son tablas. Un alias de tipo Host, Network o URL Table llamado Admins existe en PF como <Admins>; pfctl -t Admins -T show te enseña lo que resolvió pfSense, incluidos los FQDN que ya convirtió a IPs.
  • sshguard: donde caen las IPs bloqueadas por intentos de login fallidos a SSH o a la webGUI. Si te bloqueaste a ti mismo, pfctl -t sshguard -T flush (documentado por Netgate en Locked out of the WebGUI).
  • virusprot: hosts bloqueados por superar los límites Max. src. conn. rate o Max. states de una regla. pfctl -t virusprot -T show y -T delete <ip> para soltar a uno.
  • snort2c: bloqueos de Snort/Suricata en modo legacy. -T flush para desbloquear todo.
  • bogons / bogonsv6: las listas que se actualizan solas cuando activas Block bogon networks en una interfaz.
  • pfBlockerNG: cada lista es un alias pfB_*. Para saber si una IP está bloqueada por alguna: pfctl -t pfB_Top_v4 -T test 203.0.113.7.

En OPNsense la mecánica es la misma (pfctl -sT para ver los nombres); la tabla de bloqueo por login se llama sshlockout.

Lo que se pierde al recargar

Cualquier -T add, -T delete o -T flush vive hasta la siguiente recarga del filtro: guardar casi cualquier cosa en la GUI, Filter Reload en Status → Filter Reload, o el cron de actualización de aliases. En ese momento pfSense regenera cada tabla desde su alias y tus cambios a mano desaparecen. Para que algo sea permanente, edita el alias; para pruebas rápidas y desbloqueos, pfctl es perfecto.

Más allá de las tablas

Lo que más se usa junto a lo anterior:

1
2
3
4
5
6
7
pfctl -sr                    # reglas cargadas (con -vv, contadores y números de regla)
pfctl -ss                    # tabla de estados
pfctl -si                    # estadísticas globales
pfctl -k 192.168.1.10        # matar los estados de un host
pfctl -F states              # matar todos los estados (corta todas las conexiones)
pfctl -d / pfctl -e          # desactivar / activar PF (sin PF no hay NAT: úsalo solo para salir de un bloqueo)
pfctl -nf /etc/pf.conf       # comprobar sintaxis sin cargar

Referencia completa: pfctl cheat sheet del OpenBSD Handbook y man pfctl en FreeBSD.