论文部分内容阅读
【摘要】本文讨论并分析了Netfilter的功能框架、工作原理及数据包处理的实现机制,设计了在Netfilter框架中实现配电终端报文预处理的hook模块,实现去除通讯遥控报文数字签名的功能,为配网自动化的二次安防提供帮助,同时为其他通信应用中修改tcp包数据提供借鉴参考。
【关键词】Netfilter;hook模块;mangle函数;报文处理
引言
配电终端是典型的嵌入式设备,多基于linux系统,是配电自动化建设的重要组成部分。国家电网公司物资采购标准的专用技术规范中提出,配电终端应配备符合国调〔2011〕168号文件技术功能要求的非对称密钥技术单向认证模块,终端侧应能够鉴别配电主站(open3200)的数字签名。
配电主站与配电终端建立tcp连接后,以104规约通信,主站发往终端的重要104规约报文会单向加密并数字签名。本文hook模块设计的报文预处理功能正是用于终端侧,在通信报文到达终端前定位tcp数据包中的data区报文内容,对报文进行数字签名鉴别等预处理。
1.netfilter处理报文的流程
1.1 netfilter的框架
Netfilter是Linux 2.4版本引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为可能[1]。同时netfilter也支持用户自定义hook函数扩充以上功能。
Netfilter把数据包处理的更流程化,并且实现了扩展过滤策略而不必修改内核的功能[2]。该框架为每种网络协议( IPv4、IPv6等)定义了数据包处理过程,并定义一些钩子点(Hook) ,在内核中建立了一个函数指针链表,函数指针所指的函数称为钩子函数,其返回值告诉协议栈如何处理数据包[3]。
1.2 报文处理的实现原理
Tcp包经过netfilter时的处理流程以及各“钩点”如图1所示。
图1 数据包在netfilter中的处理流程
对于收到的每个数据包,都从“PRE_ROUTING”点进来,经过路由判决,如果是发送给本机的就经过“LOCAL_IN”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地不是本机,那么就经过“RORWARD”点,由“POST_ROUTING”点将该包转发出去。对于上层协议栈发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然后经过“LOCAL_OUT”点,最后也是顺着“POST_ROUTING”点将该包发送出去[4]。
2.netfilter下报文预处理功能设计与实现
2.1 报文预处理的功能设计
本文设计的报文预处理功能是在L inux内核Netfilter框架上开发的一个内核模块,具有tcp包勾取、识别、数据修改(加密或加数字签名)等基本功能,通过动态加载到
Linux内核中实现预处理功能。本文用到的钩子点是POST_ROUTING,在该点编写了相应的钩子函数,并进行注册和挂接,将tcp数据包钩出来进行处理再放回去。
通信tcp包在通过linux网关转发时由预处理hook程序进行处理,程序流程设计如 图2所示:
图2 程序设计流程图
2.2 报文预处理的hook函数实现
下文按图2流程介绍报文处理的hook函数部分源代码。
(1)hook函数定义如图3所示:
图3 hook函数定义
(2)获取存放当前tcp包数据的skb_buff:
图4 读取skb_buff
(3)判断数据包是否来自目标进程的端口号:
if (likely(ntohs(sport) = 5381)) {
return NF_ACCEPT;
} //判断主站进程端口号是否为538
(4)判断数据包是否需要处理
payload = (void *) skb->data + 40;
//+40是从data区偏移出 ip包头与tcp包头
if (*payload==0x68) {
//判断是否为104规约报文
if (*(payload+6)==0x2E) {
//判断是否为遥控报文
.......}
}
(5)取出tcp数据包中的应用层数据(data区)也就是实际的规约报文,存入replace字符串:
payload = (void *) skb->data + 40;
replace = payload ;
(6)如图5处理报文,以0x00替换16 L1 L2 16型数字签名,若想做其他处理都可以借助对指针字符串replace编程实现:
图5 替换尾端报文16 L1 L2 16
(7)重新封装tcp包,放入传输序列:
if (skb!=NULL) {
nf_nat_mangle_tcp_packet(skb,ct,ctinfo, 0,strlen(replace),(char*)replace,strlen(replace)); //重新封装tcp包 return NF_ACCEPT;
}
这里的mangle函数调用是整个hook功能实现的核心。 用于修复seq的hook函数如图6所示:
图6 修复seq
3.测试运行
本文实验环境是在windows系统下,用Linux虚拟机作为数据进出内网和外网的网关,报文预处理程序运行在该Linux虚拟机上,同时在该windows下用两个网络调试助手分别模拟外网主站与内网终端。内网终端与外网主站通过网关虚拟机交换数据,示意图见图7所示:
图7 模拟通信示意图
将104规约下的遥控报文68 0E 06 00 46 00 2E 01 06 00 01 00 01 60 00 82 16 77 74 16从模拟主站(Tcp server)发往终端(Tcp client),报文尾端16 77 74 16为简单数字签名。如图8所示:
图8 主站侧发出遥控报文
终端接受到报文如图9所示,可见报文的数字签名已被解除,由00 00 00 00替代,如果要对报文做其他处理,可以在程序中对指针字符串replace做相应的处理。
4.结论
本文基于netfilter防火墙提出了一种报文预处理方法,用于配电终端侧鉴别并处理配电主站(open3200)的遥控报文数字签名。本方法能够在传输网关准确定位到tcp包中的原始报文数据,可按用户需求对通信报文进行预处理,无需再在终端应用层进行报文处理,减轻了终端的处理压力、提高终端的响应速度。
图9 终端侧收到的遥控报文
本文设计亦可用于其他的tcp通信场合,提供了一种修改tcp包应用层data区数据的实现方法。
参考文献
[1]陈慧春.Linux操作系统网络协议栈的设计与实现研究. 成都:电子科技大学硕士论文,2004:44-47.
[2]岳新. Linux2. 4内核下基于Netfilter框架可扩展性研究与实现. 哈尔滨:哈尔滨理工大学硕士论文,2005.
[3]詹瑾,谢赞福. Linux内核netfilter包过滤防火墙的设计与实现[J].科学技术与工程,2010,10(18):4525.
[4]wjlkoorey,洞悉linux下Netfilter&iptables:什么是Netfilter[EB/OL].ChinaUnix.net,2012.
【关键词】Netfilter;hook模块;mangle函数;报文处理
引言
配电终端是典型的嵌入式设备,多基于linux系统,是配电自动化建设的重要组成部分。国家电网公司物资采购标准的专用技术规范中提出,配电终端应配备符合国调〔2011〕168号文件技术功能要求的非对称密钥技术单向认证模块,终端侧应能够鉴别配电主站(open3200)的数字签名。
配电主站与配电终端建立tcp连接后,以104规约通信,主站发往终端的重要104规约报文会单向加密并数字签名。本文hook模块设计的报文预处理功能正是用于终端侧,在通信报文到达终端前定位tcp数据包中的data区报文内容,对报文进行数字签名鉴别等预处理。
1.netfilter处理报文的流程
1.1 netfilter的框架
Netfilter是Linux 2.4版本引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为可能[1]。同时netfilter也支持用户自定义hook函数扩充以上功能。
Netfilter把数据包处理的更流程化,并且实现了扩展过滤策略而不必修改内核的功能[2]。该框架为每种网络协议( IPv4、IPv6等)定义了数据包处理过程,并定义一些钩子点(Hook) ,在内核中建立了一个函数指针链表,函数指针所指的函数称为钩子函数,其返回值告诉协议栈如何处理数据包[3]。
1.2 报文处理的实现原理
Tcp包经过netfilter时的处理流程以及各“钩点”如图1所示。
图1 数据包在netfilter中的处理流程
对于收到的每个数据包,都从“PRE_ROUTING”点进来,经过路由判决,如果是发送给本机的就经过“LOCAL_IN”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地不是本机,那么就经过“RORWARD”点,由“POST_ROUTING”点将该包转发出去。对于上层协议栈发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然后经过“LOCAL_OUT”点,最后也是顺着“POST_ROUTING”点将该包发送出去[4]。
2.netfilter下报文预处理功能设计与实现
2.1 报文预处理的功能设计
本文设计的报文预处理功能是在L inux内核Netfilter框架上开发的一个内核模块,具有tcp包勾取、识别、数据修改(加密或加数字签名)等基本功能,通过动态加载到
Linux内核中实现预处理功能。本文用到的钩子点是POST_ROUTING,在该点编写了相应的钩子函数,并进行注册和挂接,将tcp数据包钩出来进行处理再放回去。
通信tcp包在通过linux网关转发时由预处理hook程序进行处理,程序流程设计如 图2所示:
图2 程序设计流程图
2.2 报文预处理的hook函数实现
下文按图2流程介绍报文处理的hook函数部分源代码。
(1)hook函数定义如图3所示:
图3 hook函数定义
(2)获取存放当前tcp包数据的skb_buff:
图4 读取skb_buff
(3)判断数据包是否来自目标进程的端口号:
if (likely(ntohs(sport) = 5381)) {
return NF_ACCEPT;
} //判断主站进程端口号是否为538
(4)判断数据包是否需要处理
payload = (void *) skb->data + 40;
//+40是从data区偏移出 ip包头与tcp包头
if (*payload==0x68) {
//判断是否为104规约报文
if (*(payload+6)==0x2E) {
//判断是否为遥控报文
.......}
}
(5)取出tcp数据包中的应用层数据(data区)也就是实际的规约报文,存入replace字符串:
payload = (void *) skb->data + 40;
replace = payload ;
(6)如图5处理报文,以0x00替换16 L1 L2 16型数字签名,若想做其他处理都可以借助对指针字符串replace编程实现:
图5 替换尾端报文16 L1 L2 16
(7)重新封装tcp包,放入传输序列:
if (skb!=NULL) {
nf_nat_mangle_tcp_packet(skb,ct,ctinfo, 0,strlen(replace),(char*)replace,strlen(replace)); //重新封装tcp包 return NF_ACCEPT;
}
这里的mangle函数调用是整个hook功能实现的核心。 用于修复seq的hook函数如图6所示:
图6 修复seq
3.测试运行
本文实验环境是在windows系统下,用Linux虚拟机作为数据进出内网和外网的网关,报文预处理程序运行在该Linux虚拟机上,同时在该windows下用两个网络调试助手分别模拟外网主站与内网终端。内网终端与外网主站通过网关虚拟机交换数据,示意图见图7所示:
图7 模拟通信示意图
将104规约下的遥控报文68 0E 06 00 46 00 2E 01 06 00 01 00 01 60 00 82 16 77 74 16从模拟主站(Tcp server)发往终端(Tcp client),报文尾端16 77 74 16为简单数字签名。如图8所示:
图8 主站侧发出遥控报文
终端接受到报文如图9所示,可见报文的数字签名已被解除,由00 00 00 00替代,如果要对报文做其他处理,可以在程序中对指针字符串replace做相应的处理。
4.结论
本文基于netfilter防火墙提出了一种报文预处理方法,用于配电终端侧鉴别并处理配电主站(open3200)的遥控报文数字签名。本方法能够在传输网关准确定位到tcp包中的原始报文数据,可按用户需求对通信报文进行预处理,无需再在终端应用层进行报文处理,减轻了终端的处理压力、提高终端的响应速度。
图9 终端侧收到的遥控报文
本文设计亦可用于其他的tcp通信场合,提供了一种修改tcp包应用层data区数据的实现方法。
参考文献
[1]陈慧春.Linux操作系统网络协议栈的设计与实现研究. 成都:电子科技大学硕士论文,2004:44-47.
[2]岳新. Linux2. 4内核下基于Netfilter框架可扩展性研究与实现. 哈尔滨:哈尔滨理工大学硕士论文,2005.
[3]詹瑾,谢赞福. Linux内核netfilter包过滤防火墙的设计与实现[J].科学技术与工程,2010,10(18):4525.
[4]wjlkoorey,洞悉linux下Netfilter&iptables:什么是Netfilter[EB/OL].ChinaUnix.net,2012.