#37 RemoteAccessTech-010-Tunnel资源之引流技术两大流派

  • 0、篇首语
  • 1、从系统正常网络访问流程开始
    • 1.1、问题时间 – 内核态和用户态?
    • 1.2、回归正题:山寨还是劫道,这是一个选择
    • 1.3、小结
  • 2、虚拟网卡 VS Hooking
    • 2.1、兼容性比拼
    • 2.2、其他优劣势
    • 2.3、小结

0、篇首语

近段时间以来,收到反馈想让我讲讲接入技术的呼声一直很高,而且确实随着政策、疫情、攻防演练、业务发展、安全态势等多方面的影响,企业对于接入安全也越来越重视。

而安全业界而言,零信任理念近几年受多方加持越来越火热,不论各家的零信任如何包装粉饰,接入技术也是其无论如何也跳脱不开的基本线。

RemoteAccessTech系列不会讨论零信任理念本身,但是会尝试将远程接入技术拆开来尽量给大家讲清楚。

1)、RemoteAccessTech-001-从互联网边界接入说起

2)、RemoteAccessTech-002-VPN技术发展史浅析(上)

3)、RemoteAccessTech-002-VPN技术发展史浅析(下)

4)、RemoteAccessTech-003-理解隧道协议

5)、RemoteAccessTech-004-SDP也是一种SSL VPN?

6)、RemoteAccessTech-005-VPN隧道技术的核心流程

7)、RemoteAccessTech-006-WEB资源-典型Layer7 VPN

8)、RemoteAccessTech-007-WEB资源-非标web站点的适配困境

9)、RemoteAccessTech-008-WEB资源正向反向代理之争

10)、RemoteAccessTech-009-Tunnel资源-典型3层和4层代理介绍

1、从系统正常网络访问流程开始

在 RemoteAccessTech-005-VPN隧道技术的核心流程 中,我们提到VPN隧道协议的三大核心步骤,是 引流、传输、转发 ,所谓万事开头难,在此我们有必要重点介绍一下第一步,引流

我们先看一下操作系统的正常网络访问调用链,如下图。我们可以看到,从APP应用层,到网卡硬件发送数据包,至少要经过:

1)、用户态-系统网络库:比如说windows上最常用的ws2_32.dll,可以通过WSAConnect、WSASend、WSARecv等API进行socket收发建连等操作。

https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaconnect

2)、内核态-TCP/UDP协议栈:用于处理TCP/IP协议栈的数据流程,将数据包传递给网卡驱动以进行后续发送操作。在windows上是tcpip.sys。

3)、内核态-网卡驱动:通过中断和网卡硬件通信,在windows上一般被称为端口驱动,网卡相关的是NDIS.sys。

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图

注1:不同操作系统API、内核驱动会有所不同,暂不逐系统说明。

注2:为了简化理解,多层之间省略了一些内容。比如说windows在tcpip.sys之上就还有afd.sys(Ancillary Function Driver for Winsock)TDI(Transport Driver Interface)等。

1.1、问题时间 – 内核态和用户态?

计算机相关专业的读者想必很清楚了,这里简单解释一下。

内核态(Kernel Mode):内核运行在特权模式(Supervisor Mode)下,拥有最高的权限,比如能够访问所有软硬件资源(比如说访问物理内存、切换到任意进程访问其进程内存空间等)。该特权状态,被称为内核态。可加载在内核中运行的代码,被称为 内核驱动/扩展(Kernel Driver)

用户态(User Model):对应内核态,权限受到相应限制的受控运行状态被称为用户态。在用户态运行的代码,通常被称为 进程/应用

通常来说,内核态性能更高、兼容性相对更好(不需要面对复杂的应用环境),但是对可靠性要求很高,一旦出问题就可能蓝屏、BSOD。

1.2、回归正题:山寨还是劫道,这是一个选择

基于上述的调用链,此时各技术人员就开始发挥其纯朴的技术本质,开始思考如何解决问题:

问题 – 网络访问数据顺流而下,从用户态进程->用户态网络库->内核态协议栈->内核态网卡驱动->硬件,我们如何实现引流呢?

经过七七四十九天的思考,程序员们终端思考出了两个各有优劣的思路。

是的,想拿到网络流量也不是没有办法,山寨和劫道两条路,任选其一吧!

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图1

1.2.1、山寨流 – 虚拟网卡/系统扩展引流技术

山寨流的核心思路,是在内核态生成一个"虚拟"的网卡驱动模拟出一个山寨的网卡,吸引流量过来。如下:

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图2

通过山寨网卡(虚拟网卡) 的方式,结合配置路由引流,能将流量先引到虚拟网卡中,进行封装处理后,再进行代理转发。

通过虚拟网卡引流,普通用户可以很容易看到相关特征

1)、网络中增加虚拟网卡:windows可以在控制面板->网络和Internet->网络连接 看到新增的VNIC虚拟网卡。

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图3

mac/linux 则可通过ifconfig命令,查看 utunX 相关的新增虚拟网卡。

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图4

2)、通过路由表,可以看到引流的路由。下为macos上通过netstat -nr|grep utun显示并过滤utun的路由配置。

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图5

1.2.2、劫道流-Hooking/Filter引流技术

我们看到山寨流的动静是比较大(增加一个虚拟网卡),动作比较鲜明(修改了路由表,特征也很鲜明),颇有一种"光明磊落"的作派。

劫道流相对就会隐蔽得多了。劫道流的核心思路,是在网络访问的必经之路上,布下天罗地网,从中截流进行相应的篡改/处理

Hook/Filter引流 在实现层面上,分为用户态(或称应用层)内核态(或称内核层、驱动层) 处理。相较而言,应用层处理的兼容性问题会更多,更容易引发应用程序崩溃、异常,以及冲突;当前在Hook引流的模式中,通过过滤驱动实现的要更主流。

注:当然,也并不表示内核层过滤驱动就毫无兼容性问题,并不是0和1的关系,只是问题相较应用层大幅减少。

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图6

1.2.3、 Hooking and Filter

Hooking 也被称为挂钩、钩子编程,是一类通过软件拦截(包含应用层、内核层) 技术的统称,就是前面所提的劫道。劫道后,实际执行的挂钩代码,被称为Hook(钩子)

游戏外挂就是Hooking技术的典型应用。

注:Hooking相关解释也可参考 wiki ( https://zh.m.wikipedia.org/zh-hans/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B )。

Filter 则是相较于Hooking而言的,Filter通常是指通过软件(包含应用、内核、操作系统)提供的标准扩展机制,进行事务处理的技术。所以从广义上,Filter是Hooking技术的一种。

简单总结 ,Filter是更合法合规的Hook机制Hooking则包含了合法和不合法的机制

微软过滤驱动(Filter Drivers)的定义,过滤驱动是为设备增加价值或修改设备行为的可选驱动。

见:https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/filter-drivers 。

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图7

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图8

1.3、小结

实现引流,主要有两类技术:虚拟网卡/网络扩展技术Hooking/Filter技术

前者(虚拟网卡)的思路是模拟一个山寨版网卡,后者(Hooking)的思路是则在必经之路上,布下天罗地网拦截处理。

2、虚拟网卡 VS Hooking

那么这两种技术分别有什么优劣呢?应如何选择呢?

由于当前终端操作系统多种多样,主流系统就至少有 windows/macos/linux/android/ios五大类型,同时,linux至少可分为DEB系和RPM系,实质上至少可算六大类操作系统。

终端兼容性上的支持情况,对于终端类技术选型而言尤为重要

2.1、兼容性比拼

我们分别从操作系统兼容性、协议兼容性、驱动安装兼容性、软件环境运行兼容性四个方面来说明。

为了方便说明,我们还可以根据支持情况进行评分,大致规则为:完全支持5分,少量兼容性问题4分,部分支持3分,兼容性差1分。

1)、操作系统兼容性:指该方案是否支持某个操作系统。比如说从下图就可以看出,OS兼容性最优的是虚拟网卡方案,兼容所有系统(单项评分25分)。内核级过滤驱动对PC支持基本OK(单项评分13),但是应用层Hooking基本不可用(单项评分1分)。

2)、协议兼容性:指对所代理资源(应用)的协议兼容情况,比如说TCP、ICMPUDP等。从下图可看出,协议兼容性最优的同样是虚拟网卡方案,兼容所有协议(单项评分20)。内核级过滤驱动技术上主要是ALG场景无法支持(单项评分15分)。应用层Hooking由于兼容性太差,不参与评分。

3)、驱动安装兼容性: 指驱动模块首次安装的兼容性情况,如果兼容性较差,可能就会有一些终端无法安装,从而影响员工办公使用。从下图同样可看出,驱动安装兼容性最优的依然是虚拟网卡方案(单项评分24分),扣除1分是因为windows并非自带内核,需要安装,有少量兼容性问题。 Hooking-内核过滤驱动为12分(一个部分支持、一个支持、一个少量兼容性)。

4)、软件环境运行兼容性: 指在引流模块使用过程中,和其他驱动模块等的冲突可能。此处兼容性最优依然是虚拟网卡方案(25分)。Hooking-内核过滤驱动 则首先不支持android/ios,同时对macos也是部分支持,单项最终计分12分。

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图9

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图10

可以看到兼容性最终汇总总分,虚拟网卡(含网络扩展)方案为94分;Hooking-内核过滤驱动 为52分。可以看出虚拟网卡方案在综合兼容性是远远胜出的。

2.2、其他优劣势

兼容性是两者较为明显的差异,可以看到虚拟网卡明显占优。但是Hooking-内核过滤驱动又有何优势呢?

除兼容性外,剩下两个较为关键的是 引流模块的启动/加载速度,和转发性能

这两项是Hooking-内核过滤驱动明显占优。

对比项虚拟网卡方案Hooking-内核过滤驱动引流模块启动/加载速度 慢(通常3~5秒或以上) 快(1秒内) 客户端数据转发性能(1000M网卡)普通(TAP网卡大致在100Mbps-300Mbps,TUN网卡200Mbps~700Mbps)接近物理网卡(600Mbps~1000Mbps)开发成本两者基本接近两者基本接近

2.3、小结

总体而言,虚拟网卡(含系统网络扩展) 各类兼容性(协议兼容性、操作系统兼容性、驱动安装兼容性、软件环境运行兼容性)都还不错;

Hooking-内核过滤驱动启动速度、转发性能 则更占优势。

综合而言,较优方案是采用虚拟网卡技术来实现其全系统兼容。

如果想更优,则可以考虑针对量级最大、使用最广泛的windows终端,单独实现内核过滤驱动的方案,以增强其本地数据转发性能、服务启动速度

#37_RemoteAccessTech-010-Tunnel资源之引流技术两大流派插图11