30

我记得读过一篇关于建议的方法来做到这一点的文章。如果我没记错的话,研究人员通过相互发送 HTTP 数据包成功地创建了与另一个网络上的客户端的连接,而无需端口转发(Alice 假装 Bob 是 HTTP Web 服务器,而 Bob 假装 Alice 是 Web 服务器)。

我不确定这是否有意义,但有谁知道我在哪里可以找到这篇文章,或者有没有人有任何其他想法如何在没有中央服务器或端口转发的情况下将两个客户端连接在一起?

甚至可能吗?

编辑:我会知道两台计算机的 IP 和程序监听的端口。

4

2 回答 2

38

有可能的。我看到您的问题至少有两个部分。(它不会是 HTTP 数据包。它比这复杂得多。)

首先,我相信你可能在谈论一个叫做去中心化 P2P 网络的概念。分散的点对点网络背后的主要思想是这样一个事实,即在这样的网络中联合节点不需要中央服务器或服务器组。

您可能已经知道,大多数常见的集中式对等网络都需要这种集中式系统来交换和维护节点之间的互连。基本概念是这样的,新节点将连接到其中一个主服务器以检索有关网络上其他节点的信息,以保持其连接性和可用性。中央系统通过服务器不断同步网络状态、相关信息和彼此之间的中央协调来维护。

另一方面,去中心化网络没有任何结构或预定核心。这种对等模型也称为非结构化 P2P 网络。任何新节点都会从“父”节点复制或继承原始链接,并随着时间的推移形成自己的列表。这种非结构化网络的去中心化有几种类别。

有趣的是,没有中央指挥和控制系统使其成为现代恶意软件僵尸网络的首选解决方案。一个很好的例子是 Storm 僵尸网络,它采用了所谓的被动 P2P 监视器 (PPM)。无论受感染的主机是否位于防火墙或 NAT 之后,PPM 都能够定位受感染的主机并构建对等列表。维基百科的文章Storm botnet读起来很有趣。还有一项名为Towards Complete Node Enumeration in a Peer-to-Peer Botnet 的出色合作研究,它提供了 Storm 僵尸网络采用的出色概念分析和技术。

其次,您可能正在谈论 UDP 打孔。这是一种技术或算法,用于通过第三个集合服务器使用第三个注释主机来维护 NATed 路由器/网关后面的 2 个主机之间的连接。

Bryan Ford、Pyda Srisuresh 和 Dan Kegel 撰写了一篇很棒的论文,名为Peer-to-Peer Communication Across Network Address Translators

于 2013-06-04T04:37:31.250 回答
13

正如所回答的,点对点连接需要在两台(可能是)住宅计算机之间建立连接,这将需要在它们的两个防火墙上打孔。有关打孔的具体示例,请参阅pwnat:“在没有第三方的情况下通过防火墙/NAT 打孔的唯一工具”。简单地说,这个过程是这样的:

  1. “服务器”(不知道客户端的 IP 地址,但客户端知道服务器的 IP 地址)每 30 秒ping 一个非常特定的ICMP Echo Request数据包。1.2.3.4NAT 在转换过程中会记录此数据包,以防收到响应。
  2. 客户端向服务器发送一个ICMP Time Exceeded数据包,这是一种通常包含发送失败的数据包的数据包。客户端预先知道服务器发送到的确切数据包1.2.3.4,将整个数据包嵌入到数据字段中。
  3. NAT 识别 Echo Request 数据包并愉快地将整个Time Exceeded 数据包、源 IP 和所有内容转发给正确的用户,即服务器。瞧,现在服务器知道了客户端的 IP 和端口号。
  4. 既然服务器知道了地址,它就开始不断地向客户端发送 UDP 数据包,尽管客户端的 NAT 没有预料到它们,因此会忽略它们。
  5. 客户端开始向服务器发送 UDP 数据包,服务器的 NAT 会将其识别为对服务器数据包的响应并适当地路由它们。
  6. 现在客户端正在向服务器发送 UDP 数据包,服务器的 UDP 数据包流开始被客户端的 NAT 正确路由。

而且,在 6 个简单的步骤中,您已经在客户端和服务器之间建立了一个 UDP 连接,该连接穿透了两个住宅防火墙。拿那个,ISP!

于 2018-04-01T13:08:00.343 回答