建立两个位于NAT后面的计算机之间的连接

2024-04-27 15:14:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在NAT后面的两台计算机之间建立连接。我不能打开任何港口。我想使用一个经纪人谁将在互联网上,谁将能够与其他2人通信。在那之后,我想在这两个人之间建立一条隧道。我正在使用Python并试图编写这个代理程序。 我怎么开始呢?在


Tags: 程序代理计算机经纪人互联网nat隧道港口
1条回答
网友
1楼 · 发布于 2024-04-27 15:14:00

您希望可以并且几乎是常规的(至少对于UDP)。这叫做打孔。它不会适用于世界上的每一个NAT,但它适用于许多NAT,包括大多数当前家庭路由器的大多数设置。在

基本思想是,在大多数路由器中,如果你发送一个传出的包,它将把来自同一个端点的任何传入包转发给你。否则,NAT根本不起作用,对吧?所以,如果你和我都试图在同一时间通过对方的公共地址通话,我们中的一个就会在他的NAT上“打了一个洞”来接收消息。另一个可能会错过最初的信息,因为他打洞太晚了,但他会收到另一个人发送的下一个回复,然后,一切都正常了。在

不过,这里有一些技巧。在

首先,你需要知道你的公共广播。所有你能直接看到的是你在NAT内部的私人地址,所以你需要一个NAT之外的服务器来告诉你你来自哪里。有一个标准,叫做STUN。不仅有多个免费的实现,你可以自己构建和运行,还有多个开放的STUN服务器在互联网上;谷歌更新列表。在

至少,你有一个私人地址和一个公共地址,你真的想把它们全部都给另一个人,而不是一个。(如果你只给我你的公共地址,结果发现我们在同一个NAT上,我们可能无法互相交谈。)如果你有多个NIC,或者你在一个有多层NAT的公司局域网上,情况会变得更复杂,但是如果你给我一大堆地址,我怎么知道该用哪一个呢?很简单,我可以试着从我的每个本地地址连接到每个地址,第一个有效的就是我一直使用的那个地址。显然,我们需要某种协议,这样你就可以告诉我其中一个是否有效,但也可以非常简单。在

另外,请注意,当我在这里说“address”时,它不仅仅是指IP地址,而是指IP address加上port。毕竟,NAT可以而且确实可以转换端口和地址,而且您在NAT中打出来的“洞”通常是特定于端口的。因此,您需要使用与实际通信相同的源端口和目标端口进行协商。(实际上,这里有一些棘手的地方,可以通过链接的文档来解释,但现在让我们先浏览一下。)

当打孔不起作用,并且需要退回到通过服务器进行代理时,您不希望代码看起来完全不同;您将不得不将所有代码编写两次,并在调试方面遇到巨大的问题。幸运的是,有一个标准的解决方案,称为TURN,它使对等方看起来就像他们实际上在直接交谈,即使是通过中继。同样,也有免费的实现,但是当然没有openturn服务器供您使用(因为这会占用大量带宽)。在

同时,一旦你知道你的公共广播,你必须告诉我它是什么,反之亦然。很明显,我们需要一些旁听频道,比如一个特别的“介绍人”或“大厅”服务器。通常,您将生成对等连接,作为某个服务器中介连接的分支。例如,我们可能在一个IRC频道,或者一个XMPP/Jabber聊天网络,然后决定我们想要一个点对点的通信(以避免窃听,或者共享巨大的电子表格文件,或者玩一个没有巨大延迟的游戏)。在

有一个称为ICE的标准将所有这些联系在一起;只要我们有一个共享的侧通道和一个STUN(可能还有TURN)服务器的列表,ICE就允许我们协商对等连接(如果没有的话,则返回TURN)。在

ICE支持是SIP和许多其他协议的一部分,所以如果您使用这些协议的库,您可能需要d来找出如何给它一个晕眩和翻转服务器的列表,就这样。如果不是的话,可能有图书馆可以用来做冰。如果没有的话,肯定有一些库可以用来完成眩晕和转身(如果没有,它们都是非常简单的协议),所以你可以自己在它们上面进行协商。在

当然,您不必使用这些标准中的任何一个,但您应该明确地阅读它们的作用以及它们为什么这样做。(另外,请记住,现在人们正在专门为使ICE工作得更好而制造路由器,而你发明的任何不同的东西都不会是这样。)


我之所以链接到维基百科上面的文章,是因为它们一开始就简单地概述了这些技术的工作原理和背后的原理。对于详细的参考规范、开始使用的示例代码、要使用的库等,都有更好的来源,但是通常Wikipedia有指向您所需的所有其他内容的链接。在

相关问题 更多 >