UDP打洞过程中,不同NAT后的内网机拿到对方外网地址端口后能否直连?

zz962 2012-01-08 09:39:42
在《UDP内网穿透讲解及代码实现》中,开始说两个内网机拿到对方外网地址后不能直连,之后又说通过服务器让一个内网机给另外一个内网机的外网地址发包就可以打洞成功,看得我很糊涂。他的解决方法不还是两个内网机连对方的外网地址么?

环境有限,暂时无法准备两个不同的NAT,故请教有过打洞成功经验的朋友,他这种说法对么,是不是漏了什么。

相关原文如下

首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是40000,那么Server S收到的B的地址是187.34.1.56:40000。

此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。

总结一下这个过程:如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞。呵呵,是不是很绕口,不过没关系,想一想就很清楚了,何况还有源代码呢(侯老师说过:在源代码面前没有秘密 8)),然后Client A就可以通过Client B的外网地址与Client B通信了
...全文
262 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh000ttt 2014-08-25
  • 打赏
  • 举报
回复
外网通讯这个 楼主搞定了吗 我也遇到同样的 问题 了 求助!!!
fishion 2012-01-12
  • 打赏
  • 举报
回复
经过路由的话,可能得进行端口映射了。
还有就是使用那两个客户端的外网地址和端口,就是在recvfrom得到的IP和端口,还有就是关闭防火墙看看
zz962 2012-01-12
  • 打赏
  • 举报
回复
有没有办法去查NAT上的对照表?
现在原理我理解,但就是无法穿透。

我是这么实验的:
1、在两个内网机上分别启动客户端,绑定一个端口
2、两个客户端分别和一个公网IP的机器通信,从服务器上看到两位的外网地址,然后再让两个客户端用对方的外网IP相互通信。

根据原理,每个内网机应该在NAT上打一个指向对方的洞,之后就可以互相访问到,但我没有成功。
请问可能是什么原因,怎么去查?

zz962 2012-01-08
  • 打赏
  • 举报
回复
我看了源码,暂时发现就是一个内网机收到服务器命令后给另一个内网机的外网地址发消息。
这就和他开始的描述自相矛盾了。

醉马不肖 2012-01-08
  • 打赏
  • 举报
回复
开始说两个内网机拿到对方外网地址后不能直连,之后又说通过服务器让一个内网机给另外一个内网机的外网地址发包就可以打洞成功,看得我很糊涂。他的解决方法不还是两个内网机连对方的外网地址么?

首先内网的客户端,出去的话,都有一个外网的地址,

NAT表里记了一个对照表

内网地址 外网地址
X.X.X.X:Y X1.X1.X1.X1:Y1

这个对照表只有外网访问外网服务器时才建立(静态NAT除外)

然后另一个客户在这个NAT表项建立以后,直接发送X1.X1.X1.X1:Y1 就是给X.X.X.X:Y发信息
醉马不肖 2012-01-08
  • 打赏
  • 举报
回复
NAT的完全分析及其UDP穿透的完全解决方案
http://blog.csdn.net/colinchan/article/details/712773
Gloveing 2012-01-08
  • 打赏
  • 举报
回复
首先,你应该明白为什么这里不是用TCP打洞,而是使用UDP,
其次了解一下NAT一般的实现原理方式等(静态转换Static Nat、动态转换Dynamic Nat 和端口多路复用OverLoad)
首先是:Server S命令Client B向Client A方向打洞

18,356

社区成员

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

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