2013-11-09 48 views
5

我正在开发一款能够在DSL两种不同NAT上正常工作的p2p聊天应用程序,但是当涉及到3G USB互联网连接时,它会失败。为什么3G网络NAT不能被绕过?

我发现它不可能绕过3g网络的NAT,而像Skype和山洪这样的已知P2P应用程序也无法绕过3G网络,只要遇到这些问题,就通过中央服务器发送数据。

我想知道什么是3G网络的体系结构。我听说他们没有专用IP,端口对只有公共IP,端口可用,并且一个公共端口可以分配给很多设备,我是否正确?如果是的话服务器如何发送数据到3G网络?

回答

0

维基百科claims电信级NAT 可以通过P2P应用被遍历,即使在端口共享存在:

上述技术一个CGN内正常工作。 CGN也可以使用端口过载行为,这意味着可以将具有相同端口值的不同内部端点映射到同一个公共端点 。这并不会破坏5协议,公共地址,公共端口,远程地址,远程端口的唯一性,因此是可以接受的。保留TCP端口也会导致案例 CGN端口过载,并且不是协议 健全性的问题。用于TCP的端口过载允许CGN在内部安装更多主机 ,同时保留TCP端对端通信保证。

但是,未引用该段落的参考文献。

+0

是的,他们是!看看我的答案!我在维基百科页面上回答了两个参考文献! – 2015-08-14 22:28:50

+0

没关系。早稻田大学的技术可能适用于一些规模较小的对称路由器(我自己并没有见过很多),但是我自己实现了它,它不适用于3/4G网络。 – 2015-09-24 23:34:23

0

这是可能的,你就不能准确地猜到端口号。你可能会有点失败,无法建立连接。对于可以在对称和大规模NAT工作更鲁棒的打孔方法,尝试这些方法之一:

  1. http://tools.ietf.org/id/draft-takeda-symmetric-nat-traversal-00.txt

  2. https://www.goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf

  3. http://journals.sfu.ca/apan/index.php/apan/article/view/75/pdf_31

  4. https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view

+0

这不适用于真正的4G LTE路由器。 – 2015-09-26 06:56:28

1

为什么3G网络NAT不能被绕过?

归结为统计。为了建立连接,您必须将数据包发送到他们所在的端口,并且必须将数据包发送到您所在的端口。如果发送到错误的端口号或者发送到错误的端口号,则会错过并且没有建立连接。如果你们两个同时绑定到一个端口并发送一个指向另一个ip地址的数据包,那么你有65535中的1(65535是ip地址上的端口数)发送数据包到端口的机会, 65535中大约有1个将数据包发送到您的端口的机会。所以你建立连接的机会是(1/65535)*(1/65535)或(1/65535^2)。

因为对于每个新的出站连接,路由器会随机为您提供一个1024到65535间隔的新端口号,因此无法知道您的端口号。因此,如果您询问服务器您的ip和端口号是,它可能会告诉你正确的IP(你的IP地址不会经常改变,除非你关掉你的手机或类似的东西),但端口号会改变。如果您尝试猜测端口号,则会出现((65535-1024-1)/(65535-1024))或99.998%的更改,您认为它错了,假设可以选择的端口号的数量是( 65535-1024)。因此,除非端口号码是可预测的(在很多4G网络中它们不是),否则你就没有机会了。

+0

许多运营商正在执行双NAT。他们有一个靠近塔的“本地”NAT,以及运营商网络内部的运营商级NAT。越来越难获得可用的IPv4地址,并且ARIN在今天早些时候完全用完了可用的IPv4地址以分配给运营商。 –

+0

我想我知道你的意思。在我的T-Mobile网络上,前四个跳都以“10”开头。那些是靠近塔的“本地”NAT。然后接下来的四跳都以“4”开始。那些是非本地的,但在同一ISP下。之后,出现分歧,其中绑定到不同公有IP地址的数据包采用不同的路径,并且不共享公共前缀。 – 2015-09-26 06:53:20

+0

很好解释。 ! –

2

我在开发多代理系统的中间件,我们最近必须为4G/3G网络上的p2p使用创建一个基于UDP的传输选项。我们已经在T Mobile的数据计划以及NAT背后的各种学术网络上对此进行了测试,对于目前的实施我感到非常自信。由于这里似乎没有解决这个问题的可靠解决方案,所以我想通过REGISTRY_CLIENT传输选项来分享我们目前在MADARA中间件(http://madara.sourceforge.net/)中实现的解决方案类型。

对于我们,我们选择了您可能称之为P2P端点的注册服务器或名称服务(如果您熟悉CORBA)。注册表服务器需要运行在UDP可以通过单向消息访问的公共ip:端口上。对于我们的测试,我们租用了Amazon EC2节点,并确保防火墙设置允许UDP流量通过我们要绑定的UDP端口。在服务器端(注册服务器的公共IP:端口配对),我们绑定到端口并等待客户端注册。任何想要与其他人交谈的P2P客户端向注册服务器发送注册表消息

P2P client ----> [register message] ---> Registry Server 

注册消息可以具有任何任意内容。我们的实际上除了来自正常数据协议的消息头以外没有内容。在服务器端,我们通过正常的套接字recv调用来检查注册消息发送者(P2P客户端到左上方)的远程主机。这个远程主机应该是通过保护P2P客户端的防火墙的端点信息。

为了理解这里发生了什么,我们必须看看消息如何被路由到P2P客户端到我们的公共注册服务器。以下ASCII图显示了从P2P客户端到我们的EC2服务器的路径中套接字可能看到的远程信息(即示例防火墙映射)。这只显示一个防火墙,但它应该与P2P客户端和注册服务器之间的多个NAT一起工作,只要当流量通过该特定NAT的指定ip:端口时,NAT保持公共ip:端口打开。现在

P2P client ----> [message from 192.168.1.10:35000] ---> Firewall ---> [message from 111.111.50.34:5627] --> Registry Server 

,如果我们试图从我们的注册服务器发送消息给192.168.1.10:35000,它会失败(或至少,它几乎肯定会去错了地方)。同样,您可以看到4G防火墙也将端口从35000更改为5627.要将消息发送回P2P客户端,您需要做两件事:1)通过111.111.50.34:5627发送返回消息比我们最初绑定到P2P客户端的任何ip:端口信息,以及2)确保P2P客户端或注册服务器经常将数据重新发送给对方 - 每秒一次对于我们永久绑定到公共ip:端口111.111.50.34:5627,在我们的例子中。

作为我们协议的一部分,我们不只是发送一个无用的数据包回注册的P2P客户端。我们发送该客户端的组/集团/域/任何P2P客户端的所有相关公共ip:端口配对。基本上,我们发送P2P客户端发现信息,用于注册表服务器知道的与P2P客户端相关的所有内容。

例如,假设两个P2P客户端通过111.111.50.34:5627和111.111.37.24:15234 ip:port通过4G提供商的防火墙发送消息给注册服务器。一种新的P2P客户端从111.111.70.105:7000连接的,我们在一个简单的回应上市背部与其他两个终点:

[Registry Response for P2P Client #3] 
111.111.50.34:5627 
111.111.37.24:15234 

现在,在P2P客户端#3月底,你把这个列表和使用它作为您的P2P应用程序的潜在端点。这些是你的P2P同行。您可以通过您注册的相同套接字创建UDP数据包,只要它们不在保守防火墙之后(例如手机上的移动连接热点,根据我的经验,传统上它被设计为阻止短暂端口上的所有入站UDP流量绑定,没有配置设置可用于启用端口转发),流量应该能够双向流动。

如前所述,为了保持P2P UDP连接的有效性,您基本上只需要定期向/从此端点重新发送数据,以使公用ip:端口绑定在保护P2P客户端的每个防火墙上保持活动和活动状态。这可以通过定期向公共注册服务器重新发送注册信息和/或从其他P2P客户端接收UDP数据包到4G防火墙已分配给您的P2P客户端的公共ip:端口来完成。