如何在 2 个 nat 后面执行 p2p?

Posted

技术标签:

【中文标题】如何在 2 个 nat 后面执行 p2p?【英文标题】:How to perform p2p behind 2 nats? 【发布时间】:2011-05-23 05:37:00 【问题描述】:

我正在尝试发送 'hello' 顺便说一句 2 个客户端,每个客户端都位于防火墙 NAT 后面,但没有成功。目前,UDP 或 TCP 打孔同样适用。

客户端 A 期望收到“hello p”:

set -- $( wget -qO- http://www.pschmidt.it/screenshooter/ss3.php | awk 'print $1, $2'); echo $1 $2 $3 $4; `nc -l -v $2 ` & sudo hping3 -2 -c 30 -s $2 -p $4 $3

客户端 B 发送 hello p:

set -- $( wget -qO- http://www.pschmidt.it/screenshooter/ss3.php | awk 'print $1, $2'); echo $1 $2 $3 $4; sudo hping3 -2 -c 30 -s $2 -p $4 $3; echo "hello p" | nc -p $2 -u $3 $4

很遗憾,什么都没收到。

受http://www.brynosaurus.com/pub/net/p2pnat/启发的实现

【问题讨论】:

【参考方案1】:

那么,两个 NAT 是否都是受限的锥形 NAT?当之前没有任何东西出现在请求源上时,他们是否拒绝端口访问?

您需要使用正确的地址和端口将数据包从一台主机发送到另一台主机,以便 NAT 接受传入的请求,即使它们是请求而不是响应。

举个例子:

PC1 - NAT1 - 网络 - NAT2 - PC2

PC1 想通过端口 10 访问 PC2。

PC2 使用源端口 10(被 NAT1 阻止)向 PC1 发送请求。 PC1 向 PC2 发送请求到端口 10,然后它不会被阻塞并会得到响应。

【讨论】:

> 那么,两个 NAT 是否都限制了锥形 NAT?我不确定如何对 NAT 进行分类,但与 Skype 和 P2P 应用程序一样,我希望它考虑最严格的。但在我的情况下,它似乎是一个受限制的锥体,因为外部 IP 不会改变,而只会改变端口。 所以你的意思是端口需要双向相同?我在您的描述中没有看到任何 Rendezvous Server。 他们要么必须知道彼此的端口,要么需要一个可访问的会合服务器(不在 NAT 后面)并为他们提供彼此的端口。在我的示例中,PC2 的端口 10 是已知的。这需要知道,PC2 需要在正确的时刻发送一个包。集合服务器将是最好、最简单的解决方案。用于同步和管理。 有效的示例代码/演示,请。文献解释说,在对称 NAT 之后,即使使用 STUN 也是不可能的,需要使用 TURN。尚未找到任何演示该概念的 TURN/ICE IM 代码。【参考方案2】:

您需要调查您正在处理的 NAT 类型。 “对称”术语已过时。您可以从 scribd 在线阅读 Practical JXTA II 书中的相应章节。

如果您的同行都没有公共地址,您在问题中描述的技术将永远无法工作。解决这个问题更加复杂,而且并非总是可行的。

【讨论】:

以上是关于如何在 2 个 nat 后面执行 p2p?的主要内容,如果未能解决你的问题,请参考以下文章

P2P技术详解:P2P中的NAT穿越(打洞)方案详解

P2P技术详解:P2P中的NAT穿越(打洞)方案详解

P2P技术详解:P2P中的NAT穿越(打洞)方案详解

通俗易懂:快速理解P2P技术中的NAT穿透原理

通俗易懂:快速理解P2P技术中的NAT穿透原理

通俗易懂:快速理解P2P技术中的NAT穿透原理