1. 什么是SSL VPN
SSL VPN (Secure Sockets Layer Virtual Private Network) 通过SSL协议进行加密传输的VPN即可称之为SSL VPN,可通过Web浏览器或重型客户端(OpenVPN,AnyConnect)访问。它允许用户使用正确的Web浏览器或客户端从任何计算机建立与Intranet的安全连接。
最初的SSL VPN,其实是指纯web、免客户端(clientless)的VPN,其实现原理为HTTPS反向代理,主打是避免繁琐的客户端安装过程。
2. SSL/VPN的应用场景和技术演进
SSL VPN的核心应用场景是Point-to-Site终端远程接入场景,用于员工接入。
SSL/VPN有两种类别:
-
SSL Portal VPN: 这是最初的SSL VPN,可称为7层SSL VPN。是可以通过纯浏览器、无需额外安装其他客户端(clientless)的方式访问web站点,通过SSL/TLS进行加密传输。
劣势:不支持非web协议,如RDP、SSH及其他本地CS客户端访问内网业务。 -
SSL Tunnel VPN : 通过对4层TCP或3层IP包进行隧道转发,以支持RDP、SSH及其他CS客户端应用,按转发层次不同,分为4层(Layer 4)或3层(Layer 3)SSL VPN。
劣势:需要安装客户端,丢失了免客户端特性(clientless)。
从实际的演进中,在SSL VPN早期,以WEB化免客户端为主打价值,除了WEB(HTTP、HTTPS)的7层代理外,还会额外支持类似FTP/NFS/SMB代理,以实现文件共享需求;甚至还有基于可自动安装的浏览器的插件(如IE ActievX插件)来实现加密端口转发,从而使得CS资源也可访问(RDP、SSH等)。
到SSL VPN中后期,在Point-to-Site战场基本上大局抵定后,各厂商的SSL VPN实际也转变为了以Tunnel VPN为主打。
从基于浏览器的SSL Portal VPN,切换为基于客户端的SSL Tunnel VPN的这个变化,主要是几个因素:
-
SSL Client下载安装体验被接受:SSL VPN支持在web portal页面下载并安装客户端,下载安装比IPSEC容易;下载后登录体验也比IPSEC VPN客户端简单。虽然丢失了免客户端(Clientless)特性,但是仍然可被接受。
-
跨浏览器、非windows操作系统群雄并起,基于IE的ActievX插件方案受限:ActievX插件机制只能适应IE,兼容性不足。多操作系统场景也不断增加(如Mac OS/Android/IOS),并非只使用windows。而ActiveX插件只支持IE,使用面越来越局限,最终浏览器插件机制被淘汰。
3. 隧道协议
3.1 隧道协议
隧道协议会分为 传输协议(Transport Protocol)、封装协议(Encapulation Protocol)、乘客协议(Passenger Protocol) 三个部分,同时其过程非常类似于货运过程。
- 物流快递:收件、运输(需要加固、装车、卸车)、派送 三步曲。
- 隧道转发:引流、传输(需要加密、封装、解封装)、转发 三步曲。
引流:将需要转发的访问流量,捕捉起来,以便进行加密传输。类似于收件揽件。一般引流技术有路由表、虚拟网卡、hooking、配置透明代理等。
传输:通过代理网络线路,将封装后的业务流量,加密传输至Proxy Server。类似于快递运输。
转发:Proxy Server收到待转发流量后,转发给目标业务Server。 类似于快递派送。
3.2 SSL/VPN 工作层次
有时候我们一聊协议,很容易就问到,“XX VPN”是OSI第几层的?
其实这个要区分,到底是指 传输协议(Transport Protocol) 所处的OSI层,还是指 乘客协议(Passenger Protocol) 所处的OSI层次。
对于SSL VPN来说,传输协议都是SSL,乘客协议根据其资源类型不同,数据代理能力上同时支持Layer 3、Layer 4、Layer 7。
- WEB资源:乘客协议是7层。
- TCP资源/代理资源/端口转发资源:多数情况下,这些模式下,只能发布TCP的IP域名。
- IP资源: 该模式一般能够发布UDP、TCP的IP域名+端口,通常还可以支持ICMP。乘客协议为3层。
3层代理的技术流程
- 认证登录成功:PC客户端上安装好的认证模块,向SDP-Controller通信并完成认证登录,确认其安全性。
- 获取SDP策略:认证登录成功后,需要向SDP-Controller获取相关策略,比如资源列表、隧道模式以及其他相关的策略配置。
- 初始化隧道(阶段1):本地操作,初始化虚拟网卡,包括设置虚拟IP、设置路由等
- 初始化隧道(阶段2):根据延迟、丢包选路等策略,选择一个有效的SDP-Gateway初始化隧道连接,便于后续快速转发3层IP数据包。
- APP发起访问请求:本例中为浏览器,发起对内网业务OA的访问请求。
- 抓取IP数据包:SSL/VPN客户端-Layer3Tunnel模块负责从虚拟网卡/网络扩展中,提取出IP数据包,以供转发。
- 加密转发数据包:SSL/VPN客户端-Layer3TunnelLayer3Tunnel模块负责将IP数据包,加密转发至SDP-Gateway。
- 鉴权并代理转发:SDP-Gateway经过鉴权流程后,向真实业务(如OA) 正式转发IP数据包请求。
4层代理的典型流程
在关键流程上,4层代理和3层代理相当接近。在流程上通常是有几步有所不同:
- 差异1:3层代理通常是提前建立隧道,后续直接转发IP数据包;而4层代理,则是当APP应用发起请求时,才建立隧道。
- 差异2:引流技术有差异,3层代理通常使用虚拟网卡/系统网络扩展,而4层代理则通过网络过滤驱动。
- 差异3:虚拟IP机制有所差异。3层代理直接转发IP数据包,通常为了保证IP包的完整性,是将虚拟IP设置到虚拟网卡中,即设置到PC终端上。4层代理则调整为在SDP-Gateway中进行设置(根据策略不同,既可以设置虚拟IP,也可以使用代理网关IP作为源IP进行访问)。
4. 代理技术
传统SSL VPN通过4层端口代理的方法实现,代理服务器根据应用协议的类型(如http,telnet等)做相应的端口代理,客户端与代理服务器之间建立SSL安全连接,客户端与应用服务器之间的所有数据传输通过代理服务器转发。
在提到代理能力时,有一个经常被问及的问题:“XX资源是正向代理还是反向代理?”
4.1 正向代理
为Client工作的称之为正向代理,对客户端负责,最基础的作用是 隐藏真实客户端。自然世界中,正向代理的场景类比有 代购、跑腿 ,以及电影名场面:“请和我的律师谈”。
- 代理客户端上网:比如说内网多台PC,通过指定一台代理网关代理可访问互联网。
- 客户端匿名上网:实现匿名化访问,让服务方(Server)无法知道真实访问者身份。
不论是代理上网还是匿名上网场景,因为正向代理是为客户端服务的,所以客户端事先都需要要知道正向代理的存在。在代理上网场景,可能表现为 浏览器的代理设置中要填写 正向代理的地址等信息;
4.2 反向代理:
为Server 工作的称之为反向代理,对服务端负责,最基础的作用是 隐藏真实服务端。自然世界中,反向代理的场景类比,较典型的就是 长租公寓平台 ,可以简单理解为是 规模化的二房东。
反向代理 则是 位于一个或多个WEB服务器前面的代理服务,用于代理客户端的网络请求,防止客户端直接访问服务器。
参考 wiki ( https://en.wikipedia.org/wiki/Proxy_server#Forward_proxies ),可以看到反向代理典型用途如下:
- SSL加密/ SSL卸载:通过前置代理网关,对互联网发布HTTPS站点,后端内网服务只需要实现http,即可实现对外SSL加密、对内SSL卸载。
- 负载均衡:比如说 OA业务有3台Server服务器,3个内网IP,通过代理网关进行轮询负载,能够既对互联网提供统一服务、对内实现多服务器间的负载均衡调度。
- 缓存/加速:通过前置代理,对静态资源(css、js、图片、视频等)进行缓存和加速,降低真实业务Server的性能占用。
- 防DDOS:当前一些抗DDOS防护,也会采用7层防护,如Cloudflare的CDN,就可通过全球的CDN代理节点,可对7层资源进行DDOS防护。
如果正向代理相关场景,是客户端需要感知到正向代理的存在;相对应地,反向代理场景,则是服务端需要感知到反向代理的存在,感知项包括如:域名解析需要调整至反向代理、SSL证书需要配置至反向代理等等,需要完成一定的前置配置。
4.3 正向代理和反向代理在vpn上的应用
最初的SSL/VPN更多是正向代理(转发代理,Forward Proxy)技术思路的延展。
正向代理的一些特征:
- 一个互联网入口,即可代理访问多个不同的目标业务
- 不依赖于公网域名:如下gif图, croxyproxy 是使用IP提供的访问代理服务,也可以正常实现访问代理。
基于正向代理的WEB资源,最核心需要解决的问题,是一个公共入口下,如何区分目标业务系统。主流方案是基于参数区分:比如说 https://125.93.20.90/?__origin=BASE64(源站地址) 。比如:Proxyium所使用的机制。
近几年包含WEB资源的SDP/SSLVPN产品,默认都采用了反向代理的机制去实现。切换为反向代理后,最大的差异是采取多域名方案,实现一站一域名。反向代理型WEB资源,通常会选择主要的中间件,如apache、nginx,以后者居多。
5. OpenVpn
OpenVPN是近年来新出现的开放源码项目,实现了SSL VPN的一种解决方案。
传统端口代理(4层代理)实现方式烦琐,应用范围也比较窄,对每个需要代理的端口进行单独配置;对于每个需要用到动态端口的协议都必须重新开发,且在代理中解析应用协议才能实现代理,如FTP协议;代理服务器前端的防火墙也要根据代理端口的配置变化进行相应调整。
OpenVPN以一种全新的方式实现了SSL VPN的功能,克服了传统SSL VPN的一些缺陷,扩展了应用领域,并且防火墙上只需开放TCP或UDP协议的一个端口。
5.1 虚拟网卡(tun)
对虚拟网卡的使用是OpenVPN实现其SSL VPN功能的关键。
在Linux2.4版本以上,操作系统支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动。文章来源:https://www.toymoban.com/news/detail-847593.html
- 网卡的驱动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,
- 用户进程通过调用字符设备接口read获得完整的IP数据包,字符驱动read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;
- 反过来字符驱动write函数给用户提供了把用户态的数据写入核心态的接口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,
- 作为系统的虚拟网卡,也具有和物理网卡相同的特点:能够配置IP地址和路由。
5.2 数据包的处理过程
TUN设备连接的是主机内核协议栈IP层,客户端使用openvpn访问web服务流程:文章来源地址https://www.toymoban.com/news/detail-847593.html
- 客户端启动openvpn client进程连接openvpn server
- server下发路由条目到客户端机器路由表中,同时生成虚拟网卡tun1(tun设备,openvpn client进程与openvpn server一样会注册tun虚拟网卡)
- 客户端通过浏览器访问web服务
- 浏览器生成的数据包在协议栈IP层进行路由选择,决定通过虚拟网卡tun1发出
- 虚拟网卡tun1另一端连接用户层openvpn client进程
- openvpn client进程收到原始请求数据包
- openvpn client封装原始请求数据包,通过udp协议发送vpn封包到openvpn server上的9112端口
- openvpn server上的openvpn进程收到vpn封包,解包,写数据到/dev/net/tun
- 文件描述符/dev/net/tun与虚拟网卡tun0关联,主机从tun0网卡收到数据包
- 主机进行Routing decision,根据数据包目的IP(用户访问web网站IP地址)从相应网卡发出
到了这里,关于SSL/VPN远程接入技术架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!