内网穿透
定义
首先来说一下常见的网络通信,内外网通信。
假如目前有内网客户端A,外网客户端B,网关nat,因为网络不在同一个网段内,所以内外网是无法直接连接的,但是网关nat充当着中间人的角色,就实现了内外网通信的功能。
A要连接B,消息发到 nat 时 nat发现是要连接到外网, 就自己建立一个socket去连接 B, 从此以后 A发过去的数据都会被修改包头中的本地地址为 nat的地址, 然后发出去 。 所以 B 实际上一直以为 是nat在给自己发东西。
B要给A发数据, nat收到以后就会把包头中的目标地址改成内网地址,然后发给A,而A则实际上一直是在跟nat发数据。
这是内网和外网进行通信,那么问题来了,如果两个不同的内网之间可以直接通信吗?两个不同内网间建立连接(即内网穿透)。
答案是肯定不能的,因为两个内网程序都不知道对方外网的外网地址,所以无法连接。那怎么办呢?这时我们就找来一个新角色,一个外网客户端N。
内网 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了.....
实现方式
代理穿透
原理示意图:
优势:
- 保持100%穿透成功率
- 用户无需公网IP
不足:
- 运营方提供公网访问入口,硬件投入大
- 带宽要求高,免费用户往往会被限速,产生免费使用上的“鸡肋”
直接穿透
优势:
- 自主可控,无需第三方转发
- 保持100%穿透成功率
不足:
- 服务端必须具备公网IP
- 带宽取决于服务端和客户端两者的最小带宽(面向云主机带宽不友好,主要是贵!死贵!!)
- 由于直接暴露在公网,会有安全问题
- 需要自己搭建,门槛较高
P2P穿透
原理示意图:
优势:
- 点对点,能最大化使用带宽,使用感知友好
不足:
- Ipv4环境下成功率取决于NAT类型,移动网络(3G/4G下)基本没戏
- Ipv6环境下成功率高,取决于防火墙策略(防火墙穿透)
- 几乎全基于UDP协议或其衍生自定义协议,安全性和可靠性或多或少存在缺陷
SSH隧道穿透
原理示意图:
常用工具
| -/- | 代理穿透 | 直接穿透 | P2P穿透 | 自主代理 | 公网IP | 备注 |
|---|---|---|---|---|---|---|
| 花生壳 | YES | NO | NO | NO | 不需要 | 限速到怀疑人生 |
| teamviewer | YES | NO | NO | NO | 不需要 | 烦人的商用提示 |
| Ngrok | YES | YES | NO | YES | 需要 | |
| Frp | YES | YES | YES/UDP | YES | 需要 | 三种方式选其一 |
| smarGate | YES | YES | YES/TCP | YES | 不需要 | 同时支持,P2P优先 |