NAT 内网穿透 原理

一、什么是NAT?

NATNetwork Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信时,可使用NAT方法。

NAT是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IPInternet Protocol)地址出现在Internet上。

听上去似乎很简单,NAT就是替换了一下IP地址

RFC1918规定了三块专有的地址,作为私有的内部组网使用:

  • A类:10.0.0.0—10.255.255.255 10.0.0.0/8
  • B类:172.16.0.0—172.31.255.255 172.16.0.0/12
  • C类:192.168.0.0—192.168.255.255 192.168.0.0/16

这些私有IP地址只在企业内部使用,不能作为全球路由地址,除了企业或组织的管理范围,这类私有地址就不在有任何意义。

注意:任何一个组织都可以在内部使用这些私有地址,因此两个不同网络中存在相同IP地址的情况是很可能出现的,但是同一个网络中不允许两台主机拥有相同IP地址,否则将发生地址冲突。

这三块私有地址本身是可路由的,只是公网上的路由器不会转发这三块私有地址的流量;当一个公司内部配置了这些私有地址后,内部的计算机在和外网通信时,公司的边界路由会通过NAT或者PAT技术,将内部的私有地址转换成外网IP,外部看到的源地址是公司边界路由转换过的公网IP地址,这在某种意义上也增加了内部网络的安全性。

NAT的三种类型

  • Static NAT
  • Pooled NAT
  • NAPT
    • SNAT
    • DNAT

有了NAT以后,内网的主机不在需要申请公网IP地址,只需要将内网主机地址和端口通过NAT映射到网络出口的公网IP即可,然后通信的两端在无感知的情况下进行通信。这也是为什么说NAT挽救了IPV4,因为大量的内网主机有了NAT,只需要很少的公网地址做映射就可以了,如此就可以节约出很多的IPV4地址空间。

1.1 Static NAT将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一直不变的。

1.2 Pooled NAT

动态NAT 是多对多的。将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定,随机的。所有被授权访问Internet的私有IP地址可随机转换为任何指定合法的IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态NAT转换。动态NAT是在路由器上配置一个外网IP地址池,当内部有计算机需要和外部通信时,就从地址池里动态的取出一个外网IP,并将他们的对应关系绑定到NAT表中,通信结束后,这个外网IP才被释放,可供其他内部IP地址转换使用,这个DHCP租约IP有相似之处。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。

1.3 NAPT(Network Address Port Translation)

网络地址端口转换是多对一的。改变外出数据包的源端口并进行端口转换,采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,可以最大限度地节约IP地址资源。同时,也可以隐藏网络内部的所有主机,有效避免来自Internet的攻击。因此,目前网络中应用最多的就是PAT规则。这是最常用的NAT技术,也是IPv4能够维持到今天的最重要的原因之一,它提供了一种多对一的方式,对多个内网IP地址,边界路由可以给他们分配一个外网IP,利用这个外网IP的不同端口和外部进行通信。NAPT与 动态NAT 不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。

NAPT是使用最普遍的一种转换方式,在HomeGW中也主要使用该方式。

  • `源NATSource NATSNAT):修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一个SNAT的例子。

  • 目的NATDestination NATDNAT):修改数据包的目的地址。Destination NAT刚好与SNAT相反,它是改变第一个数据解析的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT

二、什么是内网穿透?

NAT的缺陷之一就是只能由内网主机发起连接,外网主机无法主动连接到内网。 这就意味着外部节点无法和内网主机进行P2P通信

内网穿透的方式有哪些?

2.1 STUN——UDP打洞

全称为Simple Tranversal of UDP through NAT

假设两个不同网络中的设备A和B想穿透NAT进行点对点通信,其中STUN SERVER是部署在公网中的STUN服务器。

  1. A通过NAT网关向SERVER发送STUN请求消息(UDP),查询并注册自己经过NAT映射后的公网地址
  2. SERVER响应,并将A经过转换后的公网IP地址和端口填在响应报文中
  3. B通过NAT网关向STUN SERVER发送STUN请求消息(UDP),查询并注册自己经过NAT映射后的公网地址
  4. SERVER响应,并将B经过转换后的公网IP地址和端口填在响应报文中
  5. 此时A已经知道了自己映射后对应的公网IP地址和端口号,它把这些信息打包在请求中发送给SERVER,请求和B进行通信
  6. SERVER查询到B注册的公网地址和端口,然后将请求通过NAT网关转发给B
  7. B从消息中知道A的公网地址和端口,于是通过此地址和端口,向A发送消息,消息中包含B映射后的公网地址和端口号,A收到消息后就知道了B的公网地址及端口,这样在A和B之间建立起了通信通道。

2.2 TURN

STUN穿透技术的缺点在于无法穿透对称型NAT,这可以通过TURN技术进行改进。TURN的工作过程和STUN非常相似。

区别在于在TURN中,公网地址和端口不由NAT网关分配,而是由TURN服务器分配。

由于所有的请求都需要经过TURN服务器,所以网络延迟较大。

目前一些适用于Windows系统上的网络穿透工具普遍使用的是这种方式

  • 花生壳
  • Ngrok
  • Natapp
  • Frp
  • Lanproxy
  • Spike

花生壳的原理如下:

在花生壳端口映射配置页面配置好映射端口

内网穿透起到了地址转换的功能,也就是把公网的地址进行翻译,转成为一种私有的地址。

可以看到,花生壳有一个公网服务器,这个服务器就是这里所谓的TURN SERVER 先向这个服务器注册号自己的内网端口号和内网主机号,然后再本地开启花生壳App。

从上图中可以看出真个TURN内网穿透的流程,花生壳App通过一个动态的端口向TURN SERVER (103.46.128.49)发起了请求,建立了连接,然后本地自己建立了一个进程,这个进程所监听的端口正是我们在花生壳的端口配置界面所写入的那个端口。这个进程就是内网服务器。

top Created with Sketch.