读书人

关于NAT穿透:为啥这么难?解决方法

发布时间: 2012-03-06 20:47:55 作者: rapoo

关于NAT穿透:为啥这么难?
我曾经以为NAT穿透是很简单的事情。可是做起来却真的很难。我有一个固定IP的服务器,然后我在一个内网地址A 连接服务器,服务器上记载了A的IP和端口;然后再在另一个内网地址B(不是和A同一个局域网)访问服务器,服务器得到B的IP和端口,B从服务器得到A的IP和端口。

此时我让B用同样的端口向A发一个信号,然后让服务器给A一个信息,告诉它向B发送数据。这个时候,只要A向B发数据,B就能接收了吧?(以上都是UDP)

可是无论我怎么整,B都收不到A的数据。A收到了服务器发给它的让它向B发出信息的命令,也包括B的IP和端口。A也发信息了,但是B那边就是接收不到,咋回事呢?断断续续搞了好几个月了,愁死人了

我的流程:

1、服务器程序启动;
2、A连接服务器程序;服务器得到A的IP与端口
3、B连接服务器程序;服务器得到B的IP与端口
4、B根据从服务器得来的A的IP和端口,向A发一个信号,就是随便几个字符;
5、服务器向A发出信号,告诉它向B发数据,并告诉它B的IP与端口;
6、A向B发数据;

B这边却接不到!有没有大侠能指点一二?


[解决办法]

探讨


此时我让B用同样的端口向A发一个信号,然后让服务器给A一个信息,告诉它向B发送数据。这个时候,只要A向B发数据,B就能接收了吧?(以上都是UDP)

[解决办法]
恩。有可能你第二次发出的消息IP和端口就变了。尤其是UDP类型的。

[解决办法]
用TCP试试
[解决办法]
探讨
我这个流程是不是没有错啊?我曾经在一个网吧,在一个政府机关都测试过,总是不通

[解决办法]
A前面的NAT设备是基于五元组的,例如:

A--NAT---Server(固定IP).经过NAT之后是这样的:(IP1:Port1 --- IP2:80)
IP1是NAT之后的IP、Port1是NAT之后的Port。IP2、80是你固定IP的端口和IP。

此时,你让B给A发消息的时候,IP是这样的:
IPb:PORT2----IP1:Port1(IP1、PORT1是你在Server上记录下来的)。

但是,A前面的NAT设备发现IPb、PORT2不是由A访问过的地址和端口,因此是不让进入,这种属于一种严格的地址转化方式,现在大部分设备都是这样的。

因此,你必须让B有能力伪造固定IP的源地址和端口对A发送报文。采用如下的报文发送:
IP2:80---->IP1:Port1。这个报文是能穿越NAT的。

但是麻烦的问题是这样的:运营商网络中,很可能会禁止非本机IP地址发出的报文。

所以,NAT穿越是很困难的。尤其是两台处于私网的主机的穿越。

读书人网 >网络协议

热点推荐