NAT(Network Address Translation,网络地址转换)是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程
NAT可以分为Basic NAT和PAT:
Basic NAT只转化IP,不映射端口。
目前常用的针对UDP的NAT 穿透(NAT Traversal)方法主要有:STUN、TURN、ICE、uPnP等
一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机都能通过给eAddr:port2发包到达iAddr:port1
一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机(hostAddr:any)都能通过给eAddr:port2发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:any. "any"也就是说端口不受限制
Port-Restricted cone NAT
Symmetric NAT(对称NAT)
类型检测:
第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?
第二步:检测客户端NAT是否是Full Cone NAT?
第三步:检测客户端NAT是否是Symmetric NAT?
第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?
NAT穿透:
一、转发:
Server S
18.181.0.31:1234
|
|
+----------------------+----------------------+
| |
NAT A NAT B
A-S 155.99.25.11:62000 B-S 138.76.29.7:31000
A-B 155.99.25.11:62001 B-A 138.76.29.7:31001
| |
| |
Client A Client B
10.0.0.1:1234 10.1.1.3:1234
----------S转发A和B之间的消息------------
二、反向连接
Server S
18.181.0.31:1235
|
|
+----------------------+----------------------+
| |
NAT A |
155.99.25.11:62000 |
| |
| |
Client A Client B
10.0.0.1:1234 138.76.29.7:1234
客户端B就只能通过服务器S来请求A做一个"反向"连接到客户端B,客户端A将打开一个与客户端B通讯的连接(在B的公网IP地址和端口号上).NAT A允许这个连接通过,因为这个连接起源于NAT A的内部,并且同时客户端B能够受这个连接因为B并不位于NAT之后.
三、 UDP打洞
1).
Server S
18.181.0.31:1234
|
|
+----------------------+----------------------+
| |
NAT A NAT B
155.99.25.11:62000 138.76.29.7:31000
| |
| |
Client A Client B
10.0.0.1:1234 10.1.1.3:1234
A -------------(udp-packet)-------------->> B A发送一个UDP包给B的公网IP
A -------------- S ------------------->> B A通过S邀请B给A发送UDP到公网IP
这样,一对UDP会话打开了,洞打好了!
双方此时都可以把对方介绍给其他主机,充当媒介