对Iptables和Netfilter架构进行深入探究
介绍
防火墙是一种重要工具,可以配置来保护服务器和基础设施。在Linux生态系统中,iptables是一种广泛使用的防火墙工具,它与内核的netfilter数据包过滤框架一起工作。创建可靠的防火墙策略可能很困难,因为涉及到复杂的语法和许多相互关联的部分。
在本指南中,我们将深入了解iptables的架构,目的是让需要构建自己的防火墙策略的用户更易理解。我们将讨论iptables如何与netfilter交互,以及各个组件如何协同工作,提供完善的过滤系统。
什么是IPTables和Netfilter?
多年来,Linux 中最常用的防火墙软件称为 iptables。在一些发行版中,它已被一个名为 nftables 的新工具所替代,但 iptables 语法仍常用作基线。iptables 防火墙通过与 Linux 内核网络堆栈中的数据包过滤钩子进行交互工作。这些内核钩子被称为 netfilter 框架。
所有通过网络层的数据包(无论是进入还是离开)都会触发这些钩子,使程序能够在关键点与流量进行交互。与iptables相关的内核模块会向这些钩子注册,以确保流量符合防火墙规则所规定的条件。
Netfilter钩子
有五个netfilter挂钩可以让程序进行注册。当数据包在堆栈中传输时,它们将触发已向这些挂钩进行注册的内核模块。数据包触发的挂钩取决于数据包是传入还是传出、数据包的目的地,以及数据包在之前的某个点上是否被丢弃或拒绝。
以下的钩子代表着网络堆栈中的这些明确定义的点。
- NF_IP_PRE_ROUTING: This hook will be triggered by any incoming traffic very soon after entering the network stack. This hook is processed before any routing decisions have been made regarding where to send the packet.
- NF_IP_LOCAL_IN: This hook is triggered after an incoming packet has been routed if the packet is destined for the local system.
- NF_IP_FORWARD: This hook is triggered after an incoming packet has been routed if the packet is to be forwarded to another host.
- NF_IP_LOCAL_OUT: This hook is triggered by any locally created outbound traffic as soon as it hits the network stack.
- NF_IP_POST_ROUTING: This hook is triggered by any outgoing or forwarded traffic after routing has taken place and just before being sent out on the wire.
需要在这些钩子中注册的内核模块还必须提供一个优先级数字,以帮助确定在触发钩子时它们将被调用的顺序。这为多个模块(或同一模块的多个实例)与每个钩子连接提供了确定性的顺序。每个模块将依次被调用,并在处理后向netfilter框架返回一个决策,指示应该如何处理该数据包。
IPTables 表格和链路
iptables防火墙使用表格来组织其规则。这些表格根据规则的决策类型对规则进行分类。例如,如果一条规则处理网络地址转换,它将被放入nat表格中。如果该规则用于决定是否允许数据包继续发送到目标地址,它可能会被添加到filter表格中。
在每个iptables表格内部,规则进一步按照独立的“链”进行组织。虽然表格是由它们所包含规则的总体目标来定义的,但内置的链代表了触发它们的netfilter钩子。链决定了何时对规则进行评估。
内置链的名称与它们关联的netfilter钩子的名称相同。
- PREROUTING: Triggered by the NF_IP_PRE_ROUTING hook.
- INPUT: Triggered by the NF_IP_LOCAL_IN hook.
- FORWARD: Triggered by the NF_IP_FORWARD hook.
- OUTPUT: Triggered by the NF_IP_LOCAL_OUT hook.
- POSTROUTING: Triggered by the NF_IP_POST_ROUTING hook.
链条允许管理员控制规则在数据包传输路径中的评估位置。由于每个表都有多个链条,一个表的影响可以在多个处理点上施加。因为某些类型的决策只在网络堆栈的某些点上才有意义,所以并非每个表都在每个内核钩子上注册有链条。
在netfilter内核钩子中只有五个,因此每个钩子都注册了来自多个表的链条。例如,有三个表具有PREROUTING链。当这些链在关联的NF_IP_PRE_ROUTING钩子上注册时,它们指定了一个优先级,该优先级决定了每个表的PREROUTING链的调用顺序。在进入下一个PREROUTING链之前,会按顺序评估具有最高优先级的PREROUTING链中的每个规则。我们将稍后查看每个链的具体顺序。
有哪些桌子可以用?
让我们暂时退后一步,看一下iptables提供的不同表格。这些表格代表了按关注领域组织的规则集,用于评估数据包。
过滤表
过滤表是iptables中最常用的表之一。过滤表用于决定是否允许数据包继续传送到其目标地址,或者拒绝其请求。在防火墙术语中,这被称为”过滤”数据包。这个表提供了人们在讨论防火墙时考虑的大部分功能。
NAT表
NAT表用于实施网络地址转换规则。当数据包进入网络堆栈时,该表中的规则将确定如何修改数据包的源地址或目标地址,以影响数据包及任何响应流量的路由方式。这通常用于在直接访问不可行时将数据包路由到网络。
搅乱桌子
操纵表用于以不同的方式改变数据包的IP头部。例如,您可以调整数据包的TTL(生存时间)值,延长或缩短数据包可以承受的有效网络跳数。其他IP头部也可以通过类似的方式进行更改。
这个表还可以在数据包上放置一个内部核心“标记”,以便在其他表格和其他网络工具中进行进一步处理。这个标记不会影响实际的数据包,而是将标记添加到内核对数据包的表示中。
原始表格
iptables防火墙是有状态的,意味着数据包的评估与其与先前数据包的关系有关。建立在netfilter框架之上的连接跟踪功能使iptables能够将数据包视为正在进行的连接或会话的一部分,而不是一系列离散且无关的数据包流。连接跟踪逻辑通常在数据包到达网络接口后很快应用。
原始表具有非常狭窄的功能。其唯一目的是提供一个机制来标记数据包,以便退出连接跟踪。
安全表格
安全表用于在数据包上设置内部SELinux安全上下文标记,这将影响SELinux或其他能解释SELinux安全上下文的系统处理这些数据包的方式。这些标记可以基于每个数据包或每个连接应用。
链和表之间的关系
三个表格都有PREROUTING链,它们的评估顺序是什么?
下表展示了从左到右阅读时每个iptables表中可用的链。例如,我们可以看到原始表有PREROUTING和OUTPUT链。从上到下阅读时,还显示了每个链在相关的netfilter hook触发时的调用顺序。
需要注意以下几点。在下面的示意图中,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规则以正确路由。
链式遍历顺序 shì lì xù)
假设服务器知道如何路由数据包,并且防火墙规则允许其传输,在不同的情况下,以下流程代表将要经过的路径。
- Incoming packets destined for the local system: PREROUTING -> INPUT
- Incoming packets destined to another host: PREROUTING -> FORWARD -> POSTROUTING
- Locally generated packets: OUTPUT -> POSTROUTING
如果我们将上述信息与前面表中的排序结合起来,我们可以看到,一个发送到本地系统的入站数据包首先将会在原始(raw)、操作(mangle)和网络地址转换(nat)表的链(PREROUTING chains)上进行评估。然后它将在操作(mangle)、过滤(filter)、安全(security)和网络地址转换(nat)表的输入(INPUT chains)上进行遍历,最后被传递到本地套接字。
IPTables规则
规则被放置在特定表的特定链中,每当调用某个链时,将按顺序检查问题包是否符合链中的每条规则。每条规则都有一个匹配部分和一个动作部分。
匹配
一个规则的匹配部分指明一个数据包必须满足的条件,以便执行相关的动作(或“目标”)。
配对系统非常灵活,可以通过附加的iptables扩展大幅扩展。可以根据协议类型、目标或源地址、目标或源端口、目标或源网络、输入或输出接口、头部或连接状态等条件来构建规则进行匹配。这些条件可以组合在一起,创建复杂的规则集以区分不同的流量。
目标
“目标”是指当数据包符合规则匹配条件时触发的动作。目标一般分为两大类:
- Terminating targets: Terminating targets perform an action which terminates evaluation within the chain and returns control to the netfilter hook. Depending on the return value provided, the hook might drop the packet or allow the packet to continue to the next stage of processing.
- Non-terminating targets: Non-terminating targets perform an action and continue evaluation within the chain. Although each chain must eventually pass back a final terminating decision, any number of non-terminating targets can be executed beforehand.
每个规则中的目标的可用性将取决于上下文。例如,表和链类型可能会确定可用的目标。规则中激活的扩展和匹配子句也可以影响目标的可用性。
跳转到用户定义的链条 de tiě)
还有一类特殊的无终止目标:跳转目标。跳转目标是导致评估移动到另一个链进行额外处理的操作。我们已经讨论了与调用它们的netfilter钩子相关联的内置链。然而,iptables还允许管理员为组织目的创建自己的链。
规则可以以与内置链相同的方式放置在用户定义的链中。不同的是,只能通过从规则中“跳转”到它们来访问用户定义的链(它们本身不通过netfilter挂钩进行注册)。
用户定义的链表作为调用它们的链表的扩展。例如,在用户定义的链表中,如果到达规则列表的末尾或者匹配规则激活了一个返回目标,评估将返回到调用链表。评估也可以跳转到其他用户定义的链表。
这个结构可以增加组织性,为更强大的分支提供所需的框架。
IPTables和连接跟踪
当我们讨论raw表和连接状态匹配准则时,我们介绍了基于netfilter框架实现的连接追踪系统。连接追踪能够让iptables在持续连接的背景下对数据包进行决策。连接追踪系统为iptables提供了执行“有状态”操作所需的功能。
在数据包进入网络堆栈后不久,会应用连接跟踪。在将数据包与连接相关联之前,仅对原始表链和一些健全性检查进行逻辑处理。
系统会根据一组现有连接来检查每个数据包。如果需要,它将更新连接在存储中的状态,并在必要时向系统中添加新连接。标记有NOTRACK目标的数据包将绕过连接跟踪例程。
可供选择的状态
由连接跟踪系统追踪的连接将处于以下状态之一:
- NEW: When a packet arrives that is not associated with an existing connection, but is not invalid as a first packet, a new connection will be added to the system with this label. This happens for both connection-aware protocols like TCP and for connectionless protocols like UDP.
- ESTABLISHED: A connection is changed from NEW to ESTABLISHED when it receives a valid response in the opposite direction. For TCP connections, this means a SYN/ACK and for UDP and ICMP traffic, this means a response where source and destination of the original packet are switched.
- RELATED: Packets that are not part of an existing connection, but are associated with a connection already in the system are labeled RELATED. This could mean a helper connection, as is the case with FTP data transmission connections, or it could be ICMP responses to connection attempts by other protocols.
- INVALID: Packets can be marked INVALID if they are not associated with an existing connection and aren’t appropriate for opening a new connection, if they cannot be identified, or if they aren’t routable among other reasons.
- UNTRACKED: Packets can be marked as UNTRACKED if they’ve been targeted in a raw table chain to bypass tracking.
- SNAT: This is a virtual state set when the source address has been altered by NAT operations. This is used by the connection tracking system so that it knows to change the source addresses back in reply packets.
- DNAT: This is a virtual state set when the destination address has been altered by NAT operations. This is used by the connection tracking system so that it knows to change the destination address back when routing reply packets.
连接跟踪系统中跟踪的状态允许管理员制定针对连接生命周期中特定点的规则,从而提供更全面和安全的规则功能。
结论
Netfilter数据包过滤框架和iptables防火墙是Linux服务器上大多数防火墙解决方案的基础。Netfilter内核钩子与网络堆栈紧密结合,可以对数据包进行强大的控制,以便在系统处理数据包时进行操作。iptables防火墙利用这些功能,为内核提供了一种灵活、可扩展的策略传达方法。通过了解这些组件如何协同工作,您可以更好地利用它们来控制和保护服务器环境。
如果你想了解更多关于如何选择有效的iptables策略的信息,请查阅这个指南。
以下指南可以帮助您开始实施您的iptables防火墙规则:
- How To Set Up a Firewall Using Iptables
- Iptables Essentials: Common Firewall Rules and Commands
- How To Set Up a Firewall with UFW on Ubuntu 22.04
- How To Set Up a Firewall Using firewalld on Rocky Linux 8
- How To Set Up an Iptables Firewall to Protect Traffic Between your Servers