今天整理下NAT的类型,我想要更好的理解NAT的不同类型的不同表现,可以借助学习STUN协议的测试流程,通过STUN的判断标准,进一步了解不同NAT的表现,希望带着下面一个问题来进行学习, 为什么stun只能不能解决对称的nat类型呢.?
一, NAT 的具体流程,
请看下图, 图示为LAN端一PC和WAN端两Server, 中间为NAT的Soho Router,
1, Client A 使用10.0.0.1:1234 需要和Server 1的18.181.0.31:1235 建立session, 假设建立UDP Session,则UDP pckets经过Router时, NAT会将该UDP包中的Sourec IP和Source Port进行修改, Source IP = Router's WAN IP, Source Port=WAN PORT = 62000(一般为者随机端口), 并重新计算crc将包发给S1;
2, 在NAT将包重组,并发送出去的同时, 创建并维护了一张NAT Address Port Table表.
Client Source IP:Client Sourece Port -- Wan IP:Wan port -- DesIP:DesPort(Server IP:ServerPort)
3, Server 1收到该UDP Packets后,并进行回复. 回复的UDP包的SIP:SPORT=18.181.0.31:1235, DIP:DPORT=Router's WAN IP: WAN port=155.99.25.11:62000;
4, 当NAT Router收到该UDP数据包后, 会根据step 2中创建的NAT Table中的表项进行查找, 根据该包中的Desport:DesPort 和Source IP:Sport找到对应的Client IP:Port, 并修改该Packets的DIP:Dport为ClientIP:Port,并发送该Client A; 最终完成整个NAT UDP的流程.
二, NAT 的类型;
1, NAT Type
NAT 从实现分为Cone NAT和Symmtric NAT两类。 最主要区别在于内网的某个Client使用相同的(Source IP+Source Port)组合访问不同的外网Server时,在NAT在出口方向上的打洞方式(Cone和Symmtric 映射表现的方式)以及入口方向上的源IP及源Port的条件限制检测(Cone内部3中不同的NAT方式对入口报文有不同的来源限制)。
若上图所示的Client A使用同样的Source Port要和Server 2建立UDP session, 则不同的NAT type的行为将会不一样.
1.1, Cone NAT: 若相同的Client Source IP: Source Port在NAT Router上创建一个相同对应关系的WANIP:WAN Port. 为Cone NAT. 如上图所示, Session 2使用的Wan Source Port 仍为62000;
1.2, Symmtric NAT: 若相同的Client Source IP: Source Port在NAT Router上创建不同对应关系的WANIP:WAN Port. 为Symmtric NAT; 若上图中, Session 2使用的Wan Source Port为62001; 相比Cone NAT, Symmtric的限制更严格, 更安全;
2, Detail Information of Cone NAT
Cone NAT,即锥行NAT, 从抽象上来理解为, NAT 使用一个洞,同WAN端很多台Server进行通信, 如下图所示,(前提条件为Client IP:Source Port 相同).但是根据NAT Router对WAN端入包的判断严格程度不同, Cone NAT又可分为以下3中types:
根据本人理解:
Full Cone NAT: 在NAT Router Wan端收到数据包,并根据NAT Table找到相应的Client后,直接修改并发送; 不关心Source IP:Port.
Restricted Cone NAT: 在Full Cone的基础上,增加了对Source IP的判断, 若该Source IP并不是之前记录的DIP(Server IP), 则Drop掉;
Port Restricted NAT: 在Restricted Cone的基层上又增加了对Source Port的检测, 若该SourceIP:Source Port != 之前记录的DIP:DPort(ServerIP:Server:Port),则Drop掉.
2.1 Full cone nat
Once an internal address (iAddr:port1) is mapped to an external address (eAddr:port2), any packets from iAddr:port1 will be sent through eAddr:port2. Any external host can send packets to iAddr:port1 by sending packets to eAddr:port2.
2.2 Restricted nat
§Once an internal address (iAddr:port1) is mapped to an external address (eAddr:port2), any packets from iAddr:port1 will be sent through eAddr:port2. An external host (hostAddr:any) can send packets to iAddr:port1 by sending packets to eAddr:port2 only if iAddr:port1 had previously sent a packet to hostAddr:any. "any" means the port number doesn't matter.
2.3 Port Restricted nat
3, Detail Information Of Symmetric NAT
三, STUN 及测试流程,
STUN即简单nat 穿越协议. 可以检测设备当前NAT Router的类型,以及该NAT Map的ip和port以供应用程序使用. 下面就来说说stun是如何测试的. 简单来说,就是修改stun server的ip和port给wan口进行发包,并根据lan client收到包的个数和其中的map address的内容来判断nat的类型.
首先,请看下图
Test1, c1给s1发送一个包, 同时这个s1给c1回复,并带有map address(i1) 的ip 和port(p1);
Test2, s2给c1发包,其目的地址为i1:p1, 若c1能收到,则为full cone;收不到则为restriected ;
Test3, c1给s2发包, 并收到s2给c1的回复, 类似于test1, 带有map address(i2)的ip和port (p2), 若P2!=P1,则表示c1给s2发送时有重新打了个洞, 则为Symmetric NAT,
Test4. s1更换源端口给c1(i1:p1)发包,若c1不能接收到的话则为port restricted;
最后附上一个流程图.