NAT——网络穿透的四种模式
NAT实现方式:
静态转换 动态转换 端口多路复用
NAT四种类型:
NAT1完全圆锥型(Full Cone)、NAT2受限锥型(Restricted Cone)、NAT3端口限制圆锥型(Port Restricted Cone)、NAT4对称型(Symmetric);
NAT特性:
宽带分享 安全防护
常用穿透方法(UDP):
STUN、TURN、LCE、UPNP;
优点:
特定情况下可以减轻服务器的压力、节省公有合法IP地址、处理地址重叠、
缺点:
延迟增大、配置和维护的复杂性、不支持某些应用或者服务,需要通过静态映射来避免;
静态转换
IP地址的对应关系是一对一,而且是不变的,借助静态转换,能实现外部网络对内部网络中某些特设定服务器的访问。
举例:
公网IP:111.205.195.103 私网IP:192.168.1.66 NAT网关:192.168.1.1 端口:80(http)
映射前:访问111.205.195.103:80报错无法正常访问。
映射后:访问111.205.195.103:80信息传送到192.168.1.66:80端口,网站正常访问。
动态转换
IP地址的对应关系是不确定的,而是随机的,所有被访问互联网的私有地址可随机转换为任何指定的合法的外部IP地址。
举例:
公网IP池:111.205.195.103/24
端口多路复用
通过改变外出数据包的源IP地址和源端口并进行转换,内部网络的所有主机均可共享一个合法IP地址互联网的访问,节约IP。
举例:
Client 192.168.1.5 NAT 210.21.12.140 Server1 210.15.27.166 Server2 210.15.27.140
NAT1完全圆锥型(Full Cone) 来者不拒
初始状态时,Client与Server1、Client与Server2都没有通讯过。
当Client通过NAT向Server1发送一个packet后,NAT会生成如下映射:
Client主机地址:端口 192.168.1.5:5000 NAT公网地址:端口210.21.12.140.8000
在全锥型网络下,后续当Server1要发送数据到Client时,Server1首先将数据送到NAT,NAT接收到该报文,会将该报文转给Client。
NAT2受限圆锥型(Restricted Cone) 我不给你钥匙你不能进我家门
初始状态时,Clinet与Server1、Client与Server2都没有通讯过。
当Client通过NAT向Server1发送一个packet后,NAT中会生成如下映射:
Client主机地址:端口 192.168.1.5:5000 NAT公网地址:端口 210.21.12.140:8000
Server1主机地址:端口 210.15.27.166
在受限圆锥型NAT下,Server1要发送数据到Client时,Server1首先将数据送到NAT,NAT接收到该报文,会将该报文转发给Client。
但是Server2主机无法与Client主机进行通讯。因为Client从来没有和Server2通信过,NAT将拒绝Server2试图与Client连接的动作。
NAT3端口受限圆锥型(Port Restricted Cone)
初始状态时,Client与Server1、Client与Server2都没有通讯过。
当Client通过NAT向Server1发送一个packet后,NAT中会生成如下映:
Client主机地址:端口 192.168.1.5:5000 NAT公网地址:端口 210.21.12.140:8000
Server主机地址:端口 210.15.27.166:80
在端口受限圆锥型NAT下,Server2无法与Client通信,因为Client从来没有和Server2通信过。
并且Server1也只能用它的210.15.27.166:80与Client的192.168.1.5:5000通信,因为Client也从来没有和Server1的其他端口通信过。
NAT4对称NAT(Symmetric)
初始化状态时,Client与Server1、Client与Server2都没有通信过。
当Client通过NAT向Server1发送一个packet后,NAT中会生成如下映射:
Client主机地址:端口 192.168.1.5:5000 NAT公网地址:端口 210.21.12.140:8000
Server主机地址:端口 210.15.27.166:80
接下来Client要使用相同的端口和Server2通信,将会在NAT中生成如下映射:
Client 192.168.1.5:5000 NAT 210.21.12.140:8000 Server1 210.15.27.166:80
Client 192.168.1.5:5000 NAT 210.21.12.140:8001 Server2 210.15.27.140:80
Server1只能用它的210.15.27.166:80通过NAT的210.21.12.140:8000与Client的192.168.1.5:5000通信。
Server2也只能用它的210.15.27.140:80通过NAT的210.21.12.140:8001与Client的192.168.1.5:5000通信。
Server1或者Server2的其他端口则不能和Client的192.168.1.5:5000通信。
安全防护:
STUN定义:
STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间创建UDP通信。该协议由RFC5389定义。
STUN穿透:
STUNml(simple traversal of UDP over NAT)的原理是通过某种机制预先得到内部私有IP地址对应在出口NAT上的对外公网IP地址,然后在报文负载中所描述的地址信息就直接填写出口NAT上的对外IP地址。其最大的优点是无需对现有NAT/防火墙设备做任何改动。局限性在于需要应用程序支持STUN CLIENT的功能,同时STUN并不适合支持TCP连接的穿越。
STUN报文:
★消息头
所有的STUN消息都包含20个字头的消息头,包括16位的消息类型,16位的消息长度和128位的事务ID。
字节
0 1 2 3
消息类型 |
消息长度 |
事务ID |
|
消息许可类型:
0x0001:捆绑请求
0x0101:捆绑响应
0x0111:捆绑错误响应
0x0002:共享私密请求
0x0102:共享私密响应
0x0112:共享私密错误响应
消息长度,是消息大小的字节数,但不包括20字节的头部。
事务ID,128位的标识符,用于随机请求和响应,请求与其相应的所有响应具有相同的标识符。
★消息属性
消息头之后是0个或多个属性,每个属性进行TLV编码,包括16位的属性类型、16位的属性长度和变长属性值。
字节
0 1 2 3
属性类型 |
属性长度 |
属性值 |
|
…… |
属性类型定义:
MAPPED-ADDRESS
MAPPED-ADDRESS属性表示映射过的IP地址和端口。它包括8位的地址族,16位的端口号及长度固定的IP地址。
RESPONSE-ADDRESS
RESPONSE-ADDRESS属性表示响应的目的地址
CHASNGE-REQUEST
客户使用32位的CHANGE-REQUEST属性来请求服务器使用不同的地址或端口号来发送响应。
SOURCE-ADDRESS
SOURCE-ADDRESS属性出现在捆绑响应中,它表示服务器发送响应的源IP地址和端口。
CHANGED-ADDRESS
如果捆绑请求的CHANGE-REQUEST属性中的“改变IP”和“改变端口”标志设置了,则CHANGED-ADDRESS属性表示响应发出的IP地址和端口号。
USERNAME
USERNAME属性用于消息的完整性检查,用于消息完整性检查中标识共享私密。USERNAME通常出现在共享私密响应中,与PASSWORD一起。当使用消息完整性检查时,可有选择地出现在捆绑请求中。
PASSWORD
PASSWORD属性用在共享私密响应中,与USERNAME一起。PASSWORD的值是变长的,用作共享私密,它的长度必须是4字节的倍数,以保证属性与边界对齐。
MESSAGE-INTEGRITY
MESSAGE-INTEGRITY属性包含STUN消息的HMAC-SHA1,它可以出现在捆绑请求或捆绑响应中;MESSAGE-INTEGRITY属性必须是任何STUN消息的最后一个属性。它的内容决定了HMAC输入的Key值。
ERROR-CODE
ERROR-CODE属性出现在捆绑错误响应或共享私密错误响应中。它的响应号数值范围从100到699。
400(错误请求):请求变形了。客户在修改先前的尝试前不应该重试该请求。
401(未授权):捆绑请求没有包含MESSAGE-INTERITY属性。
420(未知属性):服务器不认识请求中的强制属性。
430(过期资格):捆绑请求没有包含MESSAGE-INTEGRITY属性,但它使用过期
的共享私密。客户应该获得新的共享私密并再次重试。
431(完整性检查失败):捆绑请求包含MESSAGE-INTEGRITY属性,但HMAC验
证失败。这可能是潜在攻击的表现,或者客户端实现错误
432(丢失用户名):捆绑请求包含MESSAGE-INTEGRITY属性,但没有
USERNAME属性。完整性检查中两项都必须存在。
433(使用TLS):共享私密请求已经通过TLS(Transport Layer Security,即安全
传输层协议)发送,但没有在TLS上收到。
500(服务器错误):服务器遇到临时错误,客户应该再次尝试。
600(全局失败):服务器拒绝完成请求,客户不应该重试。
TURN穿透:
TURN即通过Relay方式穿越NAT,也是私网中的SIP终端通过某种机制预先得剑TURN SeI-ver上的公网地址,私网终端发出的报文都要经过TURN Serve:进行Relay转发。这种方式除了具有STUN方式的优点外,还解决了STUN应用无法穿透对称NAT(SymmetricNAT)以及类似的Firewall设备的缺陷,局限性在于需要SIP终端支持TURN Client,并增大了包的延迟和丢包的可能性。
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!