STUN协议和常用NAT类型

Nat的基本原理

    当内部网络中的一台主机想传输数据到外部网络时,它先将数据包传输到NAT路由器上,路由器检查数据包的报头,获取该数据包的源IP信息,并从它的NAT映射表中找出与该IP匹配的转换条目,用所选的内部全局地址(全局唯一IP地址)来替换内部局部地址,并转发数据包。
    当外部网络对内部主机进行应答时,数据包被送到NAT路由器上,路由器接收到目的地址为内部全局地址(外网IP)的数据包,它将用内部全局地址通过NAT映射表查找内部局部地址,然后将数据包的目的地址替换成内部局部地址(内网私有IP),并将数据包转发到内部主机。

Nat的优缺点

优点:
    对于家庭或小型商业机构,使用NAT可以更便宜,更有效的接入Internet。
    使用NAT可以缓解目前全球IP地址不足的问题。
    NAT能够隐藏内部网络的拓扑结构,保护内部主机,同时还起到防火墙的作用。
缺点:
    NAT会增加延迟,因为要转换的每个数据包包头的IP地址,增加了延迟。
    导致无法进行端到端IP跟踪。
    NAT会使某些使用内嵌地址的应用不能正常工作。

Nat的3种形态

1.静态NAT (一对一)

静态转换:(static Nat):是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址,借助静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。

缺点:一个内网IP对应网关的一个公网IP.如果想让内网中的其它pc也能访问外网,那么网关就必须有多个公网IP,并对每台系想访问外网的pc进行静态配置。

2.动态NAT (多对多)

动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对并不是一一对应的,而是随机的。

缺点:网关有多少个公网IP.就只能满足多少个内网IP上网。

3.端口多路复用(多对一,目前使用最多的)

    通过使用端口多路复用,可以达到一个公网地址对应多个私有地址的一对多转换。在这种工作方式下,内部网络的所有主机均可共享一个合法外部IP地 址实现对Internet的访问,来自不同内部主机的流量用不同的随机端口进行标示,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有 主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

在这里插入图片描述

NATP类型的分类

(1)全锥型(Full Cone)

在这里插入图片描述
client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送任何数据
Nat都会将数据转发给client

(2)受限锥型(Restricted Cone),或者说是IP受限锥型

在这里插入图片描述
client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送数据
Nat都会将数据直接丢弃
Nat只接受来自于服务器A的任何数据

(3)端口受限锥型(Port Restricted Cone),或者说是IP+Port受限锥型

在这里插入图片描述
client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送数据
Nat都会将数据直接丢弃
关于来自服务器A的数据
Nat只接受来自于服务器A的特定数据

(4)对称型(symmetric)

在这里插入图片描述
对称型NAT把从同一内网地址和端口到相同目的地址和端口的所有请求,都映射到同一个公网地址和端口。如果同一个内网主机,用相同的内网地址和端口向另外一个目的地址发送报文,则会用不同的映射。这和端口限制型NAT不同,端口限制型NAT是所有请求映射到相同的公网IP地址和端口,而对称型NAT是不同的请求有不同的映射。(即五元组一致)

STUN协议

    STUN的全称是Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)。
即穿越NAT的简单UDP传输。(只讨论过程,详解参考RFC3489)
    简单来说STUN就是用来找出自己对应的外网的ip和端口,并且可以知道自己所处的网络NAT之下。
stun是一个CS结构,下面具体讲解下NAT类型的发现过程。
在这里插入图片描述
在这里插入图片描述
NAT类型测试工具:NatTypeTester.exe(网上自行下载,可以判断当前处于哪个类型nat下)

NAT穿越

    使用udp穿越nat,通常情况下使用udp和外部主机通信会产生一条session,保留时间不一定几秒,几分,几小时。。。

    假设NAT-A下的client-A想和NAT-B下的client-B进行通信,一种办法是server作为中间人,负责转发A-B
直接的数据,这样服务器会很累,另一种办法是让client-A和client-B建立端到端的连接,也就是P2P。

(1)全锥形NAT,这个很容易,不讨论。

(2)限制锥型NAT和端口限制锥型NAT(简称限制型NAT)

当client-A直接发送udp到client-B,肯定会被NAT-B丢弃
在这里插入图片描述
1.client-A(202.103.142.29:5000)发送给数据包server请求和client-B(221.10.145.84:6000)通信。
2.server将client-A的地址和端口发送给client-B,告诉client-B,client-A想要和你通讯。
3.client-B向client-A的地址(202.103.142.29:5000)发送udp数据包,这个数据包到NAT-A肯定丢弃,发送这个udp目的是让NAT-B记住这次通讯的目的地址和端口,当下次这个地址和端口数据到NAT-B的时候就不会被丢弃,这样NAT-B上打了一个从client-B到client—A的孔。
4.为了让client-A知道什么时候才可以向client-B发送数据,所以client-B要向server发送一个消息告诉server他已经准备好了
5.server会向client-A发送一个包client-B已经准备好了,你可以向client-B发送数据了。
6.client-A向client-B发送udp数据包,这个数据包是不会被NAT-B丢弃,之后client-B向client-A发送的数据也不会被NAT-A所丢弃,至此client-A和client-B就可以通讯。

(3)对称NAT

    对称NAT并不会像锥(Cone,全锥,限制性锥,端口限制性锥)NAT那样分配同一个端口。而是会新建立一个Session,重新分配一个端口。上面穿透限制性锥NAT的过程,在步骤3时:Client-B(221.10.145.84:?)向Client-A打孔的时候,对称NAT将给client-B重新分配一个端口号,而这个端口号对于Server、client-B、client-A来说都是未知的。同样, client-A根本不会收到这个消息,同时在步骤4,client-B发送给Server的通知消息中,client-B的socket依旧是(221.10.145.84:6000)。而且,在步骤6时:client-A向它所知道的client-B发送数据包时,NAT-A也会重新给client-A分配端口号。所以,穿透对称NAT的机会很小。

解决办法:
    穿透NAT的步骤2,当client-B收到Server发送给它的消息后,client-B即打开3个socket。socket-0向STUN Server发送请求,收到回复后,假设得知它被转换后的地址:端口(221.10.145.84:6005),socket-1向client-A发送一个UDP包,socket-2再次向另一个STUNServer发送请求,假设得到它被转换后的地址:端口(221.10.145.84:6020)。通常,对称NAT分配端口有两种策略,一种是按顺序增加,一种是随机分配。如果这里对称NAT使用顺序增加策略,那么,client-B将两次收到的地址:端口发送给Server后,Server就可以通知client-A在这个端口范围内猜测刚才client-B发送给它的socket-1中被NAT映射

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值