新闻资讯

nat网关和nat穿越的原理各是什么?

2018-10-2

nat网关是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址,但现在又想和因特网上的主机通信(并不需要加密)时,可使用nat网关的方法。那么nat网关和nat穿越的原理各是什么?

我们模拟的情形是位于网络A下的内网主机UserA 想要和位于网络B下的内网主机UserB进行点对点通信,刚开始的时候UserA和UserB都不知道对方的公网和内网IP地址及端口号,所以必须要再公网上搭建一个服务器C,服务器C主要的任务就是维护一张用户名到(主机的公网IP+端口号)的映射表,这样用户就可以从服务器C上获取UserB的公网IP和地址.

UserA在局域网内发的IP包源地址是192.168.1.100:3000,该IP包经过路由器A后会被路由器A修改成能够在公网传输的公网IP地址和公网端口号:125.71.229.217:4001。UserB向公网发送报文路由器B也会对它做同样处理。

nat穿越:

STEP1: 假设UserA想要给UserB发送消息,那么UserA就会让服务器C通知UserB先进行打洞操作。

STEP2: UserB收到打洞通知后,就发送IP包(目地址:125.71.229.217:4001,源地址:202.108.22.5:6002)给路由器A。路由器A收到该IP包后会查看源地址(202.108.22.5:6002),路由器发现局域网之前没有请求过该源地址,所以路由器会过滤掉此包。(这一步就相当于打了个洞)

STEP3: 现在到了最后UserA给UserB发送消息的一步,UserA通过路由器A发出IP数据包(目地址:202.108.22.5:6002,源地址:125.71.229.217:4001)给路由器B,同样路由器B要查看该IP包的源地址(125.71.229.217:4001),因为在STEP2中路由器B给路由器A发送过对此地址的请求(最后被丢掉的那个包),所以路由器B不会丢掉该包。接下来路由器B会读取IP包的目的地址202.108.22.5:6002,然后通过映射表转换成内网IP地址和端口号:192.168.1.100:3000,这样就可以发送报文给主机UserB了。

对称路由器穿越方法

实际上上面的nat穿越技术只适合锥形路由器(非对称路由器),说道这就要讲一下什么是对称路由器和非对称路由器了:

非对称路由器:将同一内网IP (比如:192.168.1.100:3000) 访问不同外网地址比如百度和谷歌时映射成的公网IP和公网端口是相同的(比如都是:202.108.22.5:6002)。

反之,对称路由器就是:将同一内网IP(比如192.168.1.100:3000)访问不同网络地址比如百度和谷歌时映射成的公网IP和公网端口是不同的(比如访问百度时映射成:202.108.22.5:6002,访问谷歌时映射成:125.71.229.217:4001)

回到讲的nat穿越技术,显然,UserA想给UserB发送消息,前提是:UserB 给UserA发送消息(打洞操作)和UserB给服务器C发送消息(注册自己的公网IP)用的公网IP地址和端口号是相同的。所以nat穿越只适合非对称路由器。

不能用TCP做nat穿越,只能用UDP做nat穿越。

因为:tcp是基于连接的通信,而路由器会把来自同一主机的同一端口号上的不同tcp连接映射成不同的公网端口号。反之,UDP不是基于连接的传输协议,所以使用UDP就可以将不同的网络请求映射成同一公网源地址和公网端口号。体现到实际编程中就是:同一文件描述符通过路由器可以映射成同一公网IP地址和端口号。不同文件描述符通过路由器要被映射成同一公网地址和不同的公网端口号。

UserA 和 服务器C通信(注册自己的公网IP)时,需要创建一个文件描述符 fd1;UserA 和 UserB通信时还要再创建一个描述符 fd2。 路由器对不同描述符做映射时,会把不同的描述符映射到不同的公网端口号上。

比如:UserA 的文件描述符fd1 绑定到了端口3000上,文件描述符 fd 通过端口复用也绑定到了端口3000上;但路由器在做映射时,会将这两个文件描述符代表的tcp连接映射成如下格式(eg:) 192.168.1.100:3000 <->202.108.22.5:6002; 192.168.1.100:3000 <-> 202.108.22.5:6003

使用UDP可以完成nat穿越,因为UserA 通过文件描述符fd1 和 服务器C通信,然后UserA可以继续用此fd1和UserB通信,这样路由器就会把同一内网地址上的同一端口号发出的请求映射成同一公网地址。

花生壳NAT-DDNS穿透

花生壳DDNS是将用户的动态IP 地址映射到一个固定的域名上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP 地址传送给位于服务商主机上的服务器程序,服务项目器程序负责提供 DNS 服务并实现动态域名解析。DDNS 的主要作用就是捕获用户每次变化的 IP 地址,然后将其与域名相对应,这样其他上网用户就可以通过域名来与用户交流了。