深入研究 Iptables 和 Netfilter 架构
Posted rtoax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入研究 Iptables 和 Netfilter 架构相关的知识,希望对你有一定的参考价值。
《A Deep Dive into Iptables and Netfilter Architecture》
上图:https://www.ichenfu.com/2018/09/09/packet-flow-in-netfilter/
介绍
防火墙是一种重要的工具,可以通过配置来保护您的服务器和基础设施。在 Linux 生态系统中,iptables
是一个广泛使用的防火墙工具,它与内核的netfilter
包过滤框架接口。对于不了解这些系统架构的用户和管理员来说,创建可靠的防火墙策略可能会令人生畏,这不仅是因为语法具有挑战性,还因为框架中存在大量相互关联的部分。
在本指南中,我们将深入探讨iptables
架构,目的是让需要构建自己的防火墙策略的用户更容易理解。我们将讨论各种组件如何iptables
交互netfilter
以及如何组合在一起以提供一个全面的过滤和重整系统。
什么是 IPTables 和 Netfilter?
Linux 中最常用的基本防火墙软件称为iptables
. 该iptables
防火墙的工作原理是与包过滤在Linux内核的网络栈挂钩交互。这些内核钩子被称为netfilter
框架。
每个进入网络系统(传入或传出)的数据包都会在它通过堆栈时触发这些钩子,从而允许注册到这些钩子的程序在关键点与流量进行交互。与iptables
注册这些挂钩的内核模块相关联,以确保流量符合防火墙规则规定的条件。
网络过滤器挂钩
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
。这些代表不同的规则集,按关注区域组织,用于评估数据包。
过滤表
过滤器表是 .NET 中使用最广泛的表之一iptables
。该filter
表用于决定是让数据包继续到达其预定目的地还是拒绝其请求。在防火墙术语中,这称为“过滤”数据包。此表提供了人们在讨论防火墙时会想到的大量功能。
NAT 表
该nat
表用于实现网络地址转换规则。当数据包进入网络堆栈时,此表中的规则将确定是否以及如何修改数据包的源地址或目标地址,以影响数据包和任何响应流量的路由方式。当无法直接访问时,这通常用于将数据包路由到网络。
Mangle 表
该mangle
表用于以各种方式更改数据包的 IP 标头。例如,您可以调整数据包的 TTL(生存时间)值,延长或缩短数据包可以维持的有效网络跳数。其他 IP 标头可以以类似的方式更改。
该表还可以在数据包上放置一个内部内核“标记”,以便在其他表中和其他网络工具中进一步处理。该标记不会触及实际的数据包,而是将标记添加到内核对数据包的表示中。
原始表
该iptables
防火墙是有状态的,这意味着数据包的问候评估他们的关系以前的数据包。建立在netfilter
框架之上的连接跟踪功能允许iptables
将数据包视为正在进行的连接或会话的一部分,而不是将其视为离散的、不相关的数据包流。通常在数据包到达网络接口后很快就会应用连接跟踪逻辑。
该raw
表具有非常狭窄的定义功能。它的唯一目的是提供一种标记数据包的机制,以便选择退出连接跟踪。
安全表
该security
表用于在数据包上设置内部 SELinux 安全上下文标记,这将影响 SELinux 或其他可以解释 SELinux 安全上下文的系统如何处理数据包。这些标记可以在每个数据包或每个连接的基础上应用。
每个表中实现了哪些链?
我们已经分别讨论了表和链。让我们来看看每个表中有哪些链可用。本次讨论中隐含的是关于注册到同一钩子的链的评估顺序的进一步讨论。如果三个表都有PREROUTING
链,它们的计算顺序是什么?
下表显示了iptables
从左到右阅读时每个表中可用的链。例如,我们可以判断该raw
表同时具有PREROUTING
和OUTPUT
链。当从上到下阅读时,它还显示netfilter
触发关联钩子时调用每个链的顺序。
应该注意一些事情。在下面的表示中,该nat
表已分为DNAT
操作(更改数据包的目标地址的SNAT
操作)和操作(更改源地址的操作),以便更清楚地显示它们的顺序。我们还包括代表做出路由决策和启用连接跟踪的点的行,以便更全面地了解正在发生的过程:
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
如果我们结合在上表中规定的顺序上面的信息,我们可以看到,发往本地系统传入数据包将首先对被评估PREROUTING
的链raw
,mangle
和nat
表。然后,它会遍历INPUT
的链mangle
,filter
,security
,并nat
最终被传递到本地套接字之前表。
IPTables 规则
规则放置在特定表的特定链中。在调用每个链时,将根据链中的每个规则按顺序检查有问题的数据包。每个规则都有一个匹配组件和一个动作组件。
匹配
规则的匹配部分指定数据包必须满足的标准,以便执行关联的操作(或“目标”)。
匹配系统非常灵活,可以通过iptables
系统上可用的扩展进行显着扩展。可以构建规则以匹配协议类型、目标或源地址、目标或源端口、目标或源网络、输入或输出接口、标头或连接状态以及其他标准。这些可以组合起来创建相当复杂的规则集来区分不同的流量。
目标
目标是当数据包满足规则的匹配条件时触发的操作。目标一般分为两类:
- 终止目标:终止目标执行一个动作,该动作终止链内的评估并将控制权返回给
netfilter
钩子。根据提供的返回值,钩子可能会丢弃数据包或允许数据包继续进行下一阶段的处理。 - 非终止目标:非终止目标执行操作并在链内继续评估。尽管每个链最终都必须传回最终的终止决定,但可以预先执行任意数量的非终止目标。
规则中每个目标的可用性将取决于上下文。例如,表和链类型可能决定可用的目标。规则中激活的扩展和匹配子句也会影响目标的可用性。
跳转到用户定义的链
我们应该提到一类特殊的非终止目标:跳转目标。跳转目标是导致评估移动到不同链以进行额外处理的操作。我们已经谈了很多关于与netfilter
调用它们的钩子密切相关的内置链。但是,iptables
也允许管理员出于组织目的创建自己的链。
可以将规则放入用户定义的链中,其方式与放入内置链中的方式相同。不同之处在于用户定义的链只能通过从规则“跳转”到它们来到达(它们本身没有注册到netfilter
钩子)。
用户定义的链充当调用它们的链的简单扩展。例如,在用户定义的链中,如果到达规则列表的末尾或者RETURN
目标被匹配规则激活,则评估将传递回调用链。评估还可以跳转到其他用户定义的链。
这种构造允许更大的组织并提供更强大的分支所需的框架。
IPTables 和连接跟踪
netfilter
当我们讨论raw
表和连接状态匹配标准时,我们介绍了在框架之上实现的连接跟踪系统。连接跟踪允许iptables
对在正在进行的连接的上下文中查看的数据包做出决定。连接跟踪系统提供iptables
了执行“有状态”操作所需的功能。
数据包进入网络堆栈后很快就会应用连接跟踪。该raw
表链和一些基本的完整性检查是上之前的分组与连接相关联的数据包进行唯一的逻辑。
系统根据一组现有连接检查每个数据包。如果需要,它将更新其存储中的连接状态,并在必要时向系统添加新连接。已NOTRACK
在raw
链之一中标有目标的数据包将绕过连接跟踪例程。
可用状态
连接跟踪系统跟踪的连接将处于以下状态之一:
NEW
:当一个数据包到达时与现有连接没有关联,但作为第一个数据包不是无效的,一个新的连接将被添加到系统中并带有这个标签。对于 TCP 等连接感知协议和 UDP 等无连接协议,都会发生这种情况。ESTABLISHED
:当收到相反方向的有效响应时,连接从NEW
变为ESTABLISHED
。对于 TCP 连接,这意味着SYN/ACK
UDP 和 ICMP 流量,这意味着交换原始数据包的源和目标的响应。RELATED
:不属于现有连接但与系统中已有连接相关联的数据包标记为RELATED
。这可能意味着辅助连接,就像 FTP 数据传输连接的情况一样,或者可能是对其他协议的连接尝试的 ICMP 响应。INVALID
:INVALID
如果数据包不与现有连接相关联并且不适合打开新连接,如果无法识别,或者由于其他原因无法路由,则可以标记数据包。UNTRACKED
:可以将数据包标记为UNTRACKED
好像它们已被定位在raw
表链中以绕过跟踪。SNAT
:当源地址被 NAT 操作改变时设置的虚拟状态。这由连接跟踪系统使用,以便它知道将源地址更改回回复数据包。DNAT
:当目标地址被 NAT 操作改变时设置的虚拟状态。这由连接跟踪系统使用,以便它知道在路由回复数据包时将目标地址改回。
连接跟踪系统中跟踪的状态允许管理员制定针对连接生命周期中特定点的规则。这提供了更彻底和更安全的规则所需的功能。
结论
该netfilter
数据包过滤框架和iptables
防火墙是在Linux服务器上大多数防火墙解决方案的基础。该netfilter
内核挂钩足够接近网络堆栈超过包提供强大的控制,因为它们是由系统处理。该iptables
防火墙利用这些功能来提供通信政策要求内核的一个灵活的,可扩展的方法。通过了解这些部分如何组合在一起,您可以更好地利用它们来控制和保护您的服务器环境。
如果您想了解更多有关如何选择有效iptables
政策的信息,请查看本指南。
这些指南可以帮助您开始实施iptables
防火墙规则:
以上是关于深入研究 Iptables 和 Netfilter 架构的主要内容,如果未能解决你的问题,请参考以下文章