voxpupuli/puppet-nftables

GitHub: voxpupuli/puppet-nftables

Puppet基础设施即代码模块,用于声明式管理和自动化部署Linux nftables防火墙规则。

Stars: 13 | Forks: 35

# nftables puppet 模块 [![Puppet Forge](https://img.shields.io/puppetforge/v/puppet/nftables.svg)](https://forge.puppetlabs.com/puppet/nftables) [![Puppet Forge - downloads](https://img.shields.io/puppetforge/dt/puppet/nftables.svg)](https://forge.puppetlabs.com/puppet/nftables) [![puppetmodule.info docs](http://www.puppetmodule.info/images/badge.png)](http://www.puppetmodule.info/m/puppet-nftables) [![Apache-2.0 License](https://img.shields.io/github/license/voxpupuli/puppet-nftables.svg)](LICENSE) 本模块管理一套既定风格的 nftables 配置。 默认情况下,它建立的防火墙会丢弃所有连接,除了 出站的 ICMP、DNS、NTP、HTTP 和 HTTPS,以及入站的 ICMP 和 SSH 流量: ``` include nftables ``` 这可以通过参数进行覆盖,例如,以下配置允许所有 出站流量: ``` class { 'nftables': out_all => true, } ``` 还有针对特定服务的预构建规则,例如这 将允许 Web 服务器通过 HTTPS 提供流量服务: ``` include nftables include nftables::rules::https ``` 请注意,该模块与 `firewalld` 系统冲突,并且会在 Puppet 运行期间停止它。 ## 配置 nftables 服务加载的主配置文件 将是 `files/config/puppet.nft`,该模块创建的所有其他文件 都放在 `files/config/puppet` 中,并且如果不再 被管理,也会被清除。 主配置文件包含 filter 和 NAT 表的专用文件, 并在此前处理任何 `custom-*.nft` 文件。 filter 和 NAT 表都配置了所有主链 (filter 的 `INPUT`、`OUTPUT`、`FORWARD` 以及 NAT 的 `PREROUTING` 和 `POSTROUTING`),您可以将自己的链挂载 到这些主链上,链中可以包含具体的 规则。 所有 filter 主链默认为丢弃。 默认情况下,我们配置了一组 `default_MASTERCHAIN` 链, 您可以轻松地向其中添加自定义规则。 针对特定需求,您可以添加自己的链。 有一个全局链,它定义了所有主链的默认行为。 该链默认为空。 默认情况下,允许 `INPUT` 和 `OUTPUT` 到 loopback 设备, 尽管您可以稍后对其进行限制。 另一方面,如果您不想要该模块创建的任何默认表、链 和规则,您可以将 `nftables::inet_filter` 和/或 `nftables::nat` 设置为 `false`,并使用此模块提供的构建块从头开始构建您完整的 nftables 配置。请查看 `nftables::inet_filter` 以获取灵感。 ## 规则验证 最初,puppet 将所有配置部署到 `/etc/nftables/puppet-preflight/` 和 `/etc/nftables/puppet-preflight.nft`。这将通过 `nft -c -I /etc/nftables/puppet-preflight/ -f /etc/nftables/puppet-preflight.nft` 进行验证。 当且仅当验证成功时,配置才会被复制到 实际位置,然后在服务重载之前。 ## 未管理的规则 默认情况下,管理员手动添加到内存中 规则集的规则将保持不变。但是, `nftables::purge_unmanaged_rules` 可以设置为 `true` 以恢复此 行为,并在 Puppet 运行期间如果检测到 非托管的更改,强制重新加载规则集。 ## 基本类型 ### nftables::config 管理 `/etc/nftables/puppet/${name}.nft` 中的原始文件。 将其用于任何自定义表文件。 ### nftables::chain 将链文件准备为一个 `concat` 文件,您将 能够通过 `nftables::rule` 向其添加专用规则。 名称必须在所有链中唯一。inject 参数可用于直接向主链添加跳转。inject 必须遵循模式 `ORDER-MASTERCHAIN`,其中 order 引用一个 2 位 数字,定义规则顺序(默认情况下使用例如 20), 而 masterchain 引用要挂载新链的链。 可以为 inject 规则指定 in-interface 名称和 out-interface 名称。 ### nftables::rule 一种向任何链添加规则的简单方法。名称必须是: `CHAIN_NAME-rulename`,其中 CHAIN_NAME 指的是您的 链,以及规则的任意名称。 该规则将是链 `CHAIN_NAME` 的一个 `concat::fragment`。 您可以使用 `order` 参数定义顺序。 在定义自己的规则之前,请查看 [REFERENCE](https://github.com/voxpupuli/puppet-nftables/blob/master/REFERENCE.md) 中可用的即用型规则列表, 可能已经有人为您封装了规则定义。 ### nftables::set 向给定的表添加命名集合。它允许使用单个参数组合 集合,但也通过 content 和 source 参数接受原始输入。 ### nftables::simplerule 允许通过添加类似 Firewall 的抽象层来表达防火墙规则,而无需使用 nftables 的语言。 它的功能相当有限,因此如果您需要相当复杂的规则或者您精通 nftables,建议直接使用 `nftables::rule`。 ## Facts 有一个结构化 fact `nftables` 可用 ``` { tables => [ "bridge-filter", "bridge-nat", "inet-firewalld", "ip-firewalld", "ip6-firewalld" ], version => "0.9.3" } ``` * `nftables.version` 是来自 `nft --version` 的 nft 命令的版本。 * `nftables.tables` 是来自 `nft list tables` 的机器上安装的表的列表。 ## 编辑器辅助 如果您使用 Emacs,[这里](https://github.com/nbarrientos/dotfiles/tree/master/.emacs.d/snippets/puppet-mode) 有一些可用于 [Yasnippet](https://github.com/joaotavora/yasnippet) 的代码片段 可以让您在使用该模块时更轻松。这是第三方配置, 此处仅作为参考包含,因此不保证此模块公开的接口的更改会自动应用在那里。 ## 开发 本模块依赖于 CI 测试。以确保测试和文档完整。 以下步骤是向模块添加新规则所需工作的蓝图: 1. 为新规则添加一个新类(有足够的示例) 2. 记录类和参数 3. 在 `spec/classes/rules` 中为新规则添加 spec 测试 4. 将规则添加到 `spec/acceptance/all_rules_spec.rb` 5. 使用 `bundle exec rake strings:generate:reference` 更新参考 6. 提交、推送并打开一个 PR
标签:Awesome, EC2, HTTPS, IaC, ICMP, INPUT链, NAT, Netfilter, nftables, OUTPUT链, Puppet, SSH, Voxpupuli, 安全策略, 开源模块, 提示词设计, 数据包过滤, 系统管理, 网络安全, 自动化运维, 规则管理, 防火墙, 隐私保护, 默认拒绝