vbotka.freebsd_pf

freebsd_pf

质量 构建状态 GitHub 标签

Ansible 角色。 配置 FreeBSD 的 PF 防火墙。

欢迎 分享您的反馈并报告问题

欢迎贡献

警告:

由于该操作涉及防火墙,可能会导致无法访问。请务必阅读手册

在远程主机上实验 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=falsepf_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

参考资料

许可证

许可证

作者信息

Vladimir Botka

安装
ansible-galaxy install vbotka.freebsd_pf
许可证
bsd-2-clause
下载
243
拥有者