深入探讨 Iptables 和 Netfilter 架构

2023-11-18

介绍

防火墙是一个重要的工具,可以配置它来保护您的服务器和基础设施。在Linux生态系统中,iptables是一种广泛使用的防火墙工具,与内核一起工作netfilter数据包过滤框架。由于复杂的语法和涉及的相互关联部分的数量,创建可靠的防火墙策略可能令人畏惧。

在本指南中,我们将深入探讨iptables架构的目的是让需要构建自己的防火墙策略的用户更容易理解。我们将讨论如何iptables相互作用netfilter以及各个组件如何组合在一起以提供全面的过滤系统。

什么是 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处理后的框架,指示应如何处理数据包。

IPTables 表和链

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表用于决定是否让数据包继续到达其预期目的地或拒绝其请求。用防火墙的术语来说,这称为“过滤”数据包。该表提供了人们在讨论防火墙时想到的大部分功能。

NAT 表

The nat表用于实现网络地址转换规则。当数据包进入网络堆栈时,此表中的规则将确定是否以及如何修改数据包的源或目标地址,以影响数据包和任何响应流量的路由方式。当无法直接访问时,这通常用于将数据包路由到网络。

破碎桌

The mangle表用于以各种方式更改数据包的 IP 标头。例如,您可以调整数据包的 TTL(生存时间)值,延长或缩短数据包可以维持的有效网络跃点数。其他 IP 标头可以用类似的方式更改。

该表还可以在数据包上放置内部内核“标记”,以便在其他表和其他网络工具中进行进一步处理。该标记不会触及实际的数据包,而是将标记添加到数据包的内核表示中。

原始表

The iptables防火墙是有状态的,这意味着数据包将根据其与先前数据包的关系进行评估。连接跟踪功能建立在netfilter框架允许iptables将数据包视为正在进行的连接或会话的一部分,而不是离散的、不相关的数据包流。连接跟踪逻辑通常在数据包到达网络接口后立即应用。

The raw表的功能定义非常狭窄。它的唯一目的是提供一种标记数据包的机制,以便选择退出连接跟踪。

安全表

The securitytable 用于在数据包上设置内部 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表最终被传递到本地套接字之前。

IP表规则

规则放置在特定表的特定链中。当调用每个链时,将根据链中的每个规则按顺序检查有问题的数据包。每个规则都有一个匹配组件和一个操作组件。

Matching

规则的匹配部分指定数据包必须满足的条件,以便执行关联的操作(或“目标”)。

匹配系统非常灵活,可以通过附加功能进行显着扩展iptables扩展。可以构建规则来匹配协议类型、目的地或源地址、目的地或源端口、目的地或源网络、输入或输出接口、标头或连接状态以及其他标准。这些可以组合起来创建复杂的规则集来区分不同的流量。

Targets

“目标”是指当数据包满足规则的匹配条件时触发的操作。目标一般分为两类:

  • 终止目标:终止目标执行终止链内评估并将控制权返回给目标的操作netfilter钩。根据提供的返回值,挂钩可能会丢弃数据包或允许数据包继续进行下一阶段的处理。
  • 非终止目标:非终止目标执行操作并在链内继续评估。尽管每个链最终必须传回最终终止决策,但可以预先执行任意数量的非终止目标。

规则中每个目标的可用性将取决于上下文。例如,表和链类型可能决定可用的目标。规则中激活的扩展和匹配子句也会影响目标的可用性。

跳转到用户定义的链

还有一类特殊的非终止目标:跳跃目标。跳转目标是导致评估移动到不同链以进行额外处理的操作。我们已经介绍了与netfilter调用它们的钩子。然而,iptables还允许管理员出于组织目的创建自己的链。

可以将规则放置在用户定义的链中,就像将规则放置在内置链中一样。不同之处在于,用户定义的链只能通过从规则“跳转”到它们来到达(它们没有注册到netfilter自己钩住)。

用户定义的链充当调用它们的链的扩展。例如,在用户定义的链中,如果到达规则列表的末尾或者如果RETURN目标由匹配规则激活。评估还可以跳转到其他用户定义的链。

这种结构允许更好的组织,并提供更强大的分支所需的框架。

IPTables 和连接跟踪

我们引入了在之上实现的连接跟踪系统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 防火墙来保护服务器之间的流量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入探讨 Iptables 和 Netfilter 架构 的相关文章

  • Linux 类型命令

    The type命令用于显示有关命令类型的信息 它将向您展示在命令行上键入给定命令时将如何解释 在这篇文章中 我们将解释如何使用Linuxtype命令 如何使用 type 命令 type是 Bash 和其他 shell 如 Zsh 和 Ks

随机推荐

  • 如何在 CentOS 7 上使用 Apache 安装和保护 phpMyAdmin

    phpMyAdmin 是一个基于 PHP 的开源工具 用于通过基于 Web 的界面管理 MySQL 和 MariaDB 服务器 phpMyAdmin 允许您与 MySQL 数据库交互 管理用户帐户和权限 执行 SQL 语句 以各种数据格式导
  • 如何在 Ubuntu 20.04 上设置 Nginx 服务器块

    服务器块是一种 Nginx 指令 它定义特定域的设置 允许您在一台服务器上运行多个网站 对于每个网站 您可以设置网站文档根目录 包含网站文件的目录 创建单独的安全策略 使用不同的 SSL 证书等等 本文介绍如何在 Ubuntu 20 04
  • 如何在 CentOS 7 上添加和删除用户

    CentOS 以及所有其他 Linux 发行版都是一个多用户操作系统 每个用户可以对各种命令行和 GUI 应用程序拥有不同的权限级别和特定设置 了解如何添加和删除用户是每个 Linux 用户应该了解的基本技能之一 在本教程中 我们将解释如何
  • 如何在树莓派上安装和使用 Docker

    Docker 是一个容器化平台 允许您快速构建 测试和部署应用程序作为可移植 自给自足的容器 几乎可以在任何地方运行 在本教程中 我们将解释如何在 Raspberry Pi 上安装 Docker 并探索基本的 Docker 概念和命令 先决
  • 如何在 Ubuntu 18.04 上使用 Apache 安装和配置 Nextcloud

    下一云是一个开源 自托管的文件共享和协作平台 类似于 Dropbox 它捆绑了媒体播放器 日历和联系人管理 Nextcloud 可通过应用程序进行扩展 并拥有适用于所有主要平台的桌面和移动客户端 在本教程中 我们将向您展示如何在 Ubunt
  • 了解 /etc/passwd 文件

    Linux 系统上可以使用多种不同的身份验证方案 最常用和标准的方案是针对 etc passwd and etc 影子 files etc passwd是一个基于纯文本的数据库 包含系统上所有用户帐户的信息 这是owned第 644 章权限
  • 如何在 Debian 9 上使用 UFW 设置防火墙

    Debian 包含多个软件包 这些软件包提供了用于管理防火墙的工具 其中 iptables 作为基本系统的一部分安装 对于初学者来说 学习如何使用 iptables 工具正确配置和管理防火墙可能很复杂 但 UFW 简化了它 UFW Unco
  • 如何在 Ubuntu 14.04 服务器上安装 ISPConfig3

    介绍 尽管命令行是一个功能强大的工具 可以让您在许多情况下快速轻松地工作 但在某些情况下 可视化界面会很有帮助 如果您要在一台计算机上配置许多不同的服务 或者为客户端管理系统的某些部分 则可以使用诸如ISP配置可以使这个任务变得更加简单 I
  • 如何在 CentOS 7 上安装 Git

    介绍 版本控制已成为现代软件开发中不可或缺的工具 版本控制系统允许您在源代码级别跟踪您的软件 您可以跟踪更改 恢复到之前的阶段以及从基本代码分支以创建文件和目录的替代版本 最流行的版本控制系统之一是git 许多项目在 Git 存储库中维护其
  • 什么是 Kubernetes?

    介绍 Kubernetes 是一个功能强大的开源系统 最初由 Google 开发 并得到云原生计算基金会 CNCF 的支持 用于在集群环境中管理容器化应用程序 它旨在提供更好的方法来管理跨不同基础设施的相关分布式组件和服务 要了解有关 Ku
  • 使用 Debian 9 进行初始服务器设置

    介绍 当您首次创建新的 Debian 9 服务器时 您应该尽早执行一些配置步骤作为基本设置的一部分 这将提高服务器的安全性和可用性 并为您后续的操作奠定坚实的基础 第一步 以 root 身份登录 要登录您的服务器 您需要知道您的服务器的公共
  • 如何使用 DigitalOcean 云服务器创建虚荣或品牌名称服务器

    介绍 托管提供商或经销商特别感兴趣 拥有品牌或 虚荣域名服务器为客户提供了更专业的外观 它 无需要求您的客户将其域名指向另一个域名 公司的域名服务器 本教程将概述两种创建方法 自定义域名服务器 i 虚荣和 ii 品牌 Types 虚荣名称服
  • 如何在 Ubuntu 18.04 上安装 MySQL

    本教程的先前版本由以下人员编写榛子维尔多 介绍 MySQL是一个开源数据库管理系统 通常作为流行的一部分安装LAMP Linux Apache MySQL PHP Python Perl 堆栈 它使用关系数据库和 SQL 结构化查询语言 来
  • 如何使用 passwd 和 adduser 在 Linux VPS 上管理密码

    介绍 密码和身份验证是每个用户在 Linux 环境中工作时必须处理的概念 这些主题涵盖许多不同的配置文件和工具 在本指南中 我们将探索一些基本文件 例如 etc passwd 和 etc shadow 以及用于配置身份验证的工具 例如名称恰
  • 如何在 VPS 上安装和使用 Logwatch 日志分析器和报告器

    介绍 应用程序创建所谓的 日志文件 来跟踪在任何给定时间发生的活动 这些文件远非简单的文本输出 浏览起来可能非常复杂 特别是当所管理的服务器很繁忙时 当需要参考日志文件时 例如 在发生故障 数据丢失等情况下 利用所有可用的帮助变得至关重要
  • 如何修改 DOM 中的属性、类和样式

    介绍 在本教程之前的教程中series 如何更改 DOM 我们介绍了如何使用内置方法从文档对象模型 DOM 中创建 插入 替换和删除元素 通过提高操作 DOM 的熟练程度 您可以更好地利用 JavaScript 的交互功能并修改 Web 元
  • 如何在 Ubuntu 22.04 上的 PostgreSQL 中静态加密数据库

    介绍 PostgreSQL是一个数据库管理系统 自 1996 年以来一直存在 就像其他数据库系统一样 SQL MySQL Oracle等 PostgreSQL的主要目的是为用户提供一种创建数据库用于存储和数据检索的方式 其突出的功能之一包括
  • 如何在 Ubuntu 12.04 上使用 Iptables 设置防火墙

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • Java 中的死锁示例

    java中的死锁是两个或多个线程永远被阻塞的一种编程情况 Java 死锁情况发生在至少两个线程和两个或更多资源的情况下 这里我写了一个简单的程序 该程序会导致java死锁场景 然后我们将看到如何分析它 Java 中的死锁 Let s hav
  • 深入探讨 Iptables 和 Netfilter 架构

    介绍 防火墙是一个重要的工具 可以配置它来保护您的服务器和基础设施 在Linux生态系统中 iptables是一种广泛使用的防火墙工具 与内核一起工作netfilter数据包过滤框架 由于复杂的语法和涉及的相互关联部分的数量 创建可靠的防火