voxpupuli/puppet-nftables
GitHub: voxpupuli/puppet-nftables
Puppet基础设施即代码模块,用于声明式管理和自动化部署Linux nftables防火墙规则。
Stars: 13 | Forks: 35
# nftables puppet 模块
[](https://forge.puppetlabs.com/puppet/nftables)
[](https://forge.puppetlabs.com/puppet/nftables)
[](http://www.puppetmodule.info/m/puppet-nftables)
[](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, 安全策略, 开源模块, 提示词设计, 数据包过滤, 系统管理, 网络安全, 自动化运维, 规则管理, 防火墙, 隐私保护, 默认拒绝