NAT技术与NAT打洞原理浅析
NAT类型
NAT共有四种类型 , 按照映射转发的严格程度从宽松到严格可以排序为 :
全锥形 , (IP)受限锥形 , 端口受限锥形 , 对称型
他们的区别如下 :
-
当主机{a:b}通过NAT{c:d}与服务器A{p:q}建立通信后 , 另一台服务器B{m:n}向{c:d}发送数据 , 可以被正常接收转发给{a:b}的 , 称为全锥形
- 在全锥形NAT下建立的映射可以接收任意外部数据
-
当主机{a:b}通过NAT{c:d}与服务器A{p:q}建立通信后 , 服务器A的另一端口{p:m}向{c:d}发送数据 , 可以被正常接收转发给{a:b}的 , 称为**(IP)受限锥形**
- 在受限锥形NAT下建立的映射可以接收映射中指定IP地址的数据
-
当主机{a:b}通过NAT{c:d}与服务器A{p:q}建立通信后 , 服务器A的另一端口{p:m}向{c:d}发送数据 , 不能被正常接收转发给{a:b}的 , 称为端口受限锥形
- 在端口受限锥形NAT下建立的映射只能接收映射中指定IP:端口的数据
锥形NAT使用更少的端口映射 , 主机端口A与所有外部服务器连接时总会被映射为同一端口B
而对称型NAT使用更多的端口映射 , 主机端口A与每个外部服务器的不同端口连接时 , 都会被映射为不同的端口
对称型NAT的其余特性与端口受限型相同 , 是限制最严格 , 也是最安全的类型
NAT打洞
不同NAT的穿透性如下
主机A , B 互相打洞需要公网服务器C的参与 , C用来收集A,B的NAT地址和开启端口 , 具体过程如下
-
全锥形 - 全锥形 : 主机A与C建立通讯 , C将A的NAT地址告知B , B可以直接向A发送数据
-
(端口)受限锥形 - (端口)受限锥形 : 主机A通过C得知B的NAT地址 , 向B的NAT地址发送数据 , 欲与B建立连接
- 此时B会将A的请求包丢弃 , 因为B未曾与A的NAT地址建立连接 ; 而A在短时间内会等待B的回应
- A通过C通知B , 使B向A的NAT地址发送回应报文
- 之后A建立与B的NAT地址的连接 , B可以直接向A发送数据
-
受限锥形 - 对称型 :
- 主机A通过C得知B的NAT地址 , 向B的NAT地址发送数据 , 欲与B建立连接
- 此时B会将A的请求包丢弃 , 因为B未曾与A的NAT地址建立连接 ; 而A在短时间内会等待B的回应
- A通过C通知B , 使B向A的NAT地址发送回应报文 , 因为此处A为IP受限型 , 所以B用任意端口回应A都可被接收
- 之后A建立与B的NAT地址的连接 , B可以直接向A发送数据
- 最后B向A的NAT地址:端口发送连接请求 , A向来源地址做出回应 , 即可建立连接
- 主机A通过C得知B的NAT地址 , 向B的NAT地址发送数据 , 欲与B建立连接
-
端口受限锥形 - 对称型 : 无法建立
- 当A通过C通知B , 使B向A的NAT地址发送回应报文 , 因为此处A为IP+端口受限型 , 所以B需要用A发出请求时指定的B的端口做出回应. 而B对A通讯时使用的端口是无法得知的 , A无法指定准确的端口 , 固然可以对B发送65535个连接请求 ,或者依靠运气 , 规律猜测 , 但还是近似认为无法连接