总论
当我们遇到一座山时,常规的方法是从山路上翻过去。当遇到没有山路情况,看似束手无策,实际上我们还可以走隧道。
隧道(Network Tunnel),就是将原本网络不支持的网络包,借助网络原本支持的机制来发送。“不支持”的原因有多种,“借助”的方式也有多种,“原本支持的机制”还是有很多种。下面会讲一些例子来具象化这种抽象概念。
总的来说,Tunnel 有如下作用:
- 在不兼容的网络上传输数据
- 在不安全网络上提供一个安全路径
- 隐藏私有的网络地址
IPv6 隧道
目前的趋势是 IPv6 代替 IPv4 ,想要发展 IPv6 存在一个困难,就是有可能有些区域网络只有 IPv4 而没有 IPv6 ,那么一个 IPv6 的网络包就无法通过这种不支持 IPv6 的网络。
我们可以采用 IPv6 隧道技术来解决,其示意图如下:

其实现就是在 IPv6 网络包外再封装一层 IPv4 的包头,然后用 IPv4 协议栈进行传播。
VPN 隧道
VPN (Virtual Private Networks) 其实本质上是一种提供公网 IP 访问私网 IP 的安全方式。其示意图如下:

其实现机制就是在私网上启动一个 VPN Server ,这个 Server 同时暴露在公网上,我们用隧道连接这个 Server 并让它作为 Proxy(是一种正向代理),进而访问私网里的其他机器。
那么为什么非得要用 Tunnel 呢?难道我们不能直接连接 VPN Server 吗?当然不能了,不要忘记 VPN Server 部署在私网上的,是不能随意访问的。我们必须用 Tunnel 这种非常安全且独立的方式来与之连接,这样才能确保安全性。
不过我们经常遇到的 VPN 其实是“梯子”,它并不被用来访问某个私网,而是被用来“翻墙”,其原理也是类似的,如下所示:

也就是说,我们把完整的互联网当作一个“私网”,这个私网因为墙的原因,我们是无法直接访问的。然后我们在这个私网(也就是互联网)上部署一个 VPN Server ,我们用 Tunnel 连接到这个 VPN Server 上,让它来代替我们访问私网,也就是互联网。
Tunnel 在其中的作用,就是搭建一个独立的通道,绕过传统的墙机制。
SSH 隧道
SSH 隧道和 VPN 隧道的设计很类似,都是为了借助一个代理来安全地访问其他私有资源。其不同在于,VPN 隧道是借助一个 IP 代理来访问私有 IP ,而 SSH 隧道是借助 22 号端口代理(SSH 的默认端口)来访问其他不公开暴露的其他端口。所以 SSH Tunnel 也叫做 SSH Port Forwarding 。
示意图中展示了当 3306 端口被 FireWall 禁止暴露后,我们可以在 22 端口处建立一个隧道,然后再访问 3306 端口上。

不过如果考虑到 NAT 技术,“端口”不再局限于当前 Server ,而是有可能代表其他 Server ,那么 SSH 隧道可以接触的资源就更多了。
SSH 隧道除了支持正向代理外(client 访问 server 的 private port),还支持一种“反向代理”(server 可以访问 client 的 port),我们可以使用这种方法让 server 使用我们自己笔记本上的梯子。