防火墙是一个重要的工具,可以配置它来保护您的服务器和基础设施。在Linux生态系统中,iptables
是一种广泛使用的防火墙工具,与内核一起工作netfilter
数据包过滤框架。由于复杂的语法和涉及的相互关联部分的数量,创建可靠的防火墙策略可能令人畏惧。
在本指南中,我们将深入探讨iptables
架构的目的是让需要构建自己的防火墙策略的用户更容易理解。我们将讨论如何iptables
相互作用netfilter
以及各个组件如何组合在一起以提供全面的过滤系统。
多年来,Linux 中最常用的防火墙软件称为iptables
。在某些发行版中,它已被名为的新工具所取代nftables
, but 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
处理后的框架,指示应如何处理数据包。
The iptables
防火墙使用表来组织其规则。这些表根据规则用于做出的决策类型对规则进行分类。例如,如果一条规则涉及网络地址转换,它将被放入nat
桌子。如果该规则用于决定是否允许数据包继续到达其目的地,则它可能会被添加到filter
table.
每个内iptables
表中,规则在单独的“链”中进一步组织。虽然表是由它们所持有的规则的总体目标定义的,但内置链代表了netfilter
触发它们的钩子。链条决定when将评估规则。
内置链的名称反映了netfilter
它们关联的钩子:
-
PREROUTING
: 由触发NF_IP_PRE_ROUTING
hook.
-
INPUT
: 由触发NF_IP_LOCAL_IN
hook.
-
FORWARD
: 由触发NF_IP_FORWARD
hook.
-
OUTPUT
: 由触发NF_IP_LOCAL_OUT
hook.
-
POSTROUTING
: 由触发NF_IP_POST_ROUTING
hook.
链允许管理员控制在数据包传输路径中的何处评估规则。由于每个表都有多个链,因此一个表的影响可以在处理过程中的多个点上发挥作用。由于某些类型的决策仅在网络堆栈中的某些点才有意义,因此每个表不会有一个向每个内核挂钩注册的链。
只有五个netfilter
内核钩子,因此来自多个表的链在每个钩子上注册。例如,三个表有PREROUTING
链。当这些链在关联的NF_IP_PRE_ROUTING
钩子,它们指定一个优先级来决定每个表的顺序PREROUTING
链被称为。里面每条规则的优先级最高PREROUTING
在进入下一个链之前按顺序评估链PREROUTING
链。我们稍后会看一下每个链的具体顺序。
让我们退后一步,看看不同的表iptables
提供。这些代表了不同的规则集,按关注领域组织,用于评估数据包。
过滤表是应用最广泛的表之一iptables
. The filter
表用于决定是否让数据包继续到达其预期目的地或拒绝其请求。用防火墙的术语来说,这称为“过滤”数据包。该表提供了人们在讨论防火墙时想到的大部分功能。
The nat
表用于实现网络地址转换规则。当数据包进入网络堆栈时,此表中的规则将确定是否以及如何修改数据包的源或目标地址,以影响数据包和任何响应流量的路由方式。当无法直接访问时,这通常用于将数据包路由到网络。
The mangle
表用于以各种方式更改数据包的 IP 标头。例如,您可以调整数据包的 TTL(生存时间)值,延长或缩短数据包可以维持的有效网络跃点数。其他 IP 标头可以用类似的方式更改。
该表还可以在数据包上放置内部内核“标记”,以便在其他表和其他网络工具中进行进一步处理。该标记不会触及实际的数据包,而是将标记添加到数据包的内核表示中。
The iptables
防火墙是有状态的,这意味着数据包将根据其与先前数据包的关系进行评估。连接跟踪功能建立在netfilter
框架允许iptables
将数据包视为正在进行的连接或会话的一部分,而不是离散的、不相关的数据包流。连接跟踪逻辑通常在数据包到达网络接口后立即应用。
The raw
表的功能定义非常狭窄。它的唯一目的是提供一种标记数据包的机制,以便选择退出连接跟踪。
The security
table 用于在数据包上设置内部 SELinux 安全上下文标记,这将影响 SELinux 或其他可以解释 SELinux 安全上下文的系统如何处理数据包。这些标记可以应用于每个数据包或每个连接。
如果三个表有PREROUTING
链,它们按什么顺序评估?
下表列出了每个中可用的链iptables
从左到右阅读时的表格。例如,我们可以说raw
表有两个PREROUTING
and 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
, and nat
表。然后它会遍历INPUT
的链mangle
, filter
, security
, and nat
表最终被传递到本地套接字之前。
规则放置在特定表的特定链中。当调用每个链时,将根据链中的每个规则按顺序检查有问题的数据包。每个规则都有一个匹配组件和一个操作组件。
规则的匹配部分指定数据包必须满足的条件,以便执行关联的操作(或“目标”)。
匹配系统非常灵活,可以通过附加功能进行显着扩展iptables
扩展。可以构建规则来匹配协议类型、目的地或源地址、目的地或源端口、目的地或源网络、输入或输出接口、标头或连接状态以及其他标准。这些可以组合起来创建复杂的规则集来区分不同的流量。
“目标”是指当数据包满足规则的匹配条件时触发的操作。目标一般分为两类:
-
终止目标:终止目标执行终止链内评估并将控制权返回给目标的操作
netfilter
钩。根据提供的返回值,挂钩可能会丢弃数据包或允许数据包继续进行下一阶段的处理。
-
非终止目标:非终止目标执行操作并在链内继续评估。尽管每个链最终必须传回最终终止决策,但可以预先执行任意数量的非终止目标。
规则中每个目标的可用性将取决于上下文。例如,表和链类型可能决定可用的目标。规则中激活的扩展和匹配子句也会影响目标的可用性。
还有一类特殊的非终止目标:跳跃目标。跳转目标是导致评估移动到不同链以进行额外处理的操作。我们已经介绍了与netfilter
调用它们的钩子。然而,iptables
还允许管理员出于组织目的创建自己的链。
可以将规则放置在用户定义的链中,就像将规则放置在内置链中一样。不同之处在于,用户定义的链只能通过从规则“跳转”到它们来到达(它们没有注册到netfilter
自己钩住)。
用户定义的链充当调用它们的链的扩展。例如,在用户定义的链中,如果到达规则列表的末尾或者如果RETURN
目标由匹配规则激活。评估还可以跳转到其他用户定义的链。
这种结构允许更好的组织,并提供更强大的分支所需的框架。
我们引入了在之上实现的连接跟踪系统netfilter
当我们讨论的框架raw
表和连接状态匹配标准。连接跟踪允许iptables
对在持续连接的上下文中查看的数据包做出决策。连接跟踪系统提供iptables
具有执行“有状态”操作所需的功能。
数据包进入网络堆栈后很快就会应用连接跟踪。这raw
表链和一些健全性检查是在将数据包与连接关联之前对数据包执行的唯一逻辑。
系统根据一组现有连接检查每个数据包。如果需要,它将更新其存储中的连接状态,并在必要时向系统添加新连接。已标记的数据包NOTRACK
目标之一raw
链将绕过连接跟踪例程。
连接跟踪系统跟踪的连接将处于以下状态之一:
-
NEW
:当数据包到达时,与现有连接不相关,但作为第一个数据包不是无效的,则会将带有此标签的新连接添加到系统中。对于连接感知协议(如 TCP)和无连接协议(如 UDP)都会发生这种情况。
-
ESTABLISHED
:连接已更改为NEW
to ESTABLISHED
当它收到相反方向的有效响应时。对于 TCP 连接,这意味着SYN/ACK
对于 UDP 和 ICMP 流量,这意味着原始数据包的源和目的地被交换的响应。
-
RELATED
:不属于现有连接但与系统中已有连接关联的数据包会被标记RELATED
。这可能意味着辅助连接,如 FTP 数据传输连接的情况,也可能是对其他协议的连接尝试的 ICMP 响应。
-
INVALID
:可以标记数据包INVALID
如果它们不与现有连接关联并且不适合打开新连接,如果它们无法识别,或者由于其他原因它们不可路由。
-
UNTRACKED
:数据包可以标记为UNTRACKED
如果他们已成为目标raw
表链绕过跟踪。
-
SNAT
:这是当源地址被 NAT 操作更改时设置的虚拟状态。连接跟踪系统使用它,以便它知道将回复数据包中的源地址更改回来。
-
DNAT
:这是当 NAT 操作更改了目标地址时设置的虚拟状态。连接跟踪系统使用它,以便它知道在路由回复数据包时将目标地址更改回来。
连接跟踪系统中跟踪的状态允许管理员制定针对连接生命周期中特定点的规则。这提供了更彻底、更安全的规则所需的功能。
The netfilter
数据包过滤框架和iptables
防火墙是 Linux 服务器上大多数防火墙解决方案的基础。这netfilter
内核钩子距离网络堆栈足够近,可以在系统处理数据包时提供对数据包的强大控制。这iptables
防火墙利用这些功能提供一种灵活的、可扩展的方法来将策略要求传达给内核。通过了解这些部分如何组合在一起,您可以更好地利用它们来控制和保护您的服务器环境。
如果您想了解更多关于如何选择有效的iptables
政策,查看本指南.
这些指南可以帮助您开始实施您的iptables
防火墙规则:
- 如何使用 iptables 设置防火墙
- Iptables 要点:常见防火墙规则和命令
- 如何在 Ubuntu 22.04 上使用 UFW 设置防火墙
- 如何在 Rocky Linux 8 上使用firewalld 设置防火墙
- 如何设置 Iptables 防火墙来保护服务器之间的流量