深入探讨Iptables和Netfilter架构

介绍

防火墙是一种重要的工具,可配置用于保护您的服务器和基础设施。在Linux生态系统中,iptables是一个广泛使用的防火墙工具,它与内核的netfilter数据包过滤框架配合使用。创建可靠的防火墙策略可能令人望而生畏,因为涉及到复杂的语法和多个相互关联的部分。

在本指南中,我们将深入探讨iptables的架构,旨在使需要构建自己防火墙策略的用户更容易理解。我们将讨论iptables如何与netfilter交互以及各种组件如何结合在一起提供全面的过滤系统。

什么是IPTables和Netfilter?

多年来,Linux 中最常用的防火墙软件被称为 iptables。在一些发行版中,它已被一个名为 nftables 的新工具取代,但 iptables 的语法仍然常被用作基准。 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`: 此钩子将在路由完成后,数据包被发送到网络之前触发,用于任何传出或转发的流量。

需要在这些钩子上注册的内核模块还必须提供一个优先级数字,以帮助确定触发钩子时将调用它们的顺序。这提供了一种方式,使多个模块(或同一模块的多个实例)以确定性顺序连接到每个钩子。每个模块将依次被调用,并在处理后向`netfilter`框架返回一个决策,指示应该对数据包采取什么操作。

IPTables表和链

防火墙iptables使用表来组织其规则。这些表根据它们用于做出决策的类型对规则进行分类。例如,如果规则涉及网络地址转换,则将其放入nat表中。如果规则用于决定是否允许数据包继续传输到目的地,则可能将其添加到filter表中。

在每个iptables表中,规则进一步组织在单独的“链”中。虽然表由它们保存的规则的一般目的定义,但内置链代表触发它们的netfilter钩子。链确定何时评估规则。

内置链的名称反映了它们关联的netfilter钩子的名称:

  • PREROUTING:由NF_IP_PRE_ROUTING钩子触发。
  • INPUT:由NF_IP_LOCAL_IN钩子触发。
  • FORWARD:由NF_IP_FORWARD钩子触发。
  • OUTPUT:由NF_IP_LOCAL_OUT钩子触发。
  • POSTROUTING:由NF_IP_POST_ROUTING钩子触发。

链允许管理员控制规则将在数据包传递路径的何处进行评估。由于每个表都有多个链,因此可以在处理的多个点施加表的影响。由于某些类型的决策只在网络堆栈的某些点上有意义,因此并非每个表都会向每个内核钩子注册链。

有五个netfilter内核钩子,因此来自多个表的链在每个钩子上都注册。例如,三个表具有PREROUTING链。当这些链在关联的NF_IP_PRE_ROUTING钩子上注册时,它们指定一个优先级,该优先级决定了每个表的PREROUTING链被调用的顺序。在移动到下一个PREROUTING链之前,将顺序评估最高优先级PREROUTING链中的每个规则。我们将在稍后查看每个链的具体顺序。

哪些表是可用的?

让我们退后一步,看一看iptables提供的不同表。这些代表了通过关注区域组织的规则的不同集合,用于评估数据包。

过滤表

过滤表是iptables中使用最广泛的表之一。filter表用于决定是否允许数据包继续到其预定的目的地,还是拒绝其请求。在防火墙术语中,这称为对数据包进行“过滤”。该表提供了人们在讨论防火墙时考虑的大部分功能。

NAT 表

nat 表用于实现网络地址转换规则。当数据包进入网络堆栈时,该表中的规则将确定是否以及如何修改数据包的源地址或目标地址,以影响数据包和任何响应流量的路由方式。这通常用于在直接访问不可能时将数据包路由到网络。

Mangle 表

mangle 表用于以各种方式修改数据包的 IP 头。例如,您可以调整数据包的 TTL(生存时间)值,延长或缩短数据包可维持的有效网络跳数。其他 IP 头也可以以类似的方式进行更改。

此表还可以在数据包上放置内部内核“标记”,以便在其他表和其他网络工具中进一步处理。此标记不会触及实际数据包,而是将标记添加到内核对数据包的表示中。

原始表

防火墙iptables是有状态的,意味着数据包的评估是基于其与先前数据包的关系。构建在netfilter框架之上的连接跟踪功能允许iptables将数据包视为正在进行的连接或会话的一部分,而不是作为一系列离散且无关的数据包流。连接跟踪逻辑通常在数据包到达网络接口后很快被应用。

raw表具有非常明确定义的功能。它的唯一目的是提供一种机制来标记数据包,以便退出连接跟踪。

安全表

security表用于在数据包上设置内部SELinux安全上下文标记,这将影响SELinux或其他可以解释SELinux安全上下文的系统处理数据包的方式。这些标记可以在每个数据包或每个连接的基础上应用。

链与表之间的关系

如果三个表都有PREROUTING链,它们的评估顺序是怎样的?

以下表格显示了从左到右读取时每个iptables表中可用的链。例如,我们可以看出raw表中既有PREROUTING链,也有OUTPUT链。从上到下读取时,它还显示了每个链在相关netfilter挂钩被触发时调用的顺序。

A few things should be noted. In the representation below, the nat table has been split between DNAT operations (those that alter the destination address of a packet) and SNAT operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)

当数据包触发一个netfilter挂钩时,相关链将按照上表中从上到下的顺序进行处理。数据包触发的挂钩(列)取决于它是传入数据包还是传出数据包、路由决策以及数据包是否通过过滤条件。

某些事件会导致跳过表的链在处理过程中。例如,连接中的第一个数据包将仅根据NAT规则进行评估。对于第一个数据包做出的任何nat决策都将应用于连接中的所有后续数据包,而无需进行额外的评估。对NAT连接的响应将自动应用相反的NAT规则以正确路由。

链遍历顺序

假设服务器知道如何路由数据包并且防火墙规则允许其传输,那么以下流程代表了在不同情况下将要遍历的路径:

  • 本地系统目标的传入数据包: PREROUTING -> INPUT
  • 传给另一主机的传入数据包: PREROUTING -> FORWARD -> POSTROUTING
  • 本地生成的数据包: OUTPUT -> POSTROUTING

如果我们将上述信息与前表中的顺序结合起来,我们可以看到,针对本地系统的传入数据包将首先针对rawmanglenat表的PREROUTING链进行评估。然后,它将穿过manglefiltersecuritynat表的INPUT链,最终传递到本地套接字。

IPTables规则

规则被放置在特定表的特定链中。每次调用链时,将按顺序检查问题数据包与链内的每个规则相匹配。每个规则都有一个匹配组件和一个动作组件。

匹配

规则的匹配部分指定了数据包必须满足的条件,才能执行相关的动作(或”目标”)。

匹配系统非常灵活,可以通过额外的iptables扩展进行大幅扩展。规则可以根据协议类型、目标或源地址、目标或源端口、目标或源网络、输入或输出接口、头部或连接状态等条件进行匹配。这些条件可以组合起来创建复杂的规则集,以区分不同的流量。

目标

A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:

  • 终止目标:终止目标执行一个动作,终止链中的评估,并将控制返回给netfilter钩子。根据提供的返回值,钩子可能丢弃数据包,或允许数据包继续到下一个处理阶段。
  • 非终止目标:非终止目标执行一个动作,并在链中继续评估。尽管每个链最终必须返回一个最终的终止决策,但可以在此之前执行任意数量的非终止目标。

每个目标在规则中的可用性取决于上下文。例如,表和链类型可能会规定可用的目标。规则中激活的扩展和匹配条款也会影响目标的可用性。

跳转到用户定义的链

还有一种特殊类别的非终止目标:跳转目标。跳转目标是导致评估移动到另一个链进行附加处理的操作。我们已经介绍了与调用它们的netfilter钩子相关联的内置链。但是,iptables还允许管理员为组织目的创建自己的链。

规则可以以与放置到内置链中相同的方式放置到用户定义的链中。不同之处在于,只能通过“跳转”到它们来到达用户定义的链(它们本身未在netfilter钩子中注册)。

用户定义的链充当调用它们的链的扩展。例如,在用户定义的链中,如果到达规则列表的末尾或匹配规则激活了RETURN目标,则评估将传回到调用链。评估还可以跳转到其他用户定义的链。

这种结构可以提供更好的组织,并提供了更稳健的分支所必需的框架。

iptables和连接跟踪

我们在讨论raw表和连接状态匹配标准时介绍了建立在netfilter框架之上的连接跟踪系统。连接跟踪允许iptables在进行持续连接上下文中查看的数据包上做出决策。连接跟踪系统为iptables提供了执行“有状态”操作所需的功能。

连接跟踪系统在数据包进入网络堆栈后不久就会被应用。在将数据包与连接关联之前,raw表链和一些完整性检查是唯一执行的逻辑。

该系统会将每个数据包与一组现有连接进行检查。如果需要,它将更新连接的状态,并在必要时将新连接添加到系统中。在raw链中的一个中使用了NOTRACK目标标记的数据包将绕过连接跟踪例程。

可用状态

连接跟踪系统跟踪的连接将处于以下状态之一:

  • NEW:当到达一个与现有连接不相关但不是作为第一个数据包无效的数据包时,将使用此标签向系统添加新连接。这适用于TCP等连接感知协议和UDP等无连接协议。
  • `已建立`:当连接在相反方向接收到有效响应时,从`新建立`更改为`已建立`。对于TCP连接,这意味着`SYN/ACK`,对于UDP和ICMP流量,这意味着源包和目的地被交换的响应。
  • `相关`:不属于现有连接但与系统中已有连接相关联的数据包被标记为`相关`。这可能意味着辅助连接,就像FTP数据传输连接的情况一样,或者可能是其他协议的连接尝试的ICMP响应。
  • `无效`:如果数据包与现有连接不相关且不适合打开新连接,如果无法识别或不能路由等其他原因,则可以标记数据包为`无效`。
  • `未跟踪`:如果数据包在`原始`表链中被标记为`未跟踪`,则它们可以被标记为`未跟踪`以绕过跟踪。
  • `SNAT`:当源地址经过NAT操作更改时,将设置此虚拟状态。这由连接跟踪系统使用,以便它知道在回复数据包时将源地址更改回来。
  • `DNAT`:当目标地址经过NAT操作更改时,将设置此虚拟状态。这由连接跟踪系统使用,以便它知道在路由回复数据包时将目标地址更改回来。

连接跟踪系统中跟踪的状态允许管理员制定针对连接生命周期中特定点的规则。这为制定更彻底和安全的规则提供了所需的功能。

结论

netfilter 数据包过滤框架和 iptables 防火墙是 Linux 服务器上大多数防火墙解决方案的基础。 netfilter 内核钩子与网络堆栈紧密相连,从而在系统处理数据包时提供对其强大控制能力。 iptables 防火墙利用这些功能,以提供一种灵活、可扩展的方法来将策略要求传达给内核。通过了解这些组件如何相互配合,您可以更好地利用它们来控制和保护服务器环境。

如果您想了解有关如何选择有效的 iptables 策略的更多信息,请查看本指南

这些指南可以帮助您开始实施 iptables 防火墙规则:

Source:
https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture