vbotka.freebsd_pf
freebsd_pf
Rol de Ansible. FreeBSD. Configura el firewall PF.
No dudes en compartir tus comentarios e informar problemas.
Las contribuciones son bienvenidas.
Advertencia:
Como manipula el firewall, hay riesgo de aislamiento. Es necesario leer el manual
- https://www.freebsd.org/doc/en/books/handbook/firewalls-pf.html
- https://www.openbsd.org/faq/pf/filter.html
Cuando experimentes con pf en un host remoto, abre una sesión y, como root, ejecuta el siguiente comando antes de habilitar pf
shell> sleep 120; pfctl -d
Esto desactivará pf después de 2 minutos y te permitirá abrir una nueva sesión a este host remoto en caso de que algo salga mal.
Requisitos y dependencias
Colecciones
- community.general
Dependencias opcionales
Variables del rol
Por defecto, el firewall está desactivado
pf_enable: False
Por defecto, sshguard, blacklistd, fail2ban, y relayd están desactivados
pf_blacklistd_enable: False
pf_fail2ban_enable: False
pf_relayd_enable: False
pf_sshguard_enable: False
Por defecto, los paquetes bloqueados no se registran
pf_log_all_blocked: False
Revisa los valores predeterminados y ejemplos en vars.
Flujo de trabajo
- Cambia la shell a /bin/sh si es necesario
shell> ansible srv.example.com -e 'ansible_shell_type=csh ansible_shell_executable=/bin/csh' -a 'sudo pw usermod freebsd -s /bin/sh'
- Instala el rol y colecciones
shell> ansible-galaxy role install vbotka.freebsd_pf
Instala la colección si es necesario
shell> ansible-galaxy collection install community.general
- Crea el firewall
Hay un par de plantillas *-pf.conf.j2 disponibles. Elige una plantilla que se ajuste a tu propósito (enrutador, servidor, balanceador, ...) y revisa los ejemplos de las variables .yml.sample en vars. La plantilla default-pf.conf.j2 y las variables pfconf_example_default.yml.sample han sido probadas. Otras plantillas y muestras necesitarán más atención y pruebas.
Nota: Puedes crear listas anidadas (tablas, opciones, normalización, enrutamiento, traducción, filtrado, ...) para la plantilla default-pf.conf.j2. Las listas serán aplanadas.
- Crea el playbook
shell> cat freebsd-pf.yml
- hosts: srv.example.com
roles:
- vbotka.freebsd_pf
Revisa los handlers para ver cómo se implementan el inicio/reinicio/recarga de pf.
Instala los paquetes
shell> ansible-playbook -t pf_packages -e pf_install=true freebsd-pf.yml
Luego, desactiva la instalación para acelerar la ejecución del playbook.
- Configura el firewall
Iniciar y reiniciar el firewall interrumpe las conexiones SSH. Consulta los handlers para más detalles. Como consecuencia, tanto los handlers de inicio como los de recarga no funcionarán correctamente y la conexión SSH quedará sin respuesta. Por lo tanto, configuremos primero las reglas
shell> ansible-playbook -e pf_enable=false freebsd-pf.yml
Antes de habilitar el firewall, abre una sesión SSH al host remoto y ejecuta los siguientes comandos
shell> sleep 120; pfctl -d
Si te bloqueas fuera del host remoto, los comandos anteriores desactivarán el firewall en 2 minutos. Puede que quieras ejecutar estos comandos siempre que experimentes con el firewall. Ahora, habilita el firewall
shell> ansible-playbook -e pf_enable=true freebsd-pf.yml
Actualiza el firewall
Abre una conexión SSH al host por si algo sale mal. Actualiza y valida la configuración. No recargues las reglas
shell> ansible-playbook -e pf_conf_only=true -e pf_conf_validate=true freebsd-pf.yml
Recarga las reglas después de que la configuración haya sido actualizada y validada
shell> ansible srv.example.com -m service -a "name=pf state=reloaded"
Solución de problemas
pf.conf
Como primer paso, habilita la copia de seguridad de los archivos de configuración
pf_backup_conf: true
En caso de que la configuración /etc/pf.conf no pase la validación, la ejecución falla
TASK [vbotka.freebsd_pf : pfconf: Configure rules] **********************************************
fatal: [srv.example.com]: FAILED! => changed=false
checksum: 765302b1f0de9f200b2cab396e0271fc04e6adcc
exit_status: 1
msg: failed to validate
stderr: |-
/home/freebsd/.ansible/tmp/ansible-tmp-1554558267.39-44232067735996/source:119: syntax error
El mensaje anterior muestra la ubicación del error de sintaxis (source:119) en el archivo temporal creado por el módulo de plantilla. Es difícil encontrar el error si este archivo temporal no está disponible para revisión.
Habilita pf_conf_only=true y desactiva la validación pf_conf_validate=false para encontrar el problema
shell> ansible-playbook -e pf_conf_only=true -e pf_conf_validate=false freebsd-pf.yml
Ubica el error de sintaxis en el archivo de configuración /etc/pf.conf
shell> pfctl -n -f /etc/pf.conf
Actualiza, valida y recarga las reglas después de corregir la configuración
shell> ansible srv.example.com -m service -a "name=pf state=reloaded"
relayd.conf
De la misma manera, es posible solucionar problemas en /usr/local/etc/relayd.conf
shell> ansible-playbook -t pf_relayd -e pf_debug=true -e pf_relayd_conf_validate=false -e pf_relayd_conf_only=true freebsd-pf.yml
Ubica el error de sintaxis en el archivo de configuración /usr/local/etc/relayd.conf
shell> relayd -n -f /usr/local/etc/relayd.conf
Actualiza, valida y recarga las reglas después de corregir la configuración
shell> ansible srv.example.com -m service -a "name=relayd state=reloaded"
Seguridad
Para evitar que una configuración no validada sea recargada por el handler, el archivo de configuración /etc/pf.conf no será creado y la ejecución se terminará si ambos pf_conf_only=false y pf_conf_validate=false
shell> ansible-playbook -e pf_conf_only=false -e pf_conf_validate=false freebsd-pf.yml
fatal: [srv.example.com]: FAILED! => changed=false
msg: Validation can be turned off if pf_conf_only=True. End of play.
El rol falla de la misma manera en caso de -e pf_relayd_conf_only=false -e pf_relayd_conf_validate=false
.
Ansible lint
Usa el archivo de configuración .ansible-lint.local al ejecutar ansible-lint. Algunas reglas pueden estar desactivadas y algunas advertencias pueden ser ignoradas. Consulta las notas en el archivo de configuración.
shell> ansible-lint -c .ansible-lint.local
Referencias
- Libro de PF
- Firewall con el filtro de paquetes PF de OpenBSD
- Una guía para principiantes sobre firewalling con pf
- PF probando tu firewall - Diario de OpenBSD
- Configuración rápida de jail en ZFS usando ezjail con PF NAT
- FreeBSD y blacklistd
- Blacklistd en FreeBSD
- PF y sshguard
- Haciendo cumplir las prohibiciones de Fail2ban con PF
- Fail2Ban con PF
- Fail2Ban pf.conf: corregir la sintaxis de multiport
Licencia
Información del autor
FreeBSD. Configure PF firewall.
ansible-galaxy install vbotka.freebsd_pf