NAT穿透原理(转载)

  • Post author:
  • Post category:其他




原文链接:

https://www.jianshu.com/p/f060eeac337b

一、背景知识介绍

1.什么是NAT

NAT 是 Network Address Translation 的缩写,即网络地址转换。主要是将内部的私有IP地址转换成公网IP

2.诞生的原因

所谓地址就是来标识每一台设备的,因此每一个设备就应该有一个唯一的不重复的地址。本来互联网就是这么设计的,每一台设备都有一个固定的地址即公网IP。但随着设备的增多,发现IPv4地址不够用了,怎么办?这就需要用到NAT技术。即让一群机器公用同一IP,当互联网中的包传递过来的时候,通过对应的地址和端口对应表找到对应的机器。例如下面的地址和端口对应表

公有地址 端口号 私有地址 端口号
1.2.3.4 5123 10.10.1.1 1025
1.2.3.4 5124 10.10.1.2 1025
1.2.3.4 5125 10.10.1.3 1021
1.2.3.4 5126 10.10.1.4 1029

当从内网发送包的时候 比如

10.10.1.1

的客户端发送包的时候,包的端口号是

1025



IP



10.10.1.1

,当到达路由器的时候,路由器的地址转换功能就会将发送的

IP地址



10.10.1.1

转换成

1.2.3.4

,端口转换成

5123

。接收时,互联网就会把包发送到

1.2.3.4:5123

,路由器再根据地址和端口对应表找出对应的地址应该是

10.10.1.1:1025

,然后改写包的对应的信息,内网中的客户端就能收到来自互联网中的包了。

3.优缺点

  • 不会暴露内网的IP,增加了安全性
  • 会拦截转化表中没有的记录,增加了网络的安全
  • NAT降低了发送数据的效率
  • 有些协议无法NAT,需要穿透技术来解决
  • NAT超时 需要检查心跳

二、NAT墙

什么是NAT 墙,NAT 墙就是外界对内网的所有请求会拦截转化表中没有的记录,这样的包都会被丢弃。如果在这面墙上打洞呢?即NAT穿透。比如在两个不同内网中的机器A和机器B,首先可以先让A发送一个UDP的消息给B机器,那么A机器的内网NAT墙上就有了一个洞。当然这个消息到达B的NAT的时候会被丢弃,但是如果这个时候B也发送了一个消息,到达A的NAT的时候,就可以从之前打的洞中穿过,这样A就收到了B的消息

三、四种NAT类型

现在有A机器为内网的客户端,B,C两个公有IP,分别为

1.2.3.4



5.6.7.8

。A 的内网IP 为

10.10.1.1

,当A向B的

1234

端口发送UDP消息的时候,A的NAT地址端口对应表为

10.10.1.1:5432 => 1.3.5.7:9012

,而且C没有和A进行过任何消息沟通

  • 完全锥形NAT(Full Cone NAT , FC)

    即B和C的任意端口都可以通过

    1.3.5.7:9012

    这个地址和A来进行消息发送
  • 受限锥形NAT(Restricted Cone NAT)

    这里受限指的是IP受限,这时C已经无法向A的

    1.3.5.7:9012

    这个地址主动发送了,但是B可以,而且B 还可以通过任意端口来进行,不局限于

    1234

    这个地址
  • 端口受限型NAT(Port Restricted Cone NAT)

    只有B机器的

    1234

    端口可以和A通过

    1.3.5.7:9012

    这个地址主动对话了
  • 对称性NAT(Symmetric NAT)

    当A向B发送UDP消息的时候,A的NAT地址端口对应表为

    10.10.1.1:5432 => 1.3.5.7:9012

    ,但是当A向C 发送消息的时候就不是

    9012

    了,如:

    9013

    端口,A对外的公网Port是不停的变化的

四、STUN协议

STUN是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由RFC 5389定义。STUN由三部分组成:STUN客户端、STUN服务器端、NAT路由器。STUN服务端部署在一台有着两个公网IP的服务器上(为什么是两个,请看下文)。STUN客户端通过向服务器端发送不同的消息类型,根据服务器端不同的响应来做出相应的判断,一旦客户端得知了Internet端的UDP端口,通信就可以开始了。

那么STUN协议是如何检测NAT类型的呢?

假设A是客户端,B是STUN服务器,C有两个IP分别为IP1和IP2

  • test1 判断客户端是不是在NAT后面

    A发送一个UDP消息到B的IP1和port1。B收到包之后会将源IP和port写到UDP包中,再通过IP1和port1发送给A。A收到消息之后和自己的IP进行比对,如果是一样那么A就是公网IP。
  • test2 判断是不是完全锥形

    A发送一个UDP消息到B的IP1和port1。B收到之后从IP2发送这个消息给A,如果A有收到说明对IP和端口都没有限制
  • test3 判断是不是对称NAT

    A分别向B的IP1,port1,以及IP2,port2发送消息,然后B收到包之后会将源IP和port写到UDP包中,再通过IP1,port1,以及IP2,port2发送给A。如果A发现端口号是一样的就不是对称NAT,不一样就是
  • test4 判断是不是端口限制锥形

    B向C的IP2的一个端口port2发送一个数据请求包,要求C用IP2和不同于port2的port返回一个数据包给B。如果B有收到就是限制型锥形NAT,否则就是端口限制型

*注: 个人转贴做笔记只用,如有不妥,还请告知。