介绍
防火墙是一种重要的工具,可以配置来保护您的服务器和基础设施。在 Linux 生态系统中,iptables
是一个广泛使用的防火墙工具,它与内核的 netfilter
数据包过滤框架配合工作。由于复杂的语法和涉及的相关部分数量众多,创建可靠的防火墙策略可能令人望而生畏。
在本指南中,我们将深入探讨 iptables
架构,旨在使其更易于理解,以便需要构建自己防火墙策略的用户。我们将讨论 iptables
如何与 netfilter
交互,以及各个组件如何结合在一起,提供全面的过滤系统。
IPTables 和 Netfilter 是什么?
多年来,Linux 中最常用的防火墙软件被称为 iptables
。在一些发行版中,它已被一个名为 nftables
的新工具所取代,但 iptables
语法仍然常被用作基线。iptables
防火墙通过与 Linux 内核网络堆栈中的数据包过滤挂钩进行交互来工作。这些内核挂钩被称为 netfilter
框架。
每个通过网络层的数据包(传入或传出)都会触发这些挂钩,允许程序在关键点与流量交互。与 iptables
相关的内核模块会注册到这些挂钩,以确保流量符合防火墙规则所规定的条件。
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
表中。如果规则用于决定是否允许数据包继续传输到其目的地,它可能会被添加到 filter
表中。
在每个 iptables
表中,规则在单独的“链”中进一步组织。虽然表由其持有的规则的一般目的来定义,但内置链代表触发它们的 netfilter
挂钩。链确定规则将在何时被评估。
内置链的名称与它们关联的 netfilter
挂钩的名称相同:
PREROUTING
&#