如何在不使用 STUN 的情况下将网络数据包从 ipv4 地址(带有端口转发)发送到 ipv6 地址(无端口转发)?

如何在不使用 STUN 的情况下将网络数据包从 ipv4 地址(带有端口转发)发送到 ipv6 地址(无端口转发)?

* 我有以下情况:*

Bob 希望直接与 Alice 交互(加密交互,没有中间服务器来转发他的数据包)。两者都位于 NAT 后面。Alice 有一个公共 ipv6 地址和一个 ipv4 地址(位于非对称 NAT 后面)。Bob 有一个带 ipv4 端口转发的 ipv4 地址,但 Alice 没有 ipv4 流量的端口转发。Bob 知道 Alice 的 ipv6 地址和她当前的 ipv4 地址,而 Alice 知道 Bob 的公共 ipv4 地址。Bob 希望直接与 Alice 发起网络通信,但 Alice 的私有 ipv4 地址在 NAT 后面无法访问。Bob 必须尝试从他的 ipv4 地址访问 Alice 的 ipv6 地址。Bob 如何联系 Alice?6to4 是解决方案吗?

* 背景信息:*

Alice 和 Bob 都在运行一个点对点应用程序(我正在开发中)。这个点对点应用程序在启动时会尝试打开 Alice 和 Bob 的 ipv4 端口。uPnP(通用即插即用)端口打开库适用于 Bob 的路由器及其 ipv4 互联网,但不适用于 Alice 的路由器及其双 ipv4/ipv6 互联网。这就是为什么 Bob 在运行应用程序时会打开他的 ipv4 端口,而 Alice 却不会。假设 STUN 和 TURN 不可用 - Bob 希望与 Alice 建立直接连接,而不使用中间服务器(STUN 或其他)来促进连接。Bob 将如何做到这一点(假设 Alice 和 Bob 都位于 NAT 之后,并且他们的 NAT 都不是对称 NAT)?

* 重大澄清 *

Bob 并不是真的从 ipv6 地址发送 ipv6 数据包。Alice 的互联网同时具有 ipv4 和 ipv6(Alice 可以访问启用/准备好 ipv6 的网站,如 Google,也可以访问仅提供 ipv4 的网站)。因此,如果 Alice 在 Google 中输入“我的 ip 是什么”,她会得到一个 ipv6 地址(试试看)。但如果她访问http://checkip.amazonaws.com(也试试这个 - 它没有启用 ipv6),她将只获得她的 ipv4 地址。我想知道 Bob 是否有可能将发往 Alice 的 ipv6 数据包与他的 ipv4 数据包(ipv6 over ipv4,或 6to4)一起包装,作为 NAT 穿越的一种方式。

* 我所说的“无中间人”是什么意思? *

我的意思是没有 TURN 转发或任何其他形式的转发,其中中介服务器接收发往 Alice 的数据包的副本并将该副本转发给 Alice。

* 如果 Alice 有一个 ipv4 地址,并且 Bob 和 Alice 知道彼此的 ipv4 地址,那么为什么 Bob 不直接将数据包从他的 ipv4 地址发送到 Alice 的 ipv4 地址?*

Bob 启用了端口转发,而 Alice 未启用端口转发。即使 Alice 正在等待私有端口 30000 上的连接,当 Bob 从其 ipv4 地址上的公用端口 30000 向 Alice 的 ipv4 地址上的公用端口 30000 发送数据包时,Alice 的 NAT 也不会让 Bob 的数据包通过。

答案1

无需中间人的要求可以有多种解释。而具体采用哪种解释确实会产生影响,因为某些解释与其他要求相结合会产生一组不可能实现的要求。

将为每个端点提供互联网连接的 ISP 视为不可信赖的第三方显然过于严格,无法实现通信。但即使我们将端点之间的 IPv4 路径上的路由器纳入我们可以依赖的基础设施中,由于其他要求,这仍然是不可能的:

  • 鲍勃想要发起连接。
  • Bob 只能发送 IPv4 数据包。
  • Bob 不知道要将数据包发送到哪个 IPv4 地址。

如果我们将无中间人的要求简单地解释为大部分流量不能通过第三方路由,但在连接设置中让第三方参与是可以接受的,那么这是可能的。

Bob 可以通过公共 IPv4 地址向第三方发送数据包,要求将消息发送到 Alice 的 IPv6 地址,要求 Alice 通过 IPv4 重新连接到 Bob。在任何旨在面向未来的新协议设计中,我只会使用端点之间的 IPv4 连接作为隧道传输 IPv6 数据包的手段,然后让所有更高层仅处理 IPv6。

哪些 IPv6 隧道协议可能适用

让我们考虑为 Bob 获取可用于批量传输的 IPv6 地址提供以下选项:6to4、6rd、6in4、native、Teredo、home grown。

由于 Bob 的 ISP 缺乏支持,因此立即排除了第 6 和本地的可能性。

除非 Alice 和 Bob 之间的直接路径上有一家 ISP 提供 Bob 可以使用的 6in4,否则无第三方的要求将排除 6in4。这种服务不太可能存在于直接路径上,如果确实存在,则需要 Bob 进行更多配置,那么我认为你会愿意这样做。

无需第三方也意味着 6to4 和 Teredo 存在潜在问题。

使用协议 41 的任何东西都很难通过 NAT。即使你可以让它通过 NAT,在大多数情况下它也只能支持 NAT 后面的单个用户。考虑到 Alice 甚至无法获得端口转发,我们几乎可以排除使用协议 41 端到端的可能性。因此 6in4 和 6to4 被认为是可能的端到端通信。

基于协议 41 的任何设置都需要您在配置它的端点上拥有管理员权限。这是反对 6in4、6rd 和 6to4 的另一个论点。基于 UDP 的隧道可以直接构建到应用程序中,因为 UDP 端口可以由非特权应用程序打开。

在 Bob 端使用 6to4,而在 Alice 端使用原生 IPv6,这意味着必须使用中继。由于我主张 Alice 无法发送协议 41 数据包,因此 Alice 必须依赖其他人操作的中继。如果运气好的话,Alice 的 ISP 有一个中继,但您不能依赖它。另一方面也好不到哪里去,因为 Bob 的 ISP 根本不支持 IPv6,他们也不太可能有任何中继。因此,在这种情况下,6to4 可能在两个方向上都存在问题。这就排除了 6to4。

我们从起始列表中剩下的是 Teredo 或自家服务器。如果 Bob 使用 Teredo,他的第一个数据包将被发送到 Bob 选择的 Teredo 服务器。由于 Bob 可以选择使用哪个 Teredo 服务器,因此使用第三方服务器不会有什么问题。如果第三方服务器不可靠,Bob 可以简单地切换到另一个。

但这只涵盖了 Bob 发给 Alice 的第一个数据包。返回路径有点问题。如果您仅依赖默认路由,那么来自 Alice 的返回流量将转到由 Alice 的 ISP 运营的 Teredo 中继,或者更可能是第三方中继。如果 Alice 的 ISP 部署了足够的 Teredo 中继来处理其客户的流量,并且他们关注中继的稳定性,那么 Teredo 在这种情况下将是可靠的。然而,这样的 ISP 很少见。

Alice 可以决定运行自己的中继。但是 Teredo 客户端(在 Bob 的计算机上运行)和 Teredo 中继(在 Alice 的计算机上运行)之间的连接通常是从客户端到中继打开的。这是方向,但对您来说并不适用。

Teredo 中存在一种已弃用的操作模式,在该模式下可以从中继到客户端以另一个方向打开连接。

这意味着您可以直接在软件中构建 Teredo 客户端,并在您描述的特定设置中让它在 Bob 的计算机上使用此弃用模式。在 Alice 端,您的软件在本机 IPv6 地址上运行,但同时您的软件必须检测使用此弃用 Teredo 模式的对等端,并在检测到时尝试使用直接构建到软件中的 Teredo 中继直接向对等端发送数据包。

需要注意的一点是,当 Bob 的第一个回显请求通过 Teredo 服务器发送给 Alice 时,它​​将由 Alice 计算机操作系统中的 IPv6 堆栈处理,而不是由您的应用程序处理。这意味着通过内置于您软件中的 Teredo 中继路由回复会很棘手。

如果您采用这种方法,我强烈建议您编写软件以支持通过内置 Teredo 代码或普通路由发送数据包。并定期探测两种发送数据包的方式,以便您始终使用两种方式中最可靠的一种。

有点讽刺的是,在我能想到的所有标准协议中,最适合您要求的协议恰好是 Teredo 的弃用版本。考虑到 Teredo 通常被认为是不可靠的,情况更是如此。话虽如此,我真的相信在您描述的确切情况下,它可以可靠地工作。

可能的本土解决方案

您可以选择 RFC 4193 地址空间的 /80 前缀在您的应用程序中使用,并使用 IPv6 地址的最后 16 位嵌入隧道端点的 IPv4 地址和端口号。

通过这种方法,Bob 会拥有一个 IPv6 地址,Alice 可以向该地址发送数据包。这种方法的问题是,在收到 Alice 发送的第一个 IPv6 数据包之前,Bob 无法向 Alice 发送 IPv6 数据包。

此外,由于是自主研发的,因此没有公共服务器可以将这些数据包从 Bob 转发给 Alice。因此,这种自主研发的方法与 Teredo 类似,只是基础设施不足的问题会更加严重。

基于此,我认为如果您想采用自主开发的解决方案,那么以 Teredo 为起点并尝试改进它而不是从头开始构建自主开发的解决方案更有可能获得良好的结果。

答案2

您所要求的如果没有中间人,就不可能实现。只有双方都拥有 IPv6 时,您才能使用 IPv6,并且您无法在没有端口转发的情况下接受 NAT 后面的传入连接。

相关内容