NAT及NAT穿越

来源:互联网 发布:淘宝客服简历工作描述 编辑:程序博客网 时间:2024/04/30 15:29

   

NAT(Network Address Translation,网络地址转换)


NAT技术的出现解决了IPV4地址不够用的问题,同时主机在NAT之后,也可以保证主机的安全性。


NAT的缺陷

NAT出现之后,大家听到的多半都是对它的赞美之声,知道它可以为我们节省公网IP,可以保护我们的内部网络,对它的缺陷却知之甚少,甚至不知道我们遇到的很多网络问题就是由它造成的,比如我们在NAT设备后使用MSN Messenger进行语音聊天时却往往不能成功,其实这就是NAT惹的祸。NAT的缺陷主要表现在以下几方面。
(1) 
不能处理嵌入式IP地址或端口
NAT
设备不能翻译那些嵌入到应用数据部分的IP地址或端口信息,它只能翻译那种正常位于IP首部中的地址信息和位于TCP/UDP首部中的端口信息(如图2),由于对方会使用接收到的数据包中嵌入的地址和端口进行通信,这样就可能产生连接故障,如果通信双方都是使用的公网IP,这不会造成什么问题,但如果那个嵌入式地址和端口是内网的,显然连接就不可能成攻,原因就如开篇所说的一样。MSN Messenger的部分功能就使用了这种方式来传递IP和端口信息,这样就导致了NAT设备后的客户端网络应用程序出现连接故障。


要解决上面的嵌入式地址和端口问题,现在大多数都是通过特定的NAT编辑器来实现的(1步骤所示),比如windows 2000就提供了针对FTPPPTPICMPTCPNETBIOS各自的NAT编辑器,按照这种方法,每个应用协议都需要一个独立的NAT编辑器,但应用协议如此众多,显然这种方法不可能满足所有需求,所以我们仍需要更完美的解决方案,下面将会讲到。
(2) 
不能从公网访问内部网络服务
由于内网是私有IP,所以不能直接从公网访问内部网络服务,比如WEB服务,对于这个问题,我们可以采用建立静态映射的方法来解决。比如有一条静态映射,是把218.70.201.185:80192.168.0.88:80映射起的,当公网用户要访问内部WEB服务器时,它就首先连接到218.70.201.185:80,然后NAT设备把请求传给192.168.0.88:80192.168.0.88把响应返回NAT设备,再由NAT设备传给公网访问用户。
(3)
有一些应用程序虽然是用A端口发送数据的,但却要用B端口进行接收,不过NAT设备翻译时却不知道这一点,它仍然建立一条针对A端口的映射,结果对方响应的数据要传给B端口时,NAT设备却找不到相关映射条目而会丢弃数据包。
(4)
如果NAT本身又位于另一个NAT之后,则也会出现一些问题,为了节约IP资源,现在很多的ISP在它们内部架设NAT,然后再把服务提供给用户,比如长城、聚友等ISP通常都是以城域网的方式为用户提供宽带上网服务的。
(5)
一些P2P应用在NAT后无法进行
对于那些没有中间服务器的纯P2P应用来说,如果大家都位于NAT设备之后,双方是无法建立连接的。因为没有中间服务器的中转,NAT设备后的P2P程序在NAT设备上是不会有映射条目的,也就是说对方是不能向你发起一个连接的。



NAT穿越 

为了解决上述问题之后,出现NAT穿越技术.

Full cone

这是一个full cone, nat binding是 {z, 3001, xxx, xxx},也就是不限制从外面来的ip地址和端口,

匹配这个binding后,会把目的地址和端口映射成内部地址和端口。

  • ip restricted cone
  • ip restricted cone, binding是{z, 3001, b, xxx},也就是限制从外面来的源地址

    • port restricted cone
    • port restricted cone, binding是{z, 3001, xxx, 90},也就是限定从外面来的端口

      • symmetric nat
      • symm

        目前绝大多数属于这种。Cone NAT又分了3种类型:

        • a)Full Cone NAT(完全圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000 ,192.168.0.8可以收到任意外部主机发到1.2.3.4:62000的数据报。
        • b)Address Restricted Cone NAT (地址限制圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,只有当内部主机192.168.0.8先给服务器C 6.7.8.9发送一个数据报后,192.168.0.8才能收到6.7.8.9发送到1.2.3.4:62000的数据报。
        • c)Port Restricted Cone NAT(端口限制圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,只有当内部主机192.168.0.8先向外部主机地址端口6.7.8.9:8000发送一个数据报后,192.168.0.8才能收到6.7.8.9:8000发送到1.2.3.4:62000的数据报。   
        • 穿越NAT的实现

        A1在客户机时                192.168.0.8:4000——6.7.8.9:8000

        X1在网关时                   1.2.3.4:62000——6.7.8.9:8000

        服务器C                       6.7.8.9:8000

        B1在客户机时                192.168.1.8:4000——6.7.8.9:8000

        Y1在网关时                   1.2.3.5:31000——6.7.8.9:8000

        两内网用户要实现通过各自网关的直接呼叫,需要以下过程:

        1、 客户机A1、B1顺利通过格子网关访问服务器C ,均没有问题(类似于登录)

        2、 服务器C保存了 A1、B1各自在其网关的信息(1.2.3.4:62000、1.2.3.5:31000)没有问题。并可将该信息告知A1、B2。

        3、 此时A1发送给B1网关的1.2.3.5:31000是否会被B1收到?答案是基本上不行(除非Y1设置为完全圆锥型,但这种设置非常少),因为Y1上检测到其存活的会话中没有一个的目的IP或端口于1.2.3.4:62000有关而将数据包全部丢弃!

        4、 此时要实现A1、B1通过X1、Y1来互访,需要服务器C告诉它们各自在自己的网关上建立“UDP隧道”,即命令A1发送一个 192.168.0.8:4000——1.2.3.5:31000的数据报,B1发送一个192.168.1.8:4000——1.2.3.4:62000的数据报,UDP形式,这样X1、Y1上均存在了IP端口相同的两个不同会话(很显然,这要求网关为Cone NAT型,否则,对称型Symmetric NAT设置网关将导致对不同会话开启了不同端口,而该端口无法为服务器和对方所知,也就没有意义)。

        5、 此时A1发给Y1,或者B1发给X1的数据报将不会被丢弃且正确的被对方收到.

        综合P2P可实现的条件需要:

        1、 中间服务器保存信息、并能发出建立UDP隧道的命令

        2、 网关均要求为Cone NAT类型。Symmetric NAT不适合。

        3、 完全圆锥型网关可以无需建立udp隧道,但这种情况非常少,要求双方均为这种类型网关的更少。

        4、 假如X1网关为Symmetric NAT, Y1为Address Restricted Cone NAT 或Full Cone NAT型网关,各自建立隧道后,A1可通过X1发送数据报给Y1到B1(因为Y1最多只进行IP级别的甄别),但B2发送给X1的将会被丢弃(因为发送来的数据报中端口与X1上存在会话的端口不一致,虽然IP地址一致),所以同样没有什么意义。

        5、 假如双方均为Symmetric NAT的情形,新开了端口,对方可以在不知道的情况下尝试猜解,也可以达到目的,但这种情形成功率很低,且带来额外的系统开支,不是个好的解决办法。

        6、 不同网关型设置的差异在于,对内会采用替换IP的方式、使用不同端口不同会话的方式,使用相同端口不同会话的方式;对外会采用什么都不限制、限制IP地址、限制IP地址及端口。

        7、 这里还没有考虑同一内网不同用户同时访问同一服务器的情形,如果此时网关采用AddressRestricted Cone NAT 或Full Cone NAT型,有可能导致不同用户客户端可收到别人的数据包,这显然是不合适的。



0 0
原创粉丝点击