2

我编写了一个程序来建立对等链接。该程序可在http://basyl.co.uk/code/punch/doc/files/Readme-txt.html找到,它分为两部分:在公共主机上运行的服务器;以及由所需对等链路的每一端使用的客户端。

我可以访问两个公共服务器:“bonn”(home.contextshift.co.uk)和“entropy”(home2.contextshift.co.uk)

  • 如果服务器在 bonn 并且客户端在 bonn、entropy 和我的家用 PC(在 NAT 之后)上运行,则 entropy 的穿孔连接可以毫无问题地与我的 PC 通信。但是,从波恩到 PC 的连接失败;来自 PC 的数据到达波恩,但从波恩通过 NAT 孔返回的数据永远不会到达。

  • 如果服务器再次处于熵状态,则客户端在波恩、熵和我的 PC 上运行,所有客户端之间的穿孔连接都可以正常工作。

这是令人困惑的,因为服务器不参与对等数据流。如果你还和我在一起,这里是流程:

  • Client-A 通过 TCP 链接连接到 Server 并获得唯一的令牌;
  • Client-B 通过 TCP 链接连接到 Server 并获得唯一的令牌;

  • Client-A 和 Client-B 通过他们的 TCP 链路接收更新,告诉他们还有谁连接;

  • 客户端 A(或 B)通过新创建的 UDP 链接向服务器发送请求,传递其令牌和客户端 B 的名称;

  • 服务器从令牌中识别出Client-A,并通过其TCP链接将请求转发给Client-B,在请求中包括A的UDP地址/端口号;

  • 客户端 A(或 B)通过新创建的 UDP 链接向服务器发送确认,传递其令牌和客户端 A 的名称;

  • 服务器从令牌中识别出Client-B,并通过其TCP链接将请求转发给Client-A,在请求中包括B的UDP地址/端口号;

  • A 和 B 现在有了对方的 UDP 地址/端口,可以互相 ping 通并交换数据。

如您所见,服务器从不讨论客户端为他们的请求创建的 UDP 链接,只在 TCP 链接上进行对话。

因此,总而言之,当服务器位于同一主机上时,客户端无法在特定主机上工作。关于这种行为的原因或我可以进一步调查的方法有什么建议吗?

请注意,此测试是人为的,因为打孔的目的是在 NAT 后面的两个主机之间进行通信。这实际上是有效的,无论服务器在哪里,所以这个问题可能被认为是学术问题。

另请注意,在编写程序之前,我尝试使用名为“NatCheck”的公共应用程序。这也以类似的方式失败,尽管我没有对其进行太多调查 - 它需要三个公共主机,我修改它只使用我的两个。当它无法工作时,我认为我以某种方式搞砸了并丢弃了该应用程序。

对代码的任何评论也非常受欢迎(我可能会将其发布在代码审查网站上)。

4

3 回答 3

4

我不能完全遵循所有这些,但听起来您想使用中间服务器来发现客户端 A 和 B 的源 UDP 端口,以便 A 和 B 可以同时相互发送 UDP 数据报,从而打开 NAT 规则并且(最终)允许流量通过。

这就是问题所在:NAT 可以将源端口映射到它想要的任何东西。当 B 向服务器发送数据报时,不能保证服务器看到的源端口与 B 向 A 发送数据报时使用的源端口相同。

NAT 可能会更改端口号的原因有很多,并且有安全意识的人会随机化以防止您尝试执行的操作。因此,虽然您有时可以使双打孔(NAT 到 NAT)起作用,但您不能每次都这样做。

于 2012-03-07T22:59:00.103 回答
1

因此,总而言之,当服务器位于同一主机上时,客户端无法在特定主机上工作。有关此行为原因的任何建议

服务器是否将 clientA 视为位于 127.0.0.1(或者可能是不可路由的 LAN 地址?)而不是其公共 IP 地址?

如果 clientB 尝试使用错误的地址联系 clientA,很明显为什么 UDP 数据报没有到达预期的接收者。

或者我可以进一步调查的方法?

来自服务器(AKA clientA)和 clientB 的一些输出tcpdump会有很大帮助。您可能想使用-i any,也许-s 0.

于 2012-04-06T04:58:47.580 回答
0
the client doesn't work on a particular host when the server is on the same host

在某些极端情况下,NAT 只接受来自目标 IP 地址的流量:用于打孔的端口。由于它不是远程 NAT 对等方之一,因此它们会阻止来自它的流量。这可以解释你的问题。

于 2012-03-15T21:04:59.953 回答