vbotka.freebsd_pf
freebsd_pf
Ansible 角色。 配置 FreeBSD 的 PF 防火墙。
欢迎 分享您的反馈并报告问题。
欢迎贡献。
警告:
由于该操作涉及防火墙,可能会导致无法访问。请务必阅读手册
- https://www.freebsd.org/doc/en/books/handbook/firewalls-pf.html
- https://www.openbsd.org/faq/pf/filter.html
在远程主机上实验 PF 时,请打开会话,并以 root 身份在启用 PF 之前运行以下命令
shell> sleep 120; pfctl -d
这将在 2 分钟后禁用 PF,如果出现问题,您可以打开新的远程主机会话。
需求和依赖
收藏
- community.general
可选依赖
角色变量
默认情况下防火墙是禁用的
pf_enable: False
默认情况下 sshguard, blacklistd, fail2ban,和 relayd 都是禁用的
pf_blacklistd_enable: False
pf_fail2ban_enable: False
pf_relayd_enable: False
pf_sshguard_enable: False
默认情况下,不记录被阻止的数据包
pf_log_all_blocked: False
在变量中查看默认值和示例。
工作流程
1)如有必要,将 shell 更改为 /bin/sh
shell> ansible srv.example.com -e 'ansible_shell_type=csh ansible_shell_executable=/bin/csh' -a 'sudo pw usermod freebsd -s /bin/sh'
2)安装角色和集合
shell> ansible-galaxy role install vbotka.freebsd_pf
如有必要,安装集合
shell> ansible-galaxy collection install community.general
3)创建防火墙
有几个模板 *-pf.conf.j2 可用。选择一个适合您目的的模板(路由器、服务器、负载均衡器等),并查看 vars 中的 .yml.sample 变量示例。模板 default-pf.conf.j2 和变量 pfconf_example_default.yml.sample 已经过测试。其他模板和示例需要更多关注和测试。
注意:您可以为模板 default-pf.conf.j2 创建嵌套列表(表、选项、归一化、排队、翻译、过滤等)。列表将被扁平化。
4)创建 playbook
shell> cat freebsd-pf.yml
- hosts: srv.example.com
roles:
- vbotka.freebsd_pf
5)查看处理程序以了解如何启动/重启/重新加载 PF。
6)安装软件包
shell> ansible-playbook -t pf_packages -e pf_install=true freebsd-pf.yml
然后,禁用安装以加快 playbook 的执行。
7)配置防火墙
启动和重启防火墙会断开 ssh 连接。有关详细信息,请查看处理程序。因此,启动和重新加载的两个处理程序都无法正常工作,ssh 连接将超时。因此,让我们首先配置规则
shell> ansible-playbook -e pf_enable=false freebsd-pf.yml
在启用防火墙之前,打开到远程主机的 ssh 会话并运行以下命令
shell> sleep 120; pfctl -d
如果您锁定自己访问远程主机,上述命令将在 2 分钟内禁用防火墙。每当您尝试使用防火墙时,可以始终运行这些命令。现在,启用防火墙
shell> ansible-playbook -e pf_enable=true freebsd-pf.yml
更新防火墙
打开 ssh 连接以防万一出现问题。更新并验证配置。不要重新加载规则
shell> ansible-playbook -e pf_conf_only=true -e pf_conf_validate=true freebsd-pf.yml
在配置更新和验证后重新加载规则
shell> ansible srv.example.com -m service -a "name=pf state=reloaded"
故障排除
pf.conf
第一步启用配置文件备份
pf_backup_conf: true
如果配置 /etc/pf.conf 未通过验证,则任务失败
TASK [vbotka.freebsd_pf : pfconf: 配置规则] **********************************************
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: 语法错误
上述消息显示语法错误的位置(source:119)在模板模块创建的临时文件中。如果该临时文件不可用,则很难找到错误。
启用 pf_conf_only=true 并禁用验证 pf_conf_validate=false 来查找问题
shell> ansible-playbook -e pf_conf_only=true -e pf_conf_validate=false freebsd-pf.yml
在配置文件 /etc/pf.conf 中找到语法错误
shell> pfctl -n -f /etc/pf.conf
配置修复后,更新、验证并重新加载规则
shell> ansible srv.example.com -m service -a "name=pf state=reloaded"
relayd.conf
同样可以故障排除 /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
在配置文件 /usr/local/etc/relayd.conf 中定位语法错误
shell> relayd -n -f /usr/local/etc/relayd.conf
在配置修复后,更新、验证并重新加载规则
shell> ansible srv.example.com -m service -a "name=relayd state=reloaded"
安全
为防止未验证的配置被处理程序重新加载,配置文件 /etc/pf.conf 将不会被创建,如果两个选项均为 pf_conf_only=false 和 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: 在 pf_conf_only=True 的情况下可以禁用验证。任务结束。
在 -e pf_relayd_conf_only=false -e pf_relayd_conf_validate=false
的情况下,角色会以相同方式失败。
Ansible lint
使用配置文件 .ansible-lint.local 运行 ansible-lint。某些规则可能被禁用,并且某些警告可能被忽略。请查看配置文件中的说明。
shell> ansible-lint -c .ansible-lint.local
参考资料
- PF 手册
- 使用 OpenBSD 的 PF 数据包过滤器进行防火墙
- 使用 pf 进行防火墙的初学者指南
- PF 测试您的防火墙 - OpenBSD 日志
- 使用 PF NAT 快速设置 ZFS 上的监狱
- FreeBSD 和 blacklistd
- 在 FreeBSD 上使用 blacklistd
- PF 和 sshguard
- 使用 PF 强制 Fail2ban 禁令
- 与 PF 一起使用 Fail2Ban
- Fail2Ban pf.conf: 修复多端口语法