Alpine Wall

来自 Alpine Linux
此材料已过时...

请随时帮助我们制作最新版本。(讨论

本页面是关于新的防火墙管理框架的设计和实现计划。新框架旨在解决 Shorewall 的局限性,Shorewall 可能是 Alpine 中最常用的解决方案。

提议

我们评估了几个现有的开源项目,但没有一个能满足我们苛刻的品味。现有的解决方案要么与特定的(路由器)发行版过于绑定,要么针对家庭用户(内置了太多假设),要么依赖于臃肿的框架(通常是 Perl)。此外,我们希望将防火墙设置的管理和此类设置的激活保持为两个独立的工作流程,这将有助于防火墙规则的集中管理。

由于没有找到现成的解决方案,因此提议为 iptables 实现一个新的管理框架,该框架将与 Alpine 配置框架 (ACF) 集成。该框架在下文中被称为 Alpine Wall (awall)。

设计

Awall 将由三个主要组件组成:数据模型、前端和后端。它还实现了一个插件架构,允许扩展数据模型和功能,以简化常见的组织特定管理任务。

数据模型将使用与 Shorewall 大致兼容的概念和术语来描述防火墙配置。它还将借鉴我们评估的其他防火墙解决方案中的一些有用概念,例如 Turtle Firewall 中定义的“服务”概念(但进行了一些概括)。Awall 插件可以包含模式扩展模块,用于增强框架提供的基本模型。

后端负责将模型的数据转换为配置文件,最值得注意的是可以被 iptables-restoreip6tables-restore 读取的文件。此外,如有必要,它可以生成到例如 /etc/modprobe.d/etc/sysctl.d 中的文件。当插件扩展数据模型时,它还必须提供一个后端模块,该模块解释模型扩展并将数据转换为 iptables 和其他规则。该框架包含一个用于解释基本模型的模块。该框架负责对所有模块产生的结果进行排序和聚合,最终形成实际的配置文件。

前端本质上是一个 ACF 模块,它允许编辑数据模型,并在后端的帮助下激活更改。前端还实现了一种回退机制,以防止操作员因错误的配置而将自己锁定在外。配置数据存储在可以被直接编辑的文本文件中。前端提供了一个命令行工具,用于在手动更改后验证和激活配置。

基础模型

基本数据模型可能大致如下所示

区域(Zone)
接口*,子网*
服务(Service)
(协议,端口*)+
转发策略
区域:入*,区域:出*,接受/拒绝/丢弃,masq_on/masq_off
过滤规则
区域:入*,区域:出*,服务+,接受/拒绝/丢弃,连接限制?,流量限制?
NAT 规则
snat/dnat,区域:入*,区域:出*,服务,ip4_range,port_range?

区域定义中的子网可以使用 IPv4/IPv6 地址(CIDR 表示法)、域名或对 ipset 的引用来声明。域名可以解析为一个或多个 IP 地址。引用的 ipset 可以手动管理或通过其他工具管理。

如果源地址为 a 的数据包到达接口 i,则当且仅当 I 包含 i 并且 a 属于 S 的任何子网时,它才被认为源自区域 Z = (I, S) (其中 I 是接口集,S 是子网集)。在区域定义中,I 默认设置为所有接口的集合,S 默认设置为 {0.0.0.0/0, ::}。目标区域将以类似的方式基于数据包的目标地址和接口来定义。

实现注意事项

数据模型最好基于某种现有格式,例如 JSON、XML 或 YAML。为了允许扩展数据模型,awall 必须定义某种模式语言。这种语言将嵌入前端自动为扩展生成用户界面所需的必要信息。例如,向用户显示的帮助文本将放置在模式模块中。

理想情况下,基本模型将使用与模型扩展相同的语言来描述,但这将对语言提出相当苛刻的要求,例如,支持复杂数据类型。如果我们选择这种方法并使用 XML 对数据进行建模,我们可以使用 XML Schema 作为基础。还有一个关于 JSON Schema 的(过期的)Internet 草案,但似乎在 C 或 Lua 中没有现有的验证器实现。

即使从架构的角度来看很优雅,但典型扩展不太可能需要对复杂数据类型的支持。在大多数情况下,一组原始类型的全局变量就足够了。因此,我们可以仅使用一种非常简单的语言来声明此类变量,或者实现对某种众所周知的模式语言的有限子集的支持。在这种替代方案中,基本模型将不会使用这种语言来描述,而是硬编码到前端中。

后端模块负责将配置数据转换为配置文件片段。关于它们的实现,我们有两种选择。第一种选择是将它们实现为框架以定义的方式调用的 Lua 函数。该框架将提供一个库,允许所述函数访问数据模型,并在其他方面协助它们的实现。这些函数会将结果报告回框架,框架最终会将它们转换为目标文件。

在第二种选择中,后端模块将使用模板语言而不是通用编程语言来实现。与防火墙相关的模板语言的一个例子是 ferm 🔓,但不幸的是,它是用 Perl 实现的。Ferm 也缺乏方便地实现例如“区域”和“服务”概念的某些功能。但是,我们可以引入一种更适合我们目的的新模板语言。这种语言将消除后端模块中的一些冗余,而使用通用语言必然会带来这种冗余。另一方面,开发和维护这种语言将需要付出努力,并可能使框架在最初使用时更加困难。

后端将包含域名解析功能。在数据模型中,主机或主机组可以通过其域名来标识。后端会将这些域名解析为 IP 地址,这些 IP 地址将存储在目标文件中,因此在启动期间激活配置时无需解析任何内容。

参见