使用NAT穿越以被动方式连接用户

本文是对其中一篇文章的免费翻译 DC++ 开发者博客.

经作者许可(以及为了清晰和兴趣),我用链接对其进行了着色,并补充了一些个人研究。

介绍

此时,连接对中至少有一个用户必须处于活动模式。 当任何一方都没有配置主动模式时,NAT 穿越机制将很有用。 这通常是由于防火墙或 NAT 设备阻止传入连接造成的。

如果两个客户端都处于活动模式

发起客户端发送包含自己的 IP 地址和端口的命令 $连接到我 给另一个客户。 使用此数据,接收命令的客户端与发起者建立连接。

如果其中一个客户端处于被动模式

通过集线器,被动客户端 A 发送命令 $RevConnectToMe 活跃客户 B然后用命令 $ConnectToMe 进行响应。

使用NAT穿越以被动方式连接用户
作为服务器 S 在上面的情况下有一个直流集线器

如果两个客户端都处于被动模式 ADC 中心

不同 NAT 后面的客户端 A и B 加入了枢纽 S.

使用NAT穿越以被动方式连接用户
这是从客户端看与集线器的连接的样子 A

集线器接受端口 1511 上的连接。 客户端 A 通过端口 50758 从其专用网络建立传出连接。集线器反过来查看 NAT 设备的地址,与其协作并根据客户端的标识符将其广播到客户端。

客户 A 发送到服务器 S 请求帮助与客户建立联系的消息 B.

Hub: [Outgoing][178.79.159.147:1511] DRCM AAAA BBBB ADCS/0.10 1649612991

同样在被动模式下,客户端 B收到此命令后,必须报告其用于通过 NAT 连接到集线器的专用端口。

Hub: [Incoming][178.79.159.147:1511] DNAT BBBB AAAA ADCS/0.10 59566 1649612991

客户收到此信息后 A 立即尝试与客户端建立连接 B 并报告其自己的私有端口。

Hub:		[Outgoing][178.79.159.147:1511]	 	D<b>RNT</b> AAAA BBBB ADCS/0.10 <b>50758</b> 1649612991

有什么兴趣? 兴趣在于通过已使用的专用端口创建到公共地址的新连接来转移同一连接的端点。

使用NAT穿越以被动方式连接用户
宾果!

当然,本例中客户端NAT B 完全有权拒绝客户端的第一个连接请求 A,但是他自己的请求冲进了这个连接所创建的“洞”中,并且连接建立了。

使用NAT穿越以被动方式连接用户
适用于整个过程的插图,但需要注意的是 协议 不使用会话打开的公共端口 NATS,以及私人地址。

结语

在撰写(原始)文章时,大约一半的 DC 客户端正在被动模式下工作。 这意味着所有可能的连接中有四分之一无法建立。

在未来 DC++将能够绕过NAT使用现有连接 AS и BS 建立直接的客户端-客户端连接,即使 A и B 均处于被动模式。

来源: habr.com

添加评论