一个 防火墙 是一种安全设备(硬件/软件),通过过滤流量并阻止对私有数据的未授权/不必要的访问来保护网络。拥有合适的防火墙对于保护您的服务器和基础设施至关重要。它不仅可以阻止不必要的流量,还可以阻止恶意软件感染系统。
在 Linux 生态系统中,iptables 是一款流行的防火墙,它与 netfilter Linux 内核上的框架进行交互。大多数现代 Linux 系统都预装了这些工具。为了充分利用这些系统,理解它们的架构至关重要。否则,制定可靠的防火墙策略可能会令人望而生畏。这可能会导致创建复杂的语法、框架中相互关联的部分等。
本指南 将深入探讨 iptables 的架构,以帮助需要创建自己的防火墙策略的用户。我们还将探讨 iptables 如何与 netfilter 进行交互,以及各个组件是如何协同工作的。
Iptables 和 Netfilter
在 Linux 中,iptables 防火墙 是最常见的一种。它通过与 Linux 内核网络栈中的数据包过滤钩子进行交互来工作。正是这些内核钩子被统称为 netfilter 框架。
系统中的每个传入/传出数据包在流经网络栈时都会触发这些钩子。因此,注册到这些钩子的程序能够在关键节点与流量进行交互。最后,与 iptables 关联的内核模块连接到这些钩子,以执行指定的防火墙规则。
Netfilter 钩子
为了让程序进行连接,共有五个不同的 netfilter 钩子。随着数据包在网络栈中传输,这些钩子会触发注册到它们之上的内核模块。触发条件取决于多种因素,例如:数据包方向(传入/传出)、数据包目的地、数据包是否在之前的节点被丢弃/拒绝等。
以下是代表网络栈中各个明确定义节点的钩子:
-
NF_IP_PRE_ROUTING:此钩子由任何传入流量触发。触发发生在对数据包的目的地做出任何路由决策之前。
-
NF_IP_LOCAL_IN:此钩子在对传入数据包进行路由后触发。该数据包的目的地还必须是本地系统。
-
NF_IP_FORWARD:此钩子也是在对传入数据包进行路由后触发。但是,只有在数据包要路由到另一个主机时,它才会触发。
-
NF_IP_LOCAL_OUT:任何本地传出流量,一旦进入网络栈,就会触发此钩子。
-
NF_IP_POST_ROUTING:此钩子由任何在路由发生后、数据包到达物理介质之前的传出/转发流量触发。
希望在这些钩子上注册的内核模块必须提供一个优先级编号。该值有助于确定一旦触发钩子后调用它们的顺序。这种机制允许多个模块(不同的模块或同一模块 of 的多个副本)以确定的顺序连接到每个钩子。每个模块在处理数据包后,都会向 netfilter 框架返回一个决策。
Iptables 中的表和链
为了组织其规则, iptables 防火墙使用表。这些表根据规则所做决策的类型对规则进行分类。例如,如果某条规则涉及 NAT(网络地址转换),那么该规则就会被放在 nat 表下。同样,如果某条规则是决定是否允许/拒绝数据包到达其目的地,它就会被添加到 filter 表中。
在 iptables 的每个表中,规则被进一步组织在不同的 “链” 中。表代表它们所包含规则的类型,而链则描述了触发这些规则的 netfilter 钩子。简而言之,链决定了何时对规则进行评估。
以下是 iptables。有趣的是,链的名称也与关联的 netfilter 钩子相对应:
| 链 (iptables) | 用途 |
| PREROUTING | NF_IP_PRE_ROUTING |
| INPUT | NF_IP_LOCAL_IN |
| FORWARD | NF_IP_FORWARD |
| OUTPUT | NF_IP_LOCAL_OUT |
| POSTROUTING | NF_IP_POST_ROUTING |
通过使用这些链,管理员可以确定在数据包传递的哪个阶段评估规则。由于每个表都包含多个链,它还可以在处理过程中的多个点上扩大其影响。某些决策仅在网络栈的某些特定点上才有意义。因此,并非每个表都会在每个内核钩子上注册一个链。
The netfilter 框架仅提供 5 个内核钩子。因此,来自多个表的链会注册在钩子的每个点上。例如,如果三个链具有 PREROUTING 链,那么它就会注册到 NF_IP_PRE_ROUTING 钩子。它们中的每一个都必须提供一个优先级,以决定每个表的 PREROUTING 链被调用的顺序。优先级最高的 PREROUTING 链最先被评估,优先级次高的链第二个被评估,依此类推。
iptables 表
让我们退一步,看看 iptables 提供的表。如前所述,每个表代表不同的规则集,按关注领域组织,用于数据包评估。
-
filter 表
在 iptables , filter 表是最常用的表之一。它用于确定是否允许数据包继续发送到其目的地。在防火墙术语中,这个过程被称为“过滤”数据包。
这正是 filter 表的功能,人们在讨论防火墙时(在大多数情况下)所指的就是它。
-
nat 表
此表实现了规范 NAT 的规则。当数据包进入网络栈时,此表中描述的规则将决定如何修改数据包的源/目的地址,从而影响数据包的路由以及任何响应流量。
通常, nat 表用于将数据包路由到无法直接访问的网络。
-
mangle 表
此表包含以各种方式修改数据包 IP 首部的规则。例如,它可以通过延长/缩短数据包可以承受的有效网络跳数来修改数据包的 TTL(生存时间)值。此外, mangle 表也可以以类似的方式修改其他 IP 首部。
此表还允许在数据包上添加内部内核“标记”(mark),其他表和网络工具可以获取该标记以进行进一步处理。此标记不会修改实际的数据包,而是将标记添加到内核对该数据包的表示中。
-
raw 表
The iptables 防火墙是有状态的,这意味着数据包是在它们与先前数据包的关系上下文中进行评估的。在 netfilter 框架之上开发的连接跟踪功能允许 iptables 将数据包视为正在进行的连接或会话的一部分,而不是离散的、无关的数据包流。通常,在数据包到达网络接口后不久就会应用连接跟踪逻辑。
The raw 表具有非常狭窄的定义功能。此表的唯一目的是提供一种标记数据包的机制,以便免除连接跟踪。
-
security 表
The security table puts internal SELinux security context marks on packets. This, in turn, affects how SELinux (or any other app that interprets SELinux security contexts) will handle the packets.
SELinux 标记可以基于每个数据包或每个连接来应用。
每个表中实现的链
到目前为止,我们已经分别讨论了表和链。现在是时候看看每个表中有哪些可用的链了。这个主题扩展了关于注册到同一个钩子的链的评估顺序的讨论。例如,如果三个表都有 PREROUTING 链,会发生什么?它们的评估顺序是什么?
接下来,请看下表。它指出了每个 iptables 表中可用的链。
| PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING | |
|
(路由决策) |
✓ | ||||
|
raw |
✓ | ✓ | |||
|
(启用连接跟踪) |
✓ | ✓ | |||
|
mangle |
✓ | ✓ | ✓ | ✓ | ✓ |
|
nat (DNAT) |
✓ | ✓ | |||
|
(路由决策) |
✓ | ✓ | |||
|
filter |
✓ | ✓ | ✓ | ||
|
security |
✓ | ✓ | ✓ | ||
|
nat (SNAT) |
✓ | ✓ |
从左到右阅读时,它描述了哪些表包含哪些链。例如, raw 表同时具有 PREROUTING 和 OUTPUT 链。从上到下阅读时,它描述了当其关联的 netfilter 钩子被触发时,每个链被调用的顺序。
请注意, nat 表被拆分为 DNAT 操作(修改数据包的目的地)和 SNAT 操作(修改数据包的源地址),以便更清晰地指定它们的顺序。该表还包括进行路由决策和启用连接跟踪的表示点。
数据包将触发的钩子(列)取决于数据包的性质(传入/传出)、所做的路由决策以及数据包是否满足过滤条件。
在处理过程中,某些事件可以跳过表的链。例如,只有连接中的第一个数据包才会根据 nat 表中描述的 NAT 规则进行评估。同一连接中的任何后续数据包都将应用相同的 nat 决策,而无需任何额外的评估。对 NAT 连接的响应将自动应用反向 NAT 规则以进行正确的路由。
链遍历顺序
假设服务器知道数据包路由规则,且防火墙规则允许传输,以下流程表示将如何遍历不同的路径:
-
目的地为本地系统的传入数据包: PREROUTING >> INPUT
-
目的地为另一个主机的传入数据包: PREROUTING >> FORWARD >> POSTROUTING
-
本地生成的数据包: OUTPUT >> POSTROUTING
总之,结合我们目前讨论的所有信息,我们可以看到,任何目的地为本地系统的传入数据包都将根据 PREROUTING 链进行评估,这些链属于 raw, mangle、以及 nat 表。然后,它将通过 INPUT 链,这些链属于 mangle, filter, security、以及 nat 表,最后到达本地套接字。
Iptables 规则
The iptables 防火墙规则放置在特定表的特定链中。当调用某个链时,将根据该链中的每个规则对相关数据包进行评估。每个规则有两个组成部分:匹配部分和操作部分。
-
匹配
规则的匹配部分指定了在执行指定操作(或“目标”)之前数据包必须满足的条件。
匹配系统提供了令人难以置信的灵活性。它的功能还可以借助 iptables 扩展。可以描述规则以通过协议类型、源/目的地址、源/目的端口、源/目的网络、输入/输出接口、报头、连接状态和其他标准来匹配数据包。规则还可以是这些条件的组合,从而产生复杂的规则集来区分不同的流量。
-
目标
目标是当数据包满足规则的匹配条件时所采取的操作。通常,目标分为两组:
-
-
终止目标:它终止链内的评估过程,并将控制权返回给 netfilter 钩子。根据返回值,该钩子将允许数据包继续其行程或将其丢弃。
-
非终止目标:目标执行操作,并继续链中的评估。虽然每个链都必须通过最终的终止决策,但在此之前可以执行任意数量的非终止目标。
-
规则中每个目标(target)的可用性取决于上下文。例如,链和表类型可能会影响目标的可用性。其他可能的影响因素包括规则中激活的扩展和匹配子句。
用户自定义链
还有一类特殊的非终止目标:跳转目标(jump target)。跳转目标是在评估从一个链转移到另一个链以进行额外处理时执行的操作。到目前为止,我们已经讨论了与 netfilter 钩子紧密相连的内置链。然而, iptables 也允许管理员创建自定义链。
用户自定义链中的规则也与内置链中的规则类似。关键区别在于,用户自定义链只能通过从某个规则“跳转”到它们来访问。这是因为用户自定义链没有与任何 netfilter 钩子相关联。
您可以将用户自定义链视为最初调用它们的链的扩展。例如,在用户自定义链中,如果到达规则列表的末尾,或者匹配的规则执行了 RETURN 目标,评估将返回到调用链。有趣的是,用户自定义链还可以将评估“跳转”到另一个用户自定义链。
此功能为更好的组织奠定了基础,并为健壮的分支提供了必要的框架。
连接跟踪
在讨论 raw 表和连接状态匹配标准时,我们讨论了在 netfilter 框架之上实现的连接跟踪系统。此功能允许 iptables 在进行中连接的上下文中查看数据包。连接跟踪系统还为 iptables 提供了执行“有状态”操作所需的必要功能。
数据包进入网络栈后,就会立即应用连接跟踪。raw 表链和一些基本的完整性检查是将数据包与连接关联起来的所有逻辑。
系统会根据一组现有连接检查每个数据包。如果需要,系统将更新现有连接的状态或创建新连接。在任何 raw 表链中被标记为 NOTRACK 目标的数据包将绕过后续的连接跟踪程序。
-
可用状态
由连接跟踪系统跟踪的连接将被分配以下任一状态:
-
-
NEW :当收到一个与现有连接无关、但作为第一个数据包并非无效的数据包时,系统会添加一个带有此标签的新连接。这适用于面向连接的协议(例如 TCP)和无连接的协议(例如 UDP)。
-
ESTABLISHED:连接的状态从 NEW 更新为 ESTABLISHED,当它收到来自相反方向的有效响应时。对于 TCP 连接,它表示一个 SYN/ACK。对于 UDP 和 ICMP 流量,它表示原始数据包的源和目的被交换的响应。
-
RELATED:不属于连接的一部分但与已建立连接相关的数据包会被标记为 RELATED 。它可以表示辅助连接(例如,在 FTP 数据传输连接中),或者其他协议尝试连接时的 ICMP 响应。
-
INVALID:不属于已建立连接的一部分、被认为不适合打开新连接、无法识别、不可路由等的数据包会被标记为 INVALID.
-
UNTRACKED:数据包可以被标记为 UNTRACKED,如果它们在 raw 表链中被指定为绕过跟踪的目标。
-
SNAT:它表示当源地址通过 NAT 操作被修改时设置的虚拟状态。它由连接跟踪系统处理,以便在回复数据包中转换源地址。
-
DNAT:类似于 SNAT, 它表示当目的地址被 NAT 操作修改时的虚拟状态。连接跟踪系统会处理它,以便在路由回复数据包时知道将目的地址转换回来。
-
连接跟踪系统跟踪的这些状态允许管理员针对连接生命周期中的特定点制定特定规则。它为更彻底、更安全的规则提供了必要的功能。
总结
在 Linux 中, netfilter 框架和 iptables 防火墙是大多数防火墙的基础。netfilter 钩子足够接近网络栈,从而能够对系统处理的数据包进行强大的控制。利用这些功能, iptables 防火墙提供了一种向内核传达策略需求的灵活方式。
本指南深入探讨了 netfilter 框架和 iptables 防火墙。此外,它还讨论了连接跟踪系统。通过了解这些部分是如何协同工作的,您可以更好地利用它们来构建更强大、更安全的服务器环境。
最后,虽然本指南探讨了内部工作原理,但请查看这篇关于 配置 iptables 的指南以将其应用于实际。此外,您可以了解 UFW 防火墙 如何进一步简化 iptables。此外,学习如何 列出和删除 iptables 防火墙规则.
祝您使用愉快!
评论
暂无评论。发表第一条评论吧。