在现在的互联网上传输数据,首要考虑的就是安全。这关乎到你的隐私,个人信息,财产安全等等重大问题。如果你的程序本身传输的信息没有加密,也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的,即数据先通过源端代理,让你的所有通信数据都加密,然后到达目的后再使用目的端代理进行解密后转发给目标进程。即加密隧道的简单示意图如下所示:
加密隧道的始末即为源端代理和目的端代理。其中数据发送进程和源端代理可以是同在一个主机的不同进程,也可以是分属不同的主机。目的端代理和数据接收进程也一样。如果你也不希望你的数据有任何的明文信息在互联网上传输,你就可以使用加密隧道技术。当然,如果你的数据发送进程和数据接收进程之间的网络通信本身就是加密的,那就不用借助中间的代理环节。
这种独立于应用本身的加密隧道技术,有一个很明显的优点是它对收发数据的双方完全透明,收发数据的双方不需要任何的变更。另外收发数据的应用因为不用处理加解密数据,应用本身的开发的难度和复杂度也会降低,间接达到解耦的目的。
加密隧道的应用
这种加密隧道的一个典型应用是是对http代理的数据进行加密。http代理本身是可以既代理http协议数据,也可以代理https数据的,但是http代理协议的头部还是明文传输的。比如你的浏览器需要通过http代理访问www.bing.com,那么,浏览器发给http代理的协议数据是下面这样的:
Ncat: Connection from 192.168.56.1:51472.
CONNECT www.bing.com:443 HTTP/1.1
Host: www.bing.com:443
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
你会发现这完全是明文传输,只要在中间传输的环节截获你这个报文,就知道你要访问的是哪个网址,如果你要访问的地址被认为非法,那么你的报文会直接被丢弃。上面的http头部和普通的http头部有点区别的就是使用的CONNECT方法,这个方法指示代理服务器,让其代理访问目标主机。所以这种也称为CONNECT代理。
此时就可以使用加密隧道技术,把处于浏览器到代理服务器之间的数据都加密传输。 例如可以在本地局域网的网关部署一个加密隧道源端代理,在http代理服务器机器上或者在其局域网内部署一个加密隧道的目的端代理,目的代理解密后的数据全部转发给http代理服务器。那样我们浏览器的数据就不会在因特网上明文传输了。
加密隧道技术的实现
这种独立于应用本身的加密隧道技术,还是有不少的。
1、stunnel
第一种加密隧道技术,当选stunel。stunnel应该能达到企业级的应用标准,stunnel的设计初衷就是为了单纯的建立加密隧道,当然可以覆盖所有场景。stunnel这个我目前还在使用。具体的应用可以参考我的另一篇博文:stun