pfctl para agregar reglas en tiempo de ejecución SIN editar /etc/pf.conf?

Tengo una aplicación que (mientras se ejecuta y solo mientras se ejecuta) necesita realizar cambios en el filtro de paquetes ( pf) para que bloquee o permita cierto tráfico. Estas reglas deben ser adicionales a las propias reglas del usuario /etc/pf.conf, pero no quiero editarlas directamente /etc/pf.confya que esto es extremadamente intrusivo.

Puedo hacer esto de manera trivial en Linux usando iptablese incluso en Windows usando wfpsin alterar ningún archivo en el disco, ¿puedo lograr lo mismo en osx con pf?

La solución solo tiene que funcionar en yosemite(10.10) y superior

Hola, me pregunto si ya has encontrado una manera de lograr este objetivo... Estoy luchando con el mismo escenario. si lo hiciste, por favor comparte :-) gracias
@ Zohar81 Seguro que lo descubrí, haz esto: cat /etc/pf.conf my_rules.conf | sudo /sbin/pfctl -Ef -El -argumento pfctlhace que se lea desde la entrada estándar, por lo que simplemente concatenamos pf.conf con nuestras propias reglas para que se lea desde ambos, pero para asegurarnos de que nuestras reglas tengan prioridad (es por eso que nuestro las reglas se concatenan al final)
@ Zohar81 también vea mi respuesta a continuación
¿Quizás también esté familiarizado con una opción para recibir una notificación si algún otro proceso raíz llama pfctlcon una configuración diferente que anula la suya? Puedo hacer comprobaciones periódicas con las reglas aplicadas actualmente, pero desearía poder recibir una notificación cuando cambie... ¿alguna idea de cómo?

Respuestas (2)

Resolví esto yo mismo.

cat /etc/pf.conf my_rules.conf | sudo /sbin/pfctl -Ef -

Cuando my_rules.confcontiene nuestras propias reglas, estas se concatenan con las pf.confreglas pero tienen prioridad debido a que se agregan después pf.confdel catcomando.

También tenga en cuenta que usamos pfctl -Ef -las -fuerzas pfctlpara leer desde stdin

Podemos llevar esta solución un paso más allá y cargar nuestras propias reglas desde stdin usando esto:

echo "block out all" | cat /etc/pf.conf - | sudo /sbin/pfctl -Ef -
¿Qué hace -E? El man pfctldocumento no es muy claro: dice que habilita el filtrado como -epero también dice: "(...) e incrementa el recuento de referencia de habilitación de pf". y no entendí qué es esto exactamente.

Depende del tipo de aplicación y lenguaje de programación. La verdadera forma programática sería abrir /dev/pfy usar ioctl. No lo he hecho yo mismo, pero los siguientes enlaces deberían ser útiles.

Si llamar pfctldesde la aplicación es suficiente, todavía usaría anclas.

Sin un archivo:echo "block out all" | sudo /sbin/pfctl -a 'com.apple/app_name' -f -

Con un archivo:sudo /sbin/pfctl -a 'com.apple/app_name' -f /path/to/file