AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1030236
Accepted
caveman
caveman
Asked: 2020-08-16 04:13:40 +0800 CST2020-08-16 04:13:40 +0800 CST 2020-08-16 04:13:40 +0800 CST

iptable 的 conntrack 模块何时跟踪数据包的状态?

  • 772

它首先需要存储状态。我使用的一些旧的BSD防火墙,我猜它被命名为IPFW,我曾经放置一条规则,即“跟踪离开数据包的状态”,并将其放置在接口的出站方向上。然后,另一个关于入站方向的规则将它们与由出站方向规则创建的状态进行检查。所以曾经有两条规则:(1)填充状态表,这是出站方向,(2)查找状态表,这是入站方向。

但是使用 connntrack,我看到它应用在 INPUT 链上,比如这条规则:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

这让我想知道,该声明实际上在做什么?

  • 是不是说它将通过将信息放入状态表中来开始跟踪匹配该规则的数据包?
  • 还是说它已经拥有状态信息,并且将根据它对入站消息采取行动?(例如,如果它们属于先前接受的连接,则接受?)。但是,在这种情况下,states 表是在哪里填充的?是哪个规则?或者它是无规则的和隐含的?
linux iptables conntrack
  • 2 2 个回答
  • 7665 Views

2 个回答

  • Voted
  1. Best Answer
    A.B
    2020-08-16T06:43:55+08:002020-08-16T06:43:55+08:00

    Netfilter 和 conntrack 的介绍性介绍

    首先是关于 Netfilter 和通用网络中的数据包流的强制性示意图:

    Netfilter 和通用网络中的数据包流

    Netfilter 是数据包过滤框架,将自身插入到网络堆栈的其余部分(由“路由决策”和其他白色圆边框部分表示)。Netfilter 为其他子系统和“客户端”提供挂钩和 API。这些部分包括conntrack(连接跟踪器)和iptables(或nftables)。Netfilter 和conntrack之间的分离是相当模糊的。您可以将conntrack视为 Netfilter 的一个集成部分。

    在描述数据包遍历的各个步骤的示意图中,您可以看到在某个点(在 raw/PREROUTING 和 mangle/PREROUTING 之间,或在 raw/OUTPUT 和 mangle/OUTPUT 之间),数据包会遍历conntrack。

    此时,conntrack将在它自己的查找表(一个保存在内核内存中的小型查找数据库)中进行搜索:

    • 如果未找到此数据包的特征(并且如果未在原始表中声明为 UNTRACKED),则新的 conntrack 双向元组条目(协议,然后是特定的系列和协议信息:初始源和端口,初始目标和端口,回复源和端口,回复目标和端口(最后这两个通常是相反的,除非涉及 NAT 或一些奇怪的协议,例如用于 ICMP 的回显回复匹配回显请求))描述流的创建状态为 NEW。
    • 如果它匹配(在任何方向上)先前的条目并且与此流的状态兼容,则流状态可能会改变(例如:如果以前不是这种情况,则从 NEW 更改为 ESTABLISHED)。
    • 如果由于某些特定原因,尽管数据包具有其特征(例如:在已成功启动重传后接收到的延迟 TCP 数据包,因此在序列和 SACK 值方面超出窗口),但该数据包仍无法匹配现有流,则数据包将被标记为无效。
    • 还有一些其他情况,例如 RELATED:这是关于数据包不是流本身的一部分,而是与可以与其他现有(即:在数据库中)流相关联的新流相关。两个示例是接收数据包时产生的 ICMP 错误(例如:UDP 端口不可达),或者当一个特殊的协议助手(如内核模块nf_conntrack_ftp)(它是conntrack子系统的插件)检测到数据包是关联的单独数据流的一部分时使用 FTP 命令 PASV/EPSV 或 PORT/EPRT 在命令流(端口 21)上完成。

    解决问题

    说了这么多,这里是你的两个子弹的答案:

    • 在主网络命名空间中,一旦加载其模块(包括可能的相关协议特定子模块),conntrack就会开始跟踪连接。对于非初始网络命名空间(容器...),这还需要一些其他子系统引用它(例如 OP 的iptables的 conntrack 模块或使用一次conntrack稍后描述的命令)。这是默认设置,必须在conntrack之前将数据包专门标记为 UNTRACKED子系统看到它,因为这个数据包不被跟踪。在 Linux 上,只有少数情况不需要跟踪,但是当然状态防火墙和状态/动态 NAT 将不再可用(甚至可能首先需要使用 UNTRACKED 的无形 NAT,仍然可以完成,但不能使用iptables . tc或nftables可以)。为了避免conntrack处理某些数据包,可以使用这种iptables规则(例如:端口 80/tcp):

      iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack
      iptables -t raw -A OUTPUT -p tcp --sport 80 -j CT --notrack
      
    • 当数据包遍历过滤器/输入并达到此规则时:

       iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
      

      iptables的特定内核模块xt_conntrack查询conntrack子系统(由各种相关内核模块处理nf_conntrack*)并在其查找数据库中询问此数据包的状态。如果答案是RELATED或ESTABLISHED数据包匹配并继续接受裁决。实际上,在第一次完成查找(通常通过conntrack )时,结果已经缓存在数据包中,所以这是一个廉价的“查找”。因此,这是处理之前已经接受的流的通用规则。这些流程最初可以在明确提及的规则中被接受,或者只是在没有提及但放在之后的规则中被接受-m conntrack --ctstate NEW这个通用规则(但请记住 INVALID 状态,通常应该在这样做之前将其删除)。

    • 添加一个项目符号:传入数据包和传出数据包的处理在 PREROUTING 和 OUTPUT 之间非常对称(即使它们看起来并不对称):在 PREROUTING 和 OUTPUT 中的conntrack接口(以及在其他一些地方,考虑到NAT是使用conntrack,除了它的第一个数据包在状态 NEW 遍历iptables的 nat 表)。这可能与您写的有关 IPFW 的描述略有不同。如果运行应用程序的服务器也限制传出流量,那么它很可能需要在 filter/OUTPUT 和 filter/INPUT 中都使用相同的通用iptables规则,以允许已接受传入流量的传出回复数据包通过。


    附加信息

    有专门的工具可以与来自conntrack-tools的conntrack子系统的查找表进行交互。

    • conntrack:查询、删除或更新由conntrack处理的查找表的内容。

      一些例子。

      您可以使用以下命令列出所有跟踪的条目(如果没有额外的过滤器,它们可能很大):

      conntrack -L
      

      如果您的系统正在执行 NAT(例如,私有 LAN 前的路由器,或运行虚拟机和容器),您可以使用--any-nat,--src-nat或--dst-nat仅显示 resp。所有 NAT、所有源 NAT(伪装)或所有目标 NAT(通常用于转发端口):

      实时监控conntrack事件:

      conntrack -E
      
    • conntrackd:一个守护进程,它的两个主要目的是(conntrack)流记帐和统计,或高可用性状态防火墙集群状态同步。

    • 9
  2. Tero Kilkanen
    2020-08-16T05:46:16+08:002020-08-16T05:46:16+08:00

    连接跟踪是 Netfilter 的一个单独功能,它没有配置 IPTables。

    在此处输入图像描述

    图中,INPUT 路径有两个conntrack步骤,OUTPUT 路径有一个步骤。这些步骤将单个数据包与连接跟踪表中跟踪的现有连接相关联,或在表中创建新的连接跟踪条目。

    Conntrack 功能是一个 Linux 内核模块,通常在默认配置中包含在内核中。

    可以通过调整net.netfilter.nf_conntracksysctl 值来调整 Conntrack 操作。

    你的第二个选择是发生了什么。状态信息由 Conntrack 函数记录,IPTables 规则简单地查阅 Conntrack 表获取信息。

    • 2

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve