双方都在端口受限(Port Restricted)NAT后如何打洞?

huangyouhang 2010-02-21 12:06:08
我测试过 端口受限nat后的客户机从端口5000向服务器10000端口发包,服务器端得到客户的端口为1512
同样客户机从5000向服务器端口10001发包,得到客户端口变为1513,因此无法像 地址受限锥形 一样通过服务器得到对方外网地址然后简单的同时向对方发包来打洞,因为向不同端口发包时,自己的外网端口会改变,但是网上的文章都说只要都是锥形nat后的客户端都可以打洞, 请问有没有做过 端口受限nat 打洞的可以指点一下打洞的原理。
...全文
2617 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtaxa 2012-06-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
请你确认一下端口受限NAT的概念,因为你主题中所说的情况是符合对称NAT的。也就是说你的测试环境是对称NAT
[/Quote]

你说得对,楼主弄错概念了,但是我的情况才是郁闷:
我用了VB 的winsock 控件用 UDP协议做了一个server和client,不成功啊。我先说说我的环境:
s在有公网固定IP,c1和c2分别为两地ADSL拨号后面的路由器后的电脑,
c1和c2不停(每5秒)向S发送心跳包,s记录它们的NAT后的外网IP和端口,并交换告知c2和c1,
现在C1欲发消息给C2,
C1向s发送请求打洞消息,s告诉c2要打洞,c2发送一个打洞包给c1 NAT后的外网IP和端口,c2告诉S已打洞,s告诉c1已打洞,C1发

送消息给c2,过程就是这样,如果超时就重发,重发次数设为的5,可是就是不成功,消息发不出去。

如果C1和c2都在路由后,则打洞不成功,我又测试了一下,如果其中一方做了DMZ(就是有了公网IP),打洞就会成功。不管C1还是

C2做了DMZ都会成功,这排除了路由器不支持锥形NAT的可能。比如C1有公网ip,c1要发消息给C2,c1通过S请求c2向c1打洞后,c1的

消息能正常发给c2,反过来也行。

于是,我又写了个小工具,跟踪调试它们的IP和端口信息,发现个有趣但又无赖的现象:
假如:
s的IP为 8.8.8.8 ,UDP localport 为 8888
c1的ip和端口为:192.168.1.11:1111
c2的ip和端口为:192.168.2.22:2222

c1和C2分别向S端口8888发送心跳包,S得到的:
c1的外网IP为 1.1.1.1 ,UDP localport 为 1111
c2的外网IP为 2.2.2.2 ,UDP localport 为 2222

现在C1欲发消息给c2,c1通过S告诉c2向c1打洞,那么c2还用这个winsock不改变LOCALPORT发送打洞包给1.1.1.1:1111,即:

2.2.2.2:2222(192.168.2.22:2222) --> 1.1.1.1:1111,此时,这个打洞包会被c1的路由器丢弃,根据地球人公布的打洞原理,

此时打洞已成功,C1可以向C2发送消息了,但是:
关键时刻来了:
此时如果c1向C2发送消息时(即:192.168.1.11:1111 --> 2.2.2.2:2222 ),路由器会重新给C1分配端口,即是:1.1.1.1:2342(假

设端口号会变成2342,不再是1111) -->2.2.2.2:2222 ,所以导致打洞失败。但是过一会(超时后,大概3分钟),c1再向C2发送消

息时(即:192.168.1.11:1111 --> 2.2.2.2:2222 ),又会变成:1.1.1.1:1111 --> 2.2.2.2:2222

你可能会说我的路由器是对称型NAT,但是,我想说的是:如果c2不先向C1发送那个打洞包,而先c1向c2发送消息,即:

192.168.1.11:1111 --> 2.2.2.2:2222,那么路由器的映射又是正确的1.1.1.1:1111 --> 2.2.2.2:2222 ,心跳包也是

1.1.1.1:1111 --> 8.8.8.8:8888,即符合锥形NAT现象,看起来就好像是那个打洞包干扰了路由器的映射,所以此时这个c1发向c2

的消息又变相成了c1到c2的打洞包,那c2向C1发消息,外网端口又会被路由器重新映射。


测试了4个路由器,飞鱼星,思科,日立,D-LINK,均是如此
yunjinwang 2010-10-12
  • 打赏
  • 举报
回复
我觉得20楼说的有道理,按楼主的说法,NAT类型应该是symmentric类型
ForTopLevel 2010-05-19
  • 打赏
  • 举报
回复
请你确认一下端口受限NAT的概念,因为你主题中所说的情况是符合对称NAT的。也就是说你的测试环境是对称NAT
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
这个帖子9 楼中说道
"只有Symmetric对Symmetric才需要端口猜测。"
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
请问端口预测的话有没有一些相关的资料,我现在用的是UDT库,打洞时需要双方同时向对方connect,失败的话需要等待一段时间才能返回超时
eyodo8 2010-02-21
  • 打赏
  • 举报
回复
P2P本来就不可能达到100%的,所以需要服务器中转与p2p共存,才能保证你的两点之间通信成功建立。不过大多数个人家庭的路由都不是对称或者端口受限的
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
有没有人做过nat类型百分比的统计呢?在中国或全世界这种Port Restricted Cone NAT是否比例很大?我测试了3个nat,1个是地址受限,另2个都是端口受限
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
这样说来,双方都是Port Restricted Cone NAT和双方都是 对称型 的算法是一样的了?
但是端口的总数是65536,难道要将所有的端口都遍历发送一遍?
eyodo8 2010-02-21
  • 打赏
  • 举报
回复
如果你双方都是双方都是Port Restricted Cone NAT的时候确实是需要a向b的48676----?这段端口发送,同时b也需要向a的1512---?端口发送。打洞的前提本来就是内网一定需要先向对方端口发送过一次数据包。。因为端口因为目的地址跟端口变化而变化了,你需要根据端口分配规律猜测。双方都是Port Restricted Cone NAT,跟对称型的都需要
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
网上的一片文章提到:“而对于双方都是Port Restricted Cone NAT的时候,则需要利用UDP打洞原理进行“先打洞,然后才能直接通信”。”
http://hi.baidu.com/heelenyc/blog/item/87c19ef940902d294f4aeaaa.html
但是没有具体说到如何解决上面的端口改变的问题,这个问题已经实验了好几天,求助
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
最主要的问题是A向S的5000端口发包,在A NAT上的端口是1512
但向B NAT 的对外端口48676发打洞包时,在A NAT上的端口不是1512而是一个新的值
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
我现在的情况是有一个公网服务器S ,两个客户A B都在各自的 端口受限锥形NAT后面

A 192.168.0.3:5000 ----> A NAT 60.20.145.60:1512------> S 10.20.30.40:5000
B 192.168.0.4:5000 ----> B NAT 116.217.145.115:48676------> S 10.20.30.40:5000

S得到A B双方的外网地址,并发给对方
但是如果按照 地址受限锥形NAT的方式打洞 即

A 192.168.0.3:5000 ----> A NAT 60.20.145.60:?------> B NAT 116.217.145.115:48676
B 192.168.0.4:5000 ----> B NAT 116.217.145.115:?------> A NAT 60.20.145.60:1512

因为A向B NAT 的端口48676发包,而不是5000, A NAT 端口受限,会使用一个新的nat端口发包,B也同理,所以双方还是无法打洞
arong1234 2010-02-21
  • 打赏
  • 举报
回复
个人感觉打洞都需要有一个外部服务器做中介才能做。即使你说的那种两个都在NAT后的主机彼此直接的游戏,也是通过某个公共服务器先建立某种联系的(如找到对方),在这种建立联系过程中,洞已经由两个NAT后的客户端和服务器先打好了,然后两个客户端是利用现有的洞通讯,而不是私有的客户机之间直接打洞通讯
eyodo8 2010-02-21
  • 打赏
  • 举报
回复
Port-Restricted cone NAT

类似受限制锥形NAT(Restricted cone NAT),但是还有端口限制。
* 一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由 eAddr:port2向外发送.一个外部主机(hostAddr:port3)能够发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:port3.

Symmetric NAT(对称NAT)

* 每一个来自相同内部IP与port的请求到一个特定目的地的IP地址和端口,映射到一个独特的外部来源的IP地址和端口。
同一个内部主机发出一个信息包到不同的目的端,不同的映射使用

* 外部主机收到了一封包从一个内部主机可以送一封包回来


huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
补充一点,csonline好像和浩方平台那些不一样,游戏中间主机可以随时下线,系统会随机找一个客户做主机,游戏过程不受影响,所以我猜测是不是用的udp打洞
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
1) Full Cone 2) Restricted Cone 3) Port Restricted Cone
以上三种NAT通称Cone NAT(圆锥形NAT).我们只能用这种NAT进行UDP打洞.

网上很多文章都说到圆锥形NAT可以打洞,难道 端口受限圆锥形NAT 需要排除在外吗,那样的话和 对称nat有什么区别呢?
eyodo8 2010-02-21
  • 打赏
  • 举报
回复
对战平台一类的东西是通过类似vpn之类的隧道建立了虚拟局域网的,不存在穿透。
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
是 “端口受限锥形nat” 不是 “对称nat”,网上有的帖子说除了对称nat无法打洞,其他都很简单,但是没有找到相关的例子。
huangyouhang 2010-02-21
  • 打赏
  • 举报
回复
我在玩csonline的时候有的时候会被服务器指定做主机,而只有主机是不显示ping的,因此应该是直接p2p和其他用户连接的,难道这些网络游戏都是通过猜端口的方式吗?
网上的文章都提到对称nat难以打洞,没有找到双方都是端口受限的讨论,请问有没有实现过的人可以指点下?
eyodo8 2010-02-21
  • 打赏
  • 举报
回复
可以使用猜测端口的方式,不过猜中率应该不会很高
加载更多回复(2)
在计算机网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。根据规范,路由器是不能这样工作的,但它的确是一个方便且得到了广泛应用的技术。当然,NAT也让主机之间的通信变得复杂,导致了通信效率的降低。 一、NAT的类型 1、基本网络地址转换(Basic NAT) 2、网络地址端口转换(NAPT) 1)完全圆锥型NAT(Full cone NAT) 2)受限圆锥型NAT(Address-Restricted cone NAT) 3)端口受限圆锥型NATPort-Restricted cone NAT) 4)对称NAT(Symmetric NAT) 二、NAT工作原理 1、基本网络地址转换(Basic NAT) 它实现比较简单,仅支持地址转换,不支持端口映射。静态NAT要求对每一个当前连接都要对应一个公网IP地址,因此要维护一个公网的地址池。宽带(broadband)路由器通常使用这种方式来允许一台指定的设备去管理所有的外部链接,甚至当路由器本身只有一个可用外部IP时也如此,这台路由器有时也被标记为DMZ主机。由于改变了IP源地址,在重新封装数据包时候必须重新计算校验和,网络层以上的只要涉及到IP地址的头部校验和都要重新计算。 2、网络地址端口转换(NAPT) 这种方式支持端口的映射,并允许多台主机共享一个公网IP地址。NAPT分为四种类型,具体工作流程如下: 1)完全圆锥型NAT(Full cone NAT) 初始状态时,Client与Server1、Client与Server2都没有通讯过。 当Client通过NAT向Server1发送一个packet后,NAT会生成如下一行映射。 在全锥型网络下,后续当Server1要发送数据到Client时,Server1首先将数据送到NAT(210.21.12.140:8000),NAT接收到该报文,会将该报文转发给Client(192.168.1.5:5000)。 在全锥型网络下,Server2要发送数据给Client,Server2也是需要先将数据发送到NAT(210.21.12.140:8000),NAT接收到该报文,会将该报文转发给Client(192.168.1.5:5000)。因为NAT上已经有了192.168.1.5:5000到210.21.12.140:8000的映射。 2)受限圆锥型NAT(Address-Restricted cone NAT) 初始状态时,Client与Server1、Client与Server2都没有通讯过。 当Client通过NAT向Server1发送一个packet后,NAT中会生成如下一行映射(注意,这里增加了一项IP地址的限制)。 在受限圆锥型NAT下,Server1要发送数据到Client时,Server1首先将数据送到NAT(210.21.12.140:8000),NAT接收到该报文,会将该报文转发给Client(192.168.1.5:5000)。 并且Server1主机的任何端口号数据,都可以将数据送到NAT(210.21.12.140:8000),NAT都会将该报文转给Client(192.168.1.5:5000)。 但是Server2主机无法与Client主机进行通讯。因为Client从来没有和Server2通信过,NAT将拒绝Server2试图与Client连接的动作。 3)端口受限圆锥型NATPort-Restricted cone NAT) 初始状态时,Client与Server1、Client与Server2都没有通讯过。 当Client通过NAT向Server1发送一个packet后,NAT中会生成如下一行映射(注意,这里增加了IP+port限制)。 在端口受限圆锥型NAT下,Server2无法与Client通信,因为Client从来没有和Server2通信过。 并且Server1也只能用它的210.15.27.166:80与Client的192.168.1.5:5000通信,因为Client也从来没有和Server1的其他端口通信过。 备注:家用路由器大部分都属于端口受限圆锥型NAT。 4)对称NAT(Symmetric NAT) 初始状态时,Client与Server1、Client与Server2都没有通讯过。 当Client通过NAT向Server1发送一个packet后,NAT中会生成如下一行映射 接下来Client要使用相同的端口和Server2通信,将会在NAT中生成如下映射表。 Server1只能用它的210.15.27.166:80通过NAT的 210.21.12.140:8000与Client的192.168.1.5:5000通信。 Server2也只能用它的210.15.27.140:80通过NAT的210.21.12.140:8001与Client的192.168.1.5:5000通信, Server1或者Server2的其他端口则均不能和Client的192.168.1.5:5000通信。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧