UDP打孔主机特定故障



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

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

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

  • 如果服务器再次使用entropy,客户端在bonn、entropy和我的PC上运行,则所有客户端之间的穿孔连接都可以正常工作。

这是令人困惑的,因为服务器没有参与对等数据流。如果你仍然和我在一起,下面是流程:

  • 客户端-A通过TCP链路连接到服务器,并获得唯一的令牌
  • 客户端-B通过TCP链路连接到服务器并获得唯一的令牌;

  • 客户端-A和客户端-B通过它们的TCP链路接收更新,告诉它们还有谁被连接;

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

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

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

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

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

正如您所看到的,服务器从不在客户端为其请求创建的UDP链路上进行通信,只在TCP链路上进行。

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

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

还要注意的是,在编写程序之前,我尝试使用一个名为"NatCheck"的公共应用程序。这也以类似的方式失败了,尽管我没有对其进行太多研究——它需要三个公共主机,而我将其修改为只使用我的两个。当它失败时,我认为我在某种程度上搞砸了,于是放弃了这个应用程序。

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

我不能完全理解这一切,但听起来你想使用一个中间服务器来发现客户端A和B的源UDP端口,这样A和B就可以同时向对方发送UDP数据报,从而打开NAT规则,并(最终)允许流量通过。

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

NAT可能会更改端口号的原因有很多,而具有安全意识的NAT会随机化,只是为了防止你试图做的事情。因此,虽然有时你可以让双重穿孔(NAT到NAT)工作,但你不能每次都这样做。

总之,当服务器在同一台主机上时,客户端不会在特定的主机上工作。对此行为原因的任何建议

服务器是否认为客户端a位于127.0.0.1(或者可能是不可路由的LAN地址?)而不是其公共IP地址?

如果客户端B试图使用错误的地址联系客户端A,那么UDP数据报无法到达预期收件人的原因就很明显了。

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

来自服务器(AKA客户端a)和客户端B的tcpdump的一些输出会有很大帮助。您可能希望使用-i any,也可能使用-s 0

the client doesn't work on a particular host when the server is on the same host

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

最新更新