介绍
Firewalls 是一个重要的工具,可以配置为保护您的服务器和基础设施。 在 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
提供的不同表格。 这些代表不同的规则集,按关注区域组织,用于评估数据包。
过滤表
过滤表是iptables
中使用最广泛的表之一。 filter
表用于决定是让数据包继续到达其预期目的地还是拒绝其请求。 在防火墙用语中,这称为“过滤”数据包。 该表提供了人们在讨论防火墙时会想到的大部分功能。
NAT 表
nat
表用于实现网络地址转换规则。 当数据包进入网络堆栈时,此表中的规则将确定是否以及如何修改数据包的源地址或目标地址,以影响数据包和任何响应流量的路由方式。 当无法直接访问时,这通常用于将数据包路由到网络。
曼格尔表
mangle
表用于以各种方式更改数据包的 IP 标头。 例如,您可以调整数据包的 TTL(生存时间)值,延长或缩短数据包可以维持的有效网络跃点数。 其他 IP 标头可以以类似的方式更改。
该表还可以在数据包上放置一个内部内核“标记”,以便在其他表和其他网络工具中进行进一步处理。 这个标记不会触及实际的数据包,而是将标记添加到内核对数据包的表示中。
原始表
iptables
防火墙是有状态的,这意味着数据包根据它们与先前数据包的关系进行评估。 建立在 netfilter
框架之上的连接跟踪功能允许 iptables
将数据包视为正在进行的连接或会话的一部分,而不是作为离散的、不相关的数据包流。 连接跟踪逻辑通常在数据包到达网络接口后很快应用。
raw
表有一个非常狭窄定义的函数。 它的唯一目的是提供一种标记数据包的机制,以便选择退出连接跟踪。
安全表
security
表用于在数据包上设置内部 SELinux 安全上下文标记,这将影响 SELinux 或其他可以解释 SELinux 安全上下文的系统如何处理数据包。 这些标记可以在每个数据包或每个连接的基础上应用。
每个表中实现了哪些链?
我们已经分别讨论了表和链。 让我们看看每个表中有哪些链可用。 在这个讨论中暗示了关于注册到同一个钩子的链的评估顺序的进一步讨论。 如果三个表有 PREROUTING
链,它们的评估顺序是什么?
下表表示从左到右读取时每个 iptables
表中可用的链。 例如,我们可以看出 raw
表同时具有 PREROUTING
和 OUTPUT
链。 从上到下读取时,它还会显示触发关联的 netfilter
挂钩时调用每个链的顺序。
有几点需要注意。 在下面的表示中,nat
表已分为 DNAT
操作(更改数据包目标地址的操作)和 SNAT
操作(更改源地址的操作) ) 以便更清楚地显示它们的顺序。 我们还包括表示做出路由决策和启用连接跟踪的点的行,以便更全面地了解正在发生的过程:
桌子↓/链子→ | 预路由 | 输入 | 向前 | 输出 | 后路由 |
---|---|---|---|---|---|
(路由决定) | ✓ | ||||
生的 | ✓ | ✓ | |||
(启用连接跟踪) | ✓ | ✓ | |||
破坏 | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(路由决定) | ✓ | ✓ | |||
筛选 | ✓ | ✓ | ✓ | ||
安全 | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
当数据包触发 netfilter
钩子时,相关链将按照上表中从上到下的顺序进行处理。 数据包将触发的钩子(列)取决于它是传入还是传出数据包、做出的路由决策以及数据包是否通过过滤条件。
某些事件会导致在处理过程中跳过表的链。 例如,只有连接中的第一个数据包将根据 NAT 规则进行评估。 为第一个数据包做出的任何 nat
决定都将应用于连接中的所有后续数据包,而无需额外评估。 对 NAT 连接的响应将自动应用反向 NAT 规则以正确路由。
链遍历顺序
假设服务器知道如何路由数据包并且防火墙规则允许其传输,以下流表示将在不同情况下遍历的路径:
- 发往本地系统的传入数据包:
PREROUTING
->INPUT
- 发往另一台主机的传入数据包:
PREROUTING
->FORWARD
->POSTROUTING
- 本地生成的数据包:
OUTPUT
->POSTROUTING
如果我们将上述信息与上表中列出的顺序结合起来,我们可以看到发往本地系统的传入数据包将首先根据 raw
的 PREROUTING
链进行评估, mangle
和 nat
表。 然后它将遍历 mangle
、filter
、security
和 nat
表的 INPUT
链,最后交付到本地插座。
IPTables 规则
规则放置在特定表的特定链中。 在调用每条链时,将根据链中的每条规则按顺序检查相关数据包。 每个规则都有一个匹配组件和一个操作组件。
匹配
规则的匹配部分指定数据包必须满足的条件才能执行相关操作(或“目标”)。
匹配系统非常灵活,可以通过系统上可用的 iptables
扩展进行显着扩展。 可以根据协议类型、目标或源地址、目标或源端口、目标或源网络、输入或输出接口、报头或连接状态以及其他标准来构建规则以匹配。 这些可以结合起来创建相当复杂的规则集,以区分不同的流量。
目标
目标是当数据包满足规则的匹配条件时触发的操作。 目标一般分为两类:
- 终止目标:终止目标执行终止链内评估并将控制权返回给
netfilter
挂钩的操作。 根据提供的返回值,钩子可能会丢弃数据包或允许数据包继续处理的下一个阶段。 - 非终止目标:非终止目标执行一个动作并在链内继续评估。 尽管每条链最终都必须返回一个最终的终止决定,但可以预先执行任意数量的非终止目标。
规则中每个目标的可用性将取决于上下文。 例如,表和链类型可能决定了可用的目标。 规则中激活的扩展和匹配子句也会影响目标的可用性。
跳转到用户定义的链
我们应该提到一类特殊的非终止目标:跳转目标。 跳转目标是导致评估移动到不同链以进行额外处理的操作。 我们已经谈了很多关于与调用它们的 netfilter
挂钩密切相关的内置链。 但是,iptables
也允许管理员出于组织目的创建自己的链。
规则可以像放置在内置链中一样放置在用户定义的链中。 不同之处在于用户定义的链只能通过从规则“跳转”到它们来到达(它们本身没有使用 netfilter
钩子注册)。
用户定义的链充当调用它们的链的简单扩展。 例如,在用户定义的链中,如果到达规则列表的末尾或匹配规则激活了 RETURN
目标,则评估将传递回调用链。 评估还可以跳转到其他用户定义的链。
这种构造允许更大的组织并提供更健壮的分支所需的框架。
IPTables 和连接跟踪
在讨论 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
:如果数据包在raw
表链中被定位以绕过跟踪,则可以将数据包标记为UNTRACKED
。SNAT
:当源地址被 NAT 操作更改时设置的虚拟状态。 这由连接跟踪系统使用,以便它知道在回复数据包中将源地址更改回。DNAT
:当目标地址被 NAT 操作更改时设置的虚拟状态。 这由连接跟踪系统使用,以便它知道在路由回复数据包时将目标地址更改回来。
连接跟踪系统中跟踪的状态允许管理员制定针对连接生命周期中特定点的规则。 这提供了更彻底和更安全的规则所需的功能。
结论
netfilter
包过滤框架和 iptables
防火墙是 Linux 服务器上大多数防火墙解决方案的基础。 netfilter
内核挂钩足够接近网络堆栈,以便在系统处理数据包时提供对数据包的强大控制。 iptables
防火墙利用这些功能来提供一种灵活、可扩展的方法来向内核传达策略要求。 通过了解这些部分如何组合在一起,您可以更好地利用它们来控制和保护您的服务器环境。
如果您想了解更多有关如何选择有效的 iptables
策略的信息,请查看 本指南。
这些指南可以帮助您开始实施 iptables
防火墙规则: