干翻 nio ,王炸 io_uring 来了 ,史上最详细说明及最全图解!!

Image
大趋势:全链路异步化,性能提升10倍+ 随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多。 在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构总体上是 全链路同步模式 。 全链路同步模式 不仅造成了资源的极大浪费,并且在流量发生激增波动的时候,受制于系统资源而无法快速的扩容。 全球后疫情时代,降本增效是大背景。如何降本增效?一条好的路径: 全链路同步模式  ,升级为  全链路异步模式 。 全链路异步模式 改造 具体的内容,请参考尼恩的深度文章: 全链路异步,让你的 SpringCloud 性能优化10倍+ 先回顾一下全链路同步模式架构图 全链路同步模式  ,如何升级为  全链路异步模式 , 就是一个一个 环节的异步化。 40岁老架构师尼恩,持续深化自己的3高架构知识宇宙,当然首先要去完成一次牛逼的 全链路异步模式 微服务实操,下面是尼恩的实操过程、效果、压测数据(性能足足提升10倍多)。 全链路异步模式 改造 具体的内容,请参考尼恩的深度文章: 全链路异步,让你的 SpringCloud 性能优化10倍+ 并且,上面的文章,作为尼恩 全链路异步的架构知识,收录在《 尼恩Java面试宝典 》V52版的架构专题中 注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从这里获取: 语雀 或者 码云 全链路异步化的最终目标 全链路异步化的最终目标,如下图所示: 应用层:编程模型的异步化 框架层:IO线程的异步化 OS层:IO模型的异步化 一:应用层:编程模型的异步化 这个请大家去看 尼恩的 《 响应式 圣经 PDF 》电子书 随着 云原生时代的到来, 底层的 组件编程 越来越 响应式、流化, 从命令式 编程转换到 响应式 编程,在非常多的场景 ,是大势所趋。 而响应式编程, 学习曲线很大, 大家需要多看,多实操。 二:框架层:IO线程的异步化 这个大家 都选择 具有异步 回调功能的 异步线程模型,如 Reactor 线程模型 这个是面试的绝对重点 IO的王者组件,Netty框架,整体就是一个 Reactor 线程模型 实现 也是非常核心的知识,这里不做展开,请大家去看尼恩的畅销书《Java 高并发核心编程卷 1 加强版》。 三:OS层:IO模型的异步化 目前的一个最大难题,是IO模型的异步化。 注意,Netty

NAT-PT - 原理


操作

NAT-PT的工作原理是捕获,转换和发送从IPv6到IPv4网络的数据包(反之亦然)。输出数据包的目标 IPv4 地址由接收的 IPv6 数据包中目标的最后四个字节确定。请看下图。PC1 上的一个用户,一个内部纯 IPv6 主机打开一个 Internet 浏览器,然后转到 www.google.com。他的计算机首先对其 DNS 服务器执行查询。

NAT-PT 捕获数据包,并在 PC1 的 IPv6 地址与其池中的某个 IPv4 地址之间创建新的绑定,并转换数据包。NAT-PT 看到 DNS 查询并将 AAAA 请求转换为 A 请求。最后,它为新创建的 IPv4 数据包找到路由,并将其排队到相应的出站接口。

DNS 服务器接收查询并发送答复。

NAT-PT 捕获流量并查找映射的 IPv6 地址。它还会查看 DNS A 资源记录并将其转换为 AAAA 记录。它通过添加一个特殊的“NAT-PT前缀”(通过“naptd-confmaker”配置,默认值为2000:ffff::)到 IPv4 地址的开头。最后,它为新创建的 IPv6 数据包找到路由,并将其排队到相应的出站接口。

从这里,PC1 启动与 www.google.com 的连接。

NAT-PT捕获数据包并在PC1的IPv6地址与其池中的IPv4地址之一之间创建新的绑定,转换数据包,查找路由,然后...等。

Google的Web服务器回复初始SYN数据包。

NAT-PT 捕获流量并查找映射的 IPv6 地址。最后,它为新创建的 IPv6 数据包找到路由,并将其排队到相应的出站接口。

以上总结了纯 IPv6 和纯 IPv4 主机如何通信的基础知识。连接的其余部分以相同的方式发生。NAT-PT 维护三个“转换”池,一个用于 TCP,一个用于 UDP,一个用于 ICMP。默认情况下,TCP 转换在捕获 RST 或 FIN 数据包后 5 分钟后或 24 小时不活动后超时。UDP 转换在 1 小时后过期,ICMP 在 30 秒后过期。

先决条件

NAT-PT 要求 iptable 和 ip6tables 都能正常工作。这是由于NAT-PT在用户空间中运行的事实引起的。这有两个重要的副作用:

1. TCP 重置。
在数据包从 IPv6 转换并使用出站接口的 IPv4 地址作为转换的全局 IPv4 地址发送到 IPv4 端后,内核不会将此连接记录为由路由器发起(尽管发送了包含路由器 IPv4 地址的数据包)。当从 IPv4 端收到回复并且路由器上没有运行防火墙时,内核在看到数据包的目的地是路由器后,查看其连接表中的连接表,以尝试查找此数据包所属的应用程序。在意识到没有这样的应用程序时,RFC定义的行为是向源主机发送TCP RST(重置)数据包。如果发生这种情况,远程 IPv4 服务器将断开连接,并且 in 和内部 IPv6 主机之间的所有通信都将中断。

2. 路由 无法访问/无效路由
IPv6 主机将 IPv4 世界视为单个虚拟 IPv6 网络。它是通过采用 NAT-PT 前缀(默认:2000:ffff::)并将每个主机的 IPv4 地址设置为最后 4 个八位字节。这个网络是纯粹的虚拟的,实际上并不存在。必须将发往此网络的所有流量路由到 NAT-PT 盒,后者反过来捕获该流量并执行必要的转换。我们路由到一个不存在的网络(请原谅我这个矛盾)的事实导致了一个小问题。当路由器执行路由但找不到到虚拟网络的路由时,它会尝试将 ICMP 目标无法访问(路由无法访问)数据包发送到发送主机。必须防止这种情况。如果路由器具有到任何 IPv6 目标的默认路由,则为我们的虚拟网络创建的数据包将发送到全局 IPv6 云。这不会中断我们的 NAT-PT 操作,但将目标不存在的数据包发送到全局 IPv6 云是非常不可取的,应尽可能加以阻止。

我们必须通过使用防火墙来弥补这些缺点。第一个问题可以通过使用 iptables 来纠正。如果您对所有传入的数据包都有默认的DROP策略,则应该没问题。您的 iptables 规则应具有类似于以下示例的内容。

-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j DROP

要解决第二个问题,我们必须使用ip6tables。我们可以过滤传出的ICMPv6目标无法访问的数据包,也可以过滤FORWARD链中虚拟IPv6网络的数据包。如果您的路由器没有 IPv6 数据包的默认路由,则应使用第一种机制。

ip6tables -A OUTPUT -p icmpv6 --icmpv6-type 1 -j DROP

如果您的网络确实连接到全局 IPv6 云,因此您的路由器具有默认的 IPv6 路径,则必须使用第二个选项。下面的示例使用默认 NAT-PT 前缀 (2000:ffff::),如果您使用的是非默认前缀,请调整示例以反映您的配置。

ip6tables -A FORWARD -d 2000:ffff:: -j DROP

配置详细信息

本节详细介绍了 NAT-PT 配置过程的每个步骤。NAT-PT转换器应使用NAT-PT守护程序本身附带的“naptd-confmaker”程序进行配置。默认情况下,naptd 将读取配置文件 /etc/naptd.conf,但可以使用 -c 参数提供备用配置文件。

naptd -c /usr/local/etc/naptd.conf

让我们看一下配置过程的步骤:

  1. 是否要创建新配置?[是/否]

  2. 这真的不需要太多的解释。如果您确实要创建新的配置文件,我们将继续,如果您不这样做,程序将终止。

  3. 是否希望将来自外部接口的 IPv4 地址自动用作 NAT 池的一部分?[是/否]

  4. 如果回答“否”,请跳过本文档中的下一个问题。如果回答“是”,则 NAT-PT 将在转换数据包时使用来自外部接口的 IPv4 地址。如果您有多个外部接口,这可能是不希望的,因为无法保证数据包转换后它将离开其携带的IP地址的接口。换句话说,转换机制独立于路由机制。在下面这样的情况下,这可能会导致问题。在99.9%的其他情况下,应该没有问题。

    如果您的网络拓扑与上述拓扑类似,您仍然可以使用全局 IPv4 云端外部接口的 IP 地址。您可以通过将其输入仅包含一个IP的IP池范围来执行此操作,下面将对此进行更详细的解释。


  5. 是否要将其他地址配置为 NAT 池的一部分?[年/年]

  6. 您已经要使用 NAT-PT 外部接口中的 IPv4 地址,但您仍然可以配置更多要使用的 IP 地址。

  7. 您需要创建一个公共 IPv4 地址池。输入池的起始 IP。

  8. 此时,您需要指定将用于转换的 IP 池。输入起始 IP,后跟返回和结束 IP(含)。如果此范围包含单个 IP,只需在要求输入结束 IP 时按 return 键即可。第二步是配置此池的端口范围。默认情况下,将使用的第一个端口将为 1500,最后一个端口为 65000。您只需按回车键或指定自己的值即可接受这些值。您可以根据需要创建任意数量的 IP 池,但请确保它们不重叠,因为 NAT-PT 不会检查这些池是否存在重叠。

  9. 是否要创建一个公共 IPv4 地址池,以允许将传入连接动态映射到适当的 IPv6 地址?[年/年]

  10. 回答“是”将允许您创建 NAT-PT 将用于动态入站连接映射的 IP 范围。您需要指定 IP 范围的起始和结束 IP 地址,并且可以根据需要自由创建任意数量的这些范围。这些范围不应重叠,因为 NAT-PT 不会检查任何重叠,只需接受您为其提供的值即可。详细了解动态入站连接

  11. 是否要创建公共 IPv4 地址的静态映射,以允许传入连接到达 IPv6 主机?[年/年]

  12. 如果回答“是”,您将能够在 IPv4 和 IPv6 地址之间创建静态映射。您需要先指定 IPv4 地址,然后指定 IPv6 地址。您可以根据需要创建任意数量的静态映射。详细了解静态入站映射

  13. 输入您希望 NAT-PT 侦听的第一个内部 (IPv6) 接口的名称。interface (eth0 eth1 sit0):

  14. NAT-PT 需要知道您希望将哪些接口指定为内部接口 (IPv6),哪些接口指定为外部接口 (IPv4)。配置制作工具将列出它在系统上找到的所有接口,不包括 lo。输入任何接口名称,但请确保在运行 NAT-PT 时存在或将存在此类接口,因为此处未执行错误检查。进入第一个界面后,您可以选择进入另一个界面。您可以根据需要输入任意数量的接口。

  15. 输入您希望 NAT-PT 侦听的第一个外部 (IPv4) 接口的名称。
  16. 在此项目中,您必须指定 NAT-PT 将使用的外部 (IPv4) 接口。此处的条件与指定内部 (IPv6) 接口的条件相同。您可以对 IPv4 和 IPv6 使用相同的接口,从而可以在只有一个网络接口的路由器上运行 NAT-PT。如果确实看到“单个 NIC 操作”部分。

  17. 输入 TCP 转换超时(以秒为单位) [86400]:

  18. 在这里,您可以设置 TCP 转换超时后不活动的秒数。默认值为 86400 秒(24 小时),但是每当 RST 或 FIN 数据包发生时,连接将在 5 分钟后超时。您只需点击 return 键即可接受默认值。

  19. 输入 UDP 转换超时(以秒为单位) [3600]:

  20. 在这里,您可以设置 UDP 转换超时后不活动的秒数。默认值为 3600 秒(1 小时)。您只需点击 return 键即可接受默认值。

  21. 输入 ICMP 转换超时(以秒为单位)[30]:

  22. 在这里,您可以设置 ICMP 转换超时后不活动的秒数。默认值为 30 秒。您只需点击 return 键即可接受默认值。

  23. 输入将用作应转换的目标的 IPv6 前缀。前缀 [2000:ffff::]:

  24. 在这里,您必须输入一个 IPv6 网络前缀,该前缀将指示必须转换的数据包。默认值应该适用于每个人,但为了安全起见,您可能希望使用IPv6块的一部分作为IPv6前缀。我更喜欢将块中的最后一个可用网络用于 NAT-PT 目的。如果你有一个像 2001:468:181:f100::/56 这样的块,这将是 2001:468:181:f1ff::。还要记住,如果您使用的是DNS代理totd,则应将其前缀调整为在此处设置的任何前缀。

  25. 请输入您当前使用的 DNS 服务器的 IPv4 地址。IPv4 DNS 服务器:

  26. 输入您当前正在使用的 DNS 服务器的 IPv4 地址,配置程序将返回您应使用的 IPv6 地址。这是根据 DNS 服务器的 NAT-PT 前缀和 IPv4 地址确定的新地址。这部分配置不是强制性的,但如果您计划使用 NAT-PT 的内置 DNS 转换器,则可以更轻松地计算 DNS 服务器的转换后的 IPv6 地址。您也可以使用以下脚本。

    前缀:
    IPv4 DNS 服务器:
    IPv6 DNS 服务器:

  27. 感谢您选择Ataga作为IPv4 / IPv6 NAT-PT解决方案。设置现已完成。键入“naptd”以启动 NAT-PT。

  28. 恭喜你,你完成了!

示例安装方案

让我们看一下可以使用 NAT-PT 的两个示例设置方案。首先,我们希望部署一个仅限IPv6的企业网络,我们希望利用IPSec来加密所有内部流量。您的大部分流量将被隔离在 v6 域中,但我们仍然需要为员工提供一种与世界其他地区进行通信的方式。

在上面,我们有两个仅限IPv6的网络,一个双栈网络和两个路由器(一个运行双栈和NAT-PT,第二个仅运行IPv6)。此图中显示的 NAT-PT 计算机可以同时充当 IPv4 路由器、IPv6 路由器和 IPv4/IPv6 转换器。它在全局 IPv4 云和双栈网络之间执行 IPv4 路由。它在双栈网络和纯 IPv6 网络之间执行 IPv6 路由。最后,它在仅 IPv6 网络和 IPv4 全局云之间执行有状态的 IPv4/IPv6 转换。纯 IPv6 网络上的主机应使用 NAT-PT 的内置 DNS 转换器,而双栈主机可以继续使用其旧的 IPv4 DNS 服务器。

第二种情况有点复杂,可能更好地反映了当今复杂的网络环境。它显示了多个网络,其中一些是仅IPv4,一些仅IPv6和一些双栈。

在这种情况下,组织希望迁移到 IPv6,但仍需要能够与仅支持 IPv4 的世界的其余部分进行通信。此方案与上一个方案不同,因为在这种情况下,组织具有由其 ISP 提供的本机或隧道 IPv6 连接。在这种情况下,应使用 DNS 代理守护程序 totd。NAT-PT 计算机执行 IPv6 路由和 IPv4/IPv6 转换。如果内部仅支持 IPv6 的主机尝试与启用了 IPv6 的主机进行通信,则连接将通过 IPv6 路由,并且将通过 IPv6 中的 IPv4 隧道中的 IPv4 云进行通信。否则,如果远程主机仅使用 IPv4,则 NAT-PT 将转换连接。

安装方案应确定如何解析 DNS 查询。使用下表作为参考。

场景域名解析
双栈使用常规 DNS 服务器。如果远程主机具有 IPv6 地址,则将首选该地址,否则将使用 IPv4。
仅 IPv6 + 隧道/本机 IPv6 连接使用 DNS 代理守护程序 totd。如果远程主机具有 IPv6 地址,则将使用该地址,否则将使用 NAT-PT 前缀转换 IPv4 地址(请记住,NAT-PT 前缀和配置 totd 的前缀必须相同)。
仅支持 IPv6,不提供 IPv6 连接使用 NAT-PT 的内置 DNS 转换器。远程主机的地址将始终使用 NAT-PT 前缀进行转换。

内存使用情况

NAT-PT不会对路由器的内存造成任何重大压力。初始化后,它应该使用大约1.1 MB的共享内存。此数量将增加每个翻译的 48 个字节。创建 30,000 个翻译后,这会将内存使用量增加约 1.3 MB。内存使用的其他来源包括可用于转换的空闲 IP+端口对。每个都占用 8 个字节。例如,如果您的 NAT 池由每个 IP 254 个 IP 和 63500 个端口组成,则这很快就会变成大量内存。这总共将超过 123 MB 的内存。但是,NAT-PT 为每个传输层协议维护单独的可用 IP+ 端口对。这使内存使用量超过369 MB(123MB * 3协议;TCP, UDP, ICMP).但是,NAT-PT 使用一种动态机制,该机制仅在池耗尽时才分配 IP+ 端口对。通过这种方式,IP+端口对使用的内存非常小。

安全

在当今的计算机世界中,安全性是一个大问题。NAT-PT 通过在启动后不久删除根特权来降低大多数安全风险。保护 NAT-PT 实际上归结为保护它使用的配置文件,因为如果配置文件被篡改,则用于读取配置文件的当前机制可能会被利用(这将在将来的版本中更改)。配置文件应该只能由 root 用户读取,并且只能使用 naptd-confmaker 程序进行修改。如果远程攻击者修改了 NAT-PT 使用的配置文件,则他必须已经获得了 root 权限。当 NAT-PT 运行时,它需要对以下文件具有读取访问权限:

/proc/net/ipv6_route
/proc/net/route

如果您正在运行 SELinux,请确保 NAT-PT 可以读取它们。

可以尝试的一种 DOS 攻击情形是创建数千个半打开的 TCP 连接,以耗尽空闲的 IP+端口池。在这种情况下,攻击者必须位于其中一个内部 (IPv6) 网络上,才能使攻击可行。如果您遇到这种情况(检查NAT-PT的日志文件),您可以修改TCP转换超时。有关详细信息,请参阅配置详细信息

最后,还有在 NAT-PT 启动期间加载的应用程序级网关的情况。一种可能的情况是攻击者创建旨在使 NAT-PT 崩溃的 ALG,从而导致拒绝服务攻击。为了缓解这种攻击,NAT-PT 插件目录(/usr/lib/naptd/plugins)必须只能由 root 用户可读写。

高级功能

NAT-PT 采用许多高级功能,包括静态和动态入站映射以及单个 NIC 操作。您无需了解这些内容即可在简单的设置方案中使用 NAT-PT。但是,这些功能在特定情况下可能非常有用。

静态入站映射

在正常情况下,NAT-PT允许从网络内部(IPv6端)建立新连接。在这种情况下,源 IPv6 地址和端口将被转换并替换为 IP+端口对。根据您的网络拓扑,可能需要允许与某些内部主机建立远程连接。如果您正在运行公共 Web 或邮件服务器,则需要一种方法来允许远程主机连接到您的服务器。这可以使用静态入站映射来完成,这些映射可以使用naptd-confmaker进行配置。创建静态连接时,NAT-PT 将在公共 IPv4 地址和 IPv6 地址之间建立映射,并将在这些地址之间执行无状态转换。

使用静态映射时,主机之间的通信如下所示。

NAT-PT 查找静态映射并转换数据包。

服务器响应 TCP SYN 数据包。

NAT-PT 查找静态映射并转换数据包。

动态入站映射

使用静态入站映射的替代方法是使用动态入站映射。当您有大量服务器需要从仅 IPv4 客户端全局访问时,这可能特别有用。动态入站映射的工作方式是 NAT-PT 基于 DNS 信息创建入站映射。您可以使用 naptd-confmaker 首先创建一个 IPv4 地址范围,NAT-PT 将尝试在其上创建动态映射。然后,更新 DNS 信息,以便区域中的每个主机名都具有其 IPv6 地址和旧 IPv4 地址。

当仅支持 IPv4 的客户端尝试联系您的某个服务器时,NAT-PT 首先会查找给定目标 IPv4 地址的入站映射。如果找不到它,但目标 IPv4 地址属于动态入站映射范围,NAT-PT 将尝试使用 DNS 创建映射。此操作在以下步骤中发生。

第一个 NAT-PT 捕获目标属于动态入站映射范围的数据包。

NAT-PT 尝试对数据包的目标执行反向 DNS 解析。它由一个单独的线程处理,而所有其他数据包正在连续转换。

DNS 服务器使用目标的 FQDN 进行响应。

NAT-PT 在 FQDN 上执行 AAAA 查找。

DNS 服务器返回 AAAA 记录。

NAT-PT 在返回的 IPv6 地址和数据包的原始 IPv4 目标之间创建映射,然后转换数据包并将其发送到目的地。

单个网卡操作

为了使向IPv6的过渡更容易,NAT-PT被设计为在商用硬件上运行,并具有最低的系统要求。其功能之一是能够在只有一个网络接口卡 (NIC) 的系统上正确运行。要让 NAT-PT 使用单个 NIC,只需指定与 NAT 内部和外部相同的接口即可。只要您的计算机同时具有到 IPv4 和 IPv6 网络的路由,一切都应该可以正常工作。单个网卡设置如下所示。

应用程序级网关

在正常情况下,NAT-PT 仅限于转换 IP 标头和传输层标头。在某些情况下,这可能不足以确保完整的端到端透明通信,因为许多协议在其数据包的有效载荷中携带IP和端口信息,因此需要深度数据包检查和转换。NAT-PT通过使用基于插件的应用程序级网关(ALG)系统来实现此类功能,该系统扩展了其功能以合并深度数据包检查和转换。NAT-PT(v.0.4.2)的当前版本附带了两个这样的插件,旨在转换FTP和DNS协议。NAT-PT将在启动时打开/usr/lib/naptd/plugins,并尝试加载它在那里找到的任何ALG。将来,通过将新插件复制到插件目录并重新启动NAT-PT,将新插件添加到NAT-PT中。

文件传输协议

此 ALG 在检查和转换某些 FTP 响应代码和命令的基础上工作。它还跟踪和转换 TCP 序列号和确认编号,因为在跨越 IPv4/IPv6 边界时,数据包有效负载的大小会发生变化。将发生以下转换:

IPv4 端IPv6 端
150150
227229
泛美卫视每股收益

这是FTP插件的早期实现,可能无法在所有可能的情况下正常工作,它已被确认在大多数情况下有效。

域名系统

截至目前,DNS ALG 仅适用于 UDP DNS 连接。这将更改为将来包括基于 TCP 的 DNS 连接。此 ALG 通过规范和转换查询和资源记录 (RR) 来工作。它将 AAAA 请求转换为 A 请求,稍后将结果映射到 AAAA RR,并将查询类型转换回 AAAA。此 ALG 仍可能发生变化。


Comments

Popular posts from this blog

便宜好用又稳定的VPN-桔子云,性价比极高!

V2rayN 电脑客户端如何在 win7/win10/win11上 实现全局代理

IOS小火箭/Shadowsocks无需AppleID即可在线安装!