什么是内网穿透

什么是内网穿透

Posted by liz on November 21, 2020

什么是内网穿透

内网穿透

什么是内网穿透呢?

百度百科的描述

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。

简单来说内网穿透的目的是:让外网能访问你本地的应用,例如在外网打开你本地http://127.0.0.1指向的Web站点。

工作方式

网络地址转换(Network Address Translation,NAT)机制的问题在于,NAT设备自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据 包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了 一定困难。Internet上的NAT设备大多是地址限制圆锥形NAT或端口限制圆锥形 NAT,外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使 NAT设 备产生一个映射条目,这就有必要研究一下内网穿透技术。

通信的一方处于内网

两台主机进行通信,一方有公网ip,一方没有

一台主机有一个公网 IP,另一台主机有一个内网 IP

channel

我们假定Client:A有内网ip,Client:B有公网ip。

Client:A处于NAT之后,拥有ip(10.0.0.1:8080),Client:B位于 NAT 之前,并拥有IP(138.76.29.7:8080),NAT拥有公网 IP 155.99.25.11。
Client:B有公网ip,所以Client:A可以直接通过TCP连接到(138.76.29.7:8080),但是如果Client:B连接Client:A则会连接不成功,会找不到Client:A。 此时,需要一个公有的服务器辅助进行内网穿透。Client A 和 Client B 向服务器发起登陆请求,并保持一个 TCP 或 UDP 连接,服务器记录其 IP 地址和端口号, 这里服务器对 Client A 是记录其经过 NAT 映射之后的 IP 和端口号。当 Client B 想连接 Client A 时,首先向服务器提出请求,服务器在收到请求后向 Client A 发出打洞命令,并将 Client B 的[IP 地址:端口]对发给 Client A,Client A 根据接收到的 IP地址和端口号向 Client B 发起 TCP 连接 或发送 UDP 数据包。接下来 Client A 和Client B 之间便可以建立数据传输通道。

通信的双方都处于内网

两台主机进行通信,双方处在内网中

channel

两方都处于内网中,直接的通信是不能连通的。这时候就需要借助于,一个位于公网的服务器,来协助双方进行通信。
Client A首先向服务器提出连接请求,服务器将 Client A 的 IP地址和端口号对[155.99.25.11:51200]发给 Client B,并向 Client B 发出连接请求; Client B 收到服务器的连接请求后首先向[155.99.25.11:51200]发送一定数目的 UDP探测包或 TCP 连接请求,在 NAT B 上记录一下[155.99.25.11:51200]的 连接,Client B 随后向服务器回复连接完成;服务器在收到 Client B 的报告后将 Client B 的公网IP 地址和端口号对[110.10.33.10:5000],此时由于 NAT B 上已经留下了对应于[155.99.25.11:51200]方向的连接,Client A 向[110.10.33.10:5000]发出的数据包或连接请求将不会被丢弃。

NAT穿透的原理

NAT设备(或软件)维护一个状态表,用来把内部网络的私有IP地址映射到外部网络的合法IP地址上去。每个包头中的IP地址和端口信息在NAT设备(或软件)中都 被修改并翻译成一正确的IP地址发往下一级。当一个内网主机通过NAT打开一个“外出”的TCP或UDP会话时,NAPT分配给这个会话一个公网IP和端口,用来接收外网 的响应的数据包,并经过转换通知内部网的主机。这样,NAPT在[私有IP:私有端口]和[公网IP:公网端口]之间建立了一个端口绑定。

UDP内网穿透的实现流程

(1) 两个需要通过内网穿透进行通讯的内网客户端,分别将自己的外网收发接口注册给一个具有公网ip的中转服务器;
(2) 中转服务器将两个客户端注册的收发接口分别告知给对端;
(3) 一个内网客户端使自己的接收端口作为源地址,向对端的发送端口发送一个udp数据包,这个数据包称为打洞包。发送过这个打洞包后,可以在这个内网的出口 路由器上产生一条NAT记录,令后续从对端发送端口发来的数据包都不被丢弃, 而是转发给相应的内网客户端的指定端口;
(4) 发送过打洞包后,对端发送至本端路由器指定接收端口的数据包,就会根据NAT记录转发至本端的内网服务器接收端口,从而实现了内网服务器接收外网数据包的功能;
(5) 另一个内网服务器同样执行上述步骤 (3) 、 (4), 即可实现两端内网服务器相互收发音频数据包的功能。

最后附上一张完整的交互图片

channel

参考

【一分钟实现内网穿透(ngrok服务器搭建)】https://www.cnblogs.com/best/p/7465444.html
【内网穿透】https://baike.baidu.com/item/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F#reference-[1]-2066783-wrap