基于Net filter的IPSec实现方案
孙彭 孟晓景
摘 要 IPSec作为新一代网络安全协议,为网络传输提供了安全保证,使端到端的数据保密成为可能。本文在深入研究IPSec协议和Net filter框架的基础上提出了在Linux系统下基于Net filter框架的IPSec实现方案。
关键字 IPSec Net filter AH ESP
1 引言
因特网技术的不断发展和日渐完善,使得网络成为人们数据传输、通讯和信息共享的重要手段,但安全问题也随之大量涌现。针对安全问题,IETF工作组于1998年正式制定并发布了一套在网络层提供IP安全性的协议:因特网安全协议IPSec。它提供了一种标准的、健壮的包容广泛的机制,为IP及上层协议提供安全保证,使得端到端的数据保密成为可能。在Linux系统下,Net filter由于其功能强大并与内核完美结合,迅速成为Linux平台下进行网络应用扩展的主要利器。本文对IPSec协议和Net filter框架进行分析,并给出IPSec在Linux系统下利用Net filter框架的实现方案。
2 IPSec协议简介
IPSec是互联网上的新一代安全标准。提供包括访问控制、无连接的完整性、数据源认证、抗重放 (replay)保护、保密和有限传输保密性在内的服务,服务基于IP层并对IP及上层协议进行保护。服务的实施通过两种通信安全协议:认证头(AH)和封装安全负载(ESP)以及Internet密钥交换(IKE)协议来达到这些目标。
IP AH协议提供数据源认证、无连接的完整性和可选的抗重放服务。ESP协议提供数据保密性,有限的数据流保密性、数据源认证、无连接的完整性及抗重放服务。IKE协议用于协商AH和ESP协议所使用的密码算法,并将算法所需的必备密钥放在合适的位置。IPSec有两种模式:传输模式和隧道模式。它们都是对外出的数据包添加IPSec头进行加密和认证,而对于接收的IPSec数据包作解密认证处理和适当的转发传送。
3 Net filter总体结构
Netfilter/iptables系统是linux2.4.x系列内核中提供包过滤、网络地址转换(NAT)和其他数据包处理服务的一个框架系统。Net filter框架不对协议作直接的改动,它为每一个协议都定义了一套钩子点,其中IPv4定义了5个钩子点,在这些钩子点上,我们可以添加自己的处理函数,根据处理的返回值由框架决定数据包的下一步流向。利用NF_REGISTER_HOOK函数将自己的处理函数注册到相应的钩子点,并且可以在同一个钩子点挂载多个处理函数,处理的先后次序通过指定函数的优先级来决定。当有包经过时,内核就会用NF_HOOK这个函数来调用注册函数。IPV4数据包在Net filter框架上的流经过程如图1所示:
图 1 数据包在netfilter框架上的流经过程
数据包自网卡进入,通过简单的“santity”校验(如:无截断,IP校验等)到达NF_IP_PRE_ROUTING钩子进行注册函数处理,然后进入路由模块决定数据包是否需要转发。本地包在分段重组之后,调用NF_IP_LOCAL_IN钩子点的注册函数进行处理,之后发送到上层应用。而转发包则调用NF_IP_FORWARD钩子点的注册函数,在决定是否需要分片后,进入NF_IP_POST_ROUTING钩子点,它是所有外出的数据包都必须经过的钩子点,
调用注册函数之后,发送到网络。本地外出包在创建时会调用NF_IP_LOCAL_OUT钩子点,尽管不同的上层协议包会走不同的流程,但是它们都要经过NF_IP_POST_ROUTING钩子点才能进入网络。
当我们进行数据包处理时,可以在适当的钩子点添加相应的函数,注册在这些钩子点上的函数监听着钩子,当某个钩子点被激活时,在此注册的函数就可以对数据包进行相应的操作处理了
4 IPSec在Linux下的实现
4.1 实现思想
IPSec协议文档提供了三种实现模型:
(1) 堆栈中的块(BITS),即IPSec处理模块作为一个楔子实施,插入在IP层和TCP层之间,并提供与Linux内核的接口。其优点在于IPSec处理模块独立于内核,对内核几乎没有改动,但是此方案需要重复的处理数据包,效率很低。
(2) OS集成,修改Linux内核将IPSec与IP层整合为IP+IPSec层,形成新的、具有IPSec处理功能的IP层处理。优点是处理效率高。不足之处在于实现较为困难,OS系统本身对其具有很大的限制。
(3) 线中的块(BITW),通过硬件来实施IPSec协议。
我们知道IPSec协议是一个IP层协议,要实现IPSec必须修改IP层的工作流程,即在IP层的工作流程中加入IPSec处理。Net filter框架为我们提供了连接到内核的处理数据的钩子函数,我们完全可以利用它,在相应的钩子点添加IPSec处理模块。这样既可以避免真正修改内核中IP层的处理流程,又可以快速,高效的实现IPSec处理。
4.2 IPSec实现
4.2.1内核模块的初始化
模块的初始化是最基本也是最根本的工作:在内核中注册一些基本的数据结构、协议、钩子函数,这样在需要的时候,内核才可以调用相应的钩子函数进行数据处理。内核模块的初始化主要包括两部分:内核的初始化和IPSec模块的初始化。
(1)内核的初始化
Net filter框架属于内核编程模式,内核的初始化是处理内核的嵌入的操作,主要是调用ipsec_init(),ipsec_clean()函数
(2)IPSec模块的初始化
l SAD和SPD数据库的初始化:主要完成SADB和SPDB的相关数据结构的定义及初始化。
l 注册AH和ESP协议:包括登记AH和ESP支持的算法便于以后的处理,注册PF_KEY协议族。
l 登记处理数据包的入口点,通过ipsec_add_hook()函数进行,包括策略处理模块、输入处理模块和输出处理模块。
4.2.2钩子点函数设置
(1)策略处理模块
该模块注册在Net filter框架的NF_IP_PRE_ROUTING钩子点处。对进入的IP包进行必要的检查如:IP包的长度、版本、校验和等。决定IP包是丢弃还是进入安全网关。
(2)输入处理模块
该模块注册在Net filter框架的NF_IP_LOCAL_IN钩子点处。进入安全网关的IP包,在经过内核对包的处理如:分片重组后,激活NF_IP_LOCAL_IN钩子点,将数据包送往输入处理模块。在此模块中,发往本机的非IPSec包直接送往传输层处理。而对于IPSec包,需要确定通信双方协商的SA,查询安全关联库(SAD)和安全策略库(SPD),根据指定的IPSec协议(AH或ESP)、算法和密钥进行认证或解密处理,并去掉IPSec头。处理完成后,数据包需要重新组装成IP包,并由路由程序决定该包是发往本机或转发。IPSec输入处理如图2
图 2 IPSec输入处理
(3)发送处理模块
送处理模块注册在Net filter框架的NF_IP_FORWARD,NF_IP_LOCAL_OUT钩子点处。
对于通过输入处理模块且需要转发的数据包,在转发处理后,调用NF_IP_FORWARD钩子点的发送处理模块。在此模块中,先根据IP包的相关信息查找SPD,找到该包的外出策略,确定对IP包的处理:直接通过、进行IPSec处理、丢弃及进行SA协商。IPSec包丢弃,发往内网的非IPSec包直接进行发送处理,对于发往外网的非IPSec包则根据策略进行加密认证处理。需要IPSec处理的包,首先查找SAD取得包所对应的SA,找不到SA的情况下通过触发IKE守护进程进行安全关联协商。在确定SA之后根据SA指定的协议对数据包进行认证、加密等处理。处理完成,数据包重新进行IP封装并根据路由进入网卡。
安全网关生成的IP包在Net filter框架的NF_IP_LOCAL_OUT钩子点处调用发送处理模块。在模块中,根据策略确定数据包的处理。不需要IPSec处理的包直接进行发送,对于要求IPSec处理的包,则策略指定进行认证、加密处理。IPSec发送处理如图3
图 3 IPSec发送处理
5 总结
IPSec作为一个复杂的安全体系,广泛的应用于VPN、路由安全等领域。在这里,本文提出一种基于Net filter框架的IPSec实现方案。它利用Net filter框架提供的钩子机制接入系统内核,将数据包从内核IP栈中提出,根据IPSec协议对包进行安全处理后重新注入内核,这样既避免了直接修改内核的源代码,又避免重复实现IP层的处理,产生通讯的瓶颈。同时,这种方式具有良好的灵活性和可扩展性,编程方便,执行效率高,是实现VPN网关系统完善高效的方案。
参考资料
[1] 周巍松.Linux系统分析与高级编程技术[M]. 第一版,机械工业出版社,1999
[2] NaganadDoraswamy,DanHarkins.IPSec:新一代因特网安全标准.京京工作室译,机械工业出版社,2000.1
[3] RustyRussell.LinuxnetfilterHackingHOW
TO. 2002.2