我现在确信,在没有第三方服务器的情况下,两个人之间直接进行“UDP 打洞”是非常困难的,有时甚至是不可能的(见在这里提问以及我的回答如下)。
那么,如何进行UDP打洞和第三方服务器?
例子:
peerA$ nc -u -p 7777 serverIP 8888
现在这个数据包被peerA的NAT从 转换localnetworkIP
为peerApublicIP
,源端口从7777转换为55123。
现在服务器看到这个数据包到达并记住了peerA的公共IP + 端口55123。它将这些信息(peerA的公共IP + 55123)提供给peerB,反之亦然(与之前描述的过程类似的发生在peerB上,服务器记住peerB的公共IP + 源已由peerB 的NAT 从8888 转换为42000 的端口)。
现在peerA可以做到这一点
peerA$ nc -u -p 7777 peerBpublicIP 8888 # will be dropped by peerB but at least it will
# punch a hole in peerA's firewall, port 55123
并且peerB知道,要连接peerA,他必须使用目标端口55123(此信息由服务器提供):
peerB$ nc -u -p 8888 peerApublicIP 55123
问题:这似乎在以下假设下有效:
如果
peerA$ nc -u -p 7777 serverIP 8888
将其源端口从 7777 转换为 55123,然后
peerA$ nc -u -p 7777 peerBpublicIP 8888
还将源端口 7777 转换为 55123。
但大多数路由器都是这样吗?
如果不是(例如:当连接到服务器时,NAT 将 7777 转换为 55123,但是当连接到对等体 B 时,NAT 将 7777 转换为 51098),那么 UDP 打洞是如何工作的?
长话短说:更一般地说,如何使用 just 进行 UDP 打洞netcat
,涉及对等点 A、对等点 B 和服务器(后者仅在开始时使用,而不是稍后使用)?
笔记: 我已经读过了本文,但是端口转换是否完成并不明显以同样的方式当连接服务器然后连接peerB时。