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
消息许可类型:
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,并增大了包的延迟和丢包的可能性。
NAT实现方式:
NAT四种类型:
- NAT1 完全圆锥型 (Full Cone)
- NAT2 受限锥型 (Restricted Cone)
- NAT3 端口限制圆锥型 (Port Restricted Cone)
- NAT4 对称型 (Symmetric)
NAT特性:
常用穿透方法(UDP):
优点:
- 特定情况下可以减轻服务器的压力、节省公有合法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):我不给你钥匙你不能进我家门
初始状态时,Client与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位的标识符和magic cookie。STUN消息包括两种:请求报文和响应报文。
★消息格式
STUN报文内容包括一段标头后面跟着一些属性字段,属性可以是多种多样的,并且还可以跟随一个有效的负载,通常是一个UDP数据包。
TURN定义:
TURN(Traversal Using Relays around NAT,穿越NAT的中继)是一种网络协议,它提供了在对等主机之间传输数据的能力,而不需要确保它们都有一个公共IP地址。它由RFC5766定义,支持UDP和TCP。
TURN工作原理:
一个需要连接的客户端通过一个TURN服务器来进行中继转发。首先,该客户端将数据发送到TURN服务器,TURN服务器再将数据发送到目标客户端。接收数据时,目标客户端的TCP连接或者UDP连接是通过一个TURN服务器进行的。TURN提供了一种确保可靠数据传输的方法,但在实现中可能会引入延迟。
TURN与STUN的区别:
1)STUN是允许客户端探测其在NAT下的IP地址,若没有公网IP,可以通过STUN服务器来获取。是客户端与服务器之间的点对点协议;而TURN是需要一个中继服务,有点类似于P2P中的中继服务器,它负责转发数据。
2)STUN只是提供了NAT的公共IP地址,若在穿越时出现问题,无法解决。而TURN则会将所有数据通过中继服务器进行转发。
3)TURN服务器一般是需要付费的,STUN服务器基本都是免费的。
UPNP定义:
UPnP (Universal Plug and Play,通用即插即用) 是一组网络协议,旨在使设备之间的连接、发现和通信变得简单。它由多个协议组成,允许设备自动发现并与网络中的其他设备进行通信。通过UPnP,用户可以在家中的网络上轻松地连接和使用设备,如打印机、网络存储和其他设备。常用于媒体共享、游戏和家庭自动化。
UPNP的工作原理:
设备可以使用UPnP协议发现网络上的其他设备,并通过简单的命令进行控制和数据交换。当设备连接到网络时,它会向UPnP控制点发送消息,通知其存在和能力。控制点可以与这些设备进行通信,并发送命令以控制它们的功能。
UPNP的优缺点:
优点:方便、自动化的设备发现与配置、无缝连接设备
缺点:安全隐患:UPnP的安全性问题,可能导致网络受到攻击