内网穿透的基本概念

150 阅读3分钟

内网穿透

定义

首先来说一下常见的网络通信,内外网通信。

1131692-20170323163000252-951437233.png

假如目前有内网客户端A,外网客户端B,网关nat,因为网络不在同一个网段内,所以内外网是无法直接连接的,但是网关nat充当着中间人的角色,就实现了内外网通信的功能。

A要连接B,消息发到 nat 时 nat发现是要连接到外网, 就自己建立一个socket去连接 B, 从此以后 A发过去的数据都会被修改包头中的本地地址为 nat的地址, 然后发出去 。 所以 B 实际上一直以为 是nat在给自己发东西。

B要给A发数据, nat收到以后就会把包头中的目标地址改成内网地址,然后发给A,而A则实际上一直是在跟nat发数据。

这是内网和外网进行通信,那么问题来了,如果两个不同的内网之间可以直接通信吗?两个不同内网间建立连接(即内网穿透)。

答案是肯定不能的,因为两个内网程序都不知道对方外网的外网地址,所以无法连接。那怎么办呢?这时我们就找来一个新角色,一个外网客户端N。

1131692-20170323165012783-606808059.png

内网 LA、LB 网关 natA,natB 外网 N,LA 要连 LB。LA先通过网关ntaA连接N,LB通过网关ntaB也连接到N。然后 LA在N那里得到了LB的地址(实际上就是natB的地址)。但是直接给natB发东西不行的。

因为一个socket只能给一个socket发东西,而这时natB是在跟N发东西的。于是这时候LA就给N说,你让LB来连接我吧!

然后N对LB说,你再开一个连接出来,于是N就有了LB的另一个地址LBADDR,然后告诉LA。LA这下就可以连接LB了,因为LBADDR是一个外网地址,也就是natB的地址。而natB是知道这个地址是要转发给LB的。

这样就OK了.....

实现方式

代理穿透

原理示意图:

438b4d0838ec990277d3f03fc8b6590e973d511b.png 优势:

  • 保持100%穿透成功率
  • 用户无需公网IP

不足:

  • 运营方提供公网访问入口,硬件投入大
  • 带宽要求高,免费用户往往会被限速,产生免费使用上的“鸡肋”

直接穿透

f3ebadb273420fe305c64cd727b0414f16626f3a.png

优势:

  • 自主可控,无需第三方转发
  • 保持100%穿透成功率

不足:

  • 服务端必须具备公网IP
  • 带宽取决于服务端和客户端两者的最小带宽(面向云主机带宽不友好,主要是贵!死贵!!)
  • 由于直接暴露在公网,会有安全问题
  • 需要自己搭建,门槛较高

P2P穿透

原理示意图:

4a27c4f589245f8c0296df8de11da02e1dcaa32d.png

优势:

  • 点对点,能最大化使用带宽,使用感知友好

不足:

  • Ipv4环境下成功率取决于NAT类型,移动网络(3G/4G下)基本没戏
  • Ipv6环境下成功率高,取决于防火墙策略(防火墙穿透)
  • 几乎全基于UDP协议或其衍生自定义协议,安全性和可靠性或多或少存在缺陷

SSH隧道穿透

原理示意图:

常用工具

-/-代理穿透直接穿透P2P穿透自主代理公网IP备注
花生壳YESNONONO不需要限速到怀疑人生
teamviewerYESNONONO不需要烦人的商用提示
NgrokYESYESNOYES需要
FrpYESYESYES/UDPYES需要三种方式选其一
smarGateYESYESYES/TCPYES不需要同时支持,P2P优先