深入了解 Iptables 和 Netfilter 架构

简介

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

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

什么是iptabes和NetFilter?

多年来,Linux中最常用的防火墙软件被称为‘iptable’。在某些发行版中,它已被一个名为nfables的新工具所取代,但ipables语法仍被普遍用作基准。iptable防火墙通过与Linux内核网络堆栈中的数据包过滤挂钩进行交互来工作。这些内核挂钩称为netfilter框架。

通过网络层的每个数据包(传入或传出)都将触发这些挂钩,从而允许程序在关键点与流量进行交互。与‘iptable’关联的内核模块向这些钩子注册,以确保流量符合防火墙规则规定的条件。

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'表。如果规则被用来决定是否允许数据包继续到它的目的地,它可能会被添加到过滤器表。

在每个iptables表中,规则被进一步组织在单独的中。虽然表是由它们所持有的规则的一般目标定义的,但内置的链表示触发它们的netfilter钩子。链determine when rules将被评估。

内置链的名称反映了与其关联的netfilter挂钩的名称:

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

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

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

哪些表可用?

让我们先退一步,看看`iptable‘提供的不同表。这些代表不同的规则集,按关注区域组织,用于评估数据包。

过滤器表

筛选表是ipables中使用最广泛的表之一。filter表用于决定是让数据包继续到达其预期目的地,还是拒绝其请求。用防火墙的话说,这就是所谓的过滤数据包。此表提供了人们在讨论防火墙时想到的大部分功能。

NAT表

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

Mangle表

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

该表还可以在分组上放置内部内核标记,以便在其他表中和由其他网络工具进一步处理。该标记不会触及实际的包,但会将该标记添加到内核表示的包中。

原料表

‘iptable’防火墙是有状态的,这意味着根据数据包与之前的数据包之间的关系来评估数据包。建立在netfilter框架之上的连接跟踪功能允许`iptable‘将数据包视为正在进行的连接或会话的一部分,而不是作为离散的、无关的数据包流。连接跟踪逻辑通常在数据包到达网络接口后立即应用。

原始表具有非常狭义的功能。它的唯一目的是提供一种标记数据包的机制,以便选择退出连接跟踪。

安全表

security表用于在报文上设置内部SELinux安全上下文标记,这将影响SELinux或其他可以解释SELinux安全上下文的系统如何处理报文。这些标记可以基于每个分组或每个连接来应用。

链表关系

如果有三个表有PREROUTING链,它们的求值顺序是什么?

下表显示了从左到右读取时每个ipables表中可用的链。例如,我们可以看出raw表同时有PREROUTINGOUTPUT链。当从上到下读取时,它还显示触发关联的netfilter钩子时调用每个链的顺序。

有几件事应该注意。在下面的表示中,为了更清楚地显示它们的顺序,Nat表被分为DNA操作(那些改变分组的目的地址的操作)和`SNAT‘操作(那些改变源地址的操作)。我们还包括表示做出路由决策和启用连接跟踪的点的行,以便更全面地了解正在发生的过程:

Tables↓/Chains→|预置|输入|转发|输出|后置 -|:-:|: (路由决策)|✓| RAW |✓|✓| (开启连接跟踪)|✓|✓| MANGLE |✓ NAT (Dnat)|✓|✓| (路由决策)|✓|✓| Filter ||✓| 安全 ||✓| NAT (SNAT)||✓|✓

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

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

链式遍历顺序

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

  • 本地系统入包量PREROUTING->INPUT
  • 去往其他主机的传入数据包PREROUTING->FORWARD->POSTROUTING
  • 本地生成的包OUTPUT->POSTROUTING

如果我们将上述信息与上一表中的排序相结合,可以看到,发往本地系统的传入数据包将首先根据rawmanglenat表的PREROUTING链进行评估。然后,它将遍历manglefiltersecuritynat表的INPUT链,最后被传递到本地套接字。

iptable规则

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

匹配

规则的匹配部分指定了数据包必须满足的标准,以便执行相关的操作(或)。

匹配系统非常灵活,可以通过附加的‘iptable’扩展来显著扩展。可以构建规则以通过协议类型、目的地或源地址、目的地或源端口、目的地或源网络、输入或输出接口、报头或连接状态以及其他标准进行匹配。可以组合这些规则来创建复杂的规则集,以区分不同的流量。

目标

目标是指当数据包满足规则的匹配条件时触发的操作。目标一般分为两类:

*终止目标 :终止目标执行一个操作,该操作终止链中的计算并将控制返回给netfilter钩子。根据提供的返回值,钩子可能会丢弃数据包或允许数据包继续进行下一阶段的处理。 *非终止目标 :非终止目标在链中执行动作并继续求值。虽然每个链最终都必须传回最终的终止决策,但可以预先执行任何数量的非终止目标。

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

跳转至自定义链

还有一类特殊的非终止目标:跳跃目标。跳转目标是导致评估移动到不同链进行额外处理的操作。我们已经介绍了内置链,这些链绑定到调用它们的netfilter挂钩。但是,ipables还允许管理员出于组织目的创建自己的链。

可以将规则放置在用户定义的链中,方法与将规则放置在内置链中的方式相同。不同的是,用户自定义链只能通过从规则跳转到它们才能到达(它们本身没有注册netfilter钩子)。

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

这种结构允许更大的组织,并提供了更健壮的分支所需的框架。

iptabes和连接跟踪

在讨论raw表和连接状态匹配标准时,我们介绍了在netfilter框架之上实现的连接跟踪系统。连接跟踪允许iptable‘对在正在进行的连接的上下文中查看的分组做出决定。连接跟踪系统为ipables`提供了执行有状态操作所需的功能。

在数据包进入网络堆栈后很快就会应用连接跟踪。在将数据包与连接相关联之前,对数据包执行的唯一逻辑是`raw‘表链和一些健全性检查。

系统对照一组现有连接检查每个包。如果需要,它将更新其存储中的连接状态,并在必要时向系统添加新连接。在其中一个raw链中标记了`NOTRACK‘目标的数据包将绕过连接跟踪例程。

可用状态

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

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

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

结论

netfilter数据包过滤框架和iptable‘防火墙是Linux服务器上大多数防火墙解决方案的基础。‘netfilter内核钩子离网络堆栈足够近,可以在系统处理数据包时对其进行强大的控制。‘iptable’防火墙利用这些功能来提供一种灵活的、可扩展的方法来向内核传达策略要求。通过了解这些组件如何组合在一起,您可以更好地利用它们来控制和保护您的服务器环境。

如果您想了解有关如何选择有效的‘guide](https://andsky.com/tech/tutorials/how-to-choose-an-effective-firewall-policy-to-secure-your-servers).’策略的更多信息,请查看[This iptable

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

Published At
Categories with 技术
comments powered by Disqus