第28卷第16期Vol.28
No.16
计算机工程与设计
ComputerEngineeringandDesign
2007年8月Aug.2007
Linux内核扩展模块的P2P流量控制方法与研究
陈海军1,王四春2,叶
晖3
(1.湖南商学院现代教育技术中心,湖南长沙410205;2.湖南商学院信息系,湖南长沙410205;
3.湖南商学院招生就业指导处,湖南长沙410205)
摘
要:分析了LinuxNetfilter/Iptables架构的实现机制和扩展技术,以及P2P协议的特征,通过扩展Linux内核库,利用共享库实现用户数据空间与内核空间的数据交互,扩展防火墙的规则集,从而实现P2P流量控制的方法,而且可以根据不断出现的P2P业务更新规则集,具有很好的扩充性能。
关键词:防火墙;内核空间;用户空间;扩展;规则集中图法分类号:TP393.08
文献标识码:A
文章编号:1000-7024(2007)16-3912-03
ResearchandtechniqueofP2PflowcontrolbasedonLinuxkernelexpandedmodel
CHENHai-jun1,
WANGSi-chun2,
YEHui3
(1.ModernEducationTechnologyCenter,HunanBusinessCollege,Changsha410205,China;2.DepartmentofInformation,
HunanBusinessCollege,Changsha410205,China;3.DepartmentofEnrolmentandEmployment,
HunanBusinessCollege,Changsha410205,China)
Abstract:AnalysisofthemechanismandtheexpansionoftechnologyforLinuxNetfilter/Iptables,thecharacteristicsoftheP2Pprotocol.ThroughexpandingkernellibbasedontheLinuxsystem,userdataspaceandkernelspacedatainterchangeareimplementedthroughsharinglib,firewallruleisexpandedtoimplementP2Pflowcontrol.AndaccordingtoemergingP2Pbusinesstoupdatetherulesset,withthegoodperformanceofexpansion.
Keywords:firewall;kernelspace;userspace;expanding;ruleset
0引言
运行环境。
Linux内核中已经提供了对P2P流量感知的模块IPP2P,可以结合IPTables防火墙以及tc带宽功能来识别、控制BT、EDonkey等P2P协议流量[2]。
本文将介绍基于Linuxnetfilter/Iptables架构实现机制和扩展技术,在此基础上提出了扩展匹配选项实现防火墙的P2P流量控制功能,扩充后的IPP2P可以根据P2P协议特征进行流量控制,并且可以将其转化为防火墙规则实现规则集的有效扩充。
P2P改变了互联网以大网站为中心的状态,重返“非中心化”,使得网络资源共享变得更加容易、直接[1]。
在P2P应用逐渐普及的过程中,传统网络设备处理P2P带宽问题,逐渐暴露出以下缺点:
(1)阻塞P2P常用端口。此方法一方面有可能拒绝正常通信,另一方面导致P2P应用转向使用随机端口和专用端口躲避检查;
(2)阻塞P2P对等体向P2P信息服务节点的通信。这种方法导致了P2P对等体使用代理服务器的方法躲避检测,也导致P2P信息服务节点向随机分布和隐藏的方向发展;
(3)用户的上行带宽。这种方法违反了服务条约,而且导致了向公网用户的数据请求量增大。
长时间高度拥塞的网络也带来网络管理困难和功能失效的危险,此外各种对实时性要求较高的服务如VoIP、Strea-mingVideo和Audio也因此遭遇了前所未有的不确定的网络
1Linux防火墙的扩展netfilter/iptables的技术
Linux中防火墙Netfilter/Iptables系统主要包括两个基本组件:定义在内核空间中的通用框架Netfilter,即:包分割框架,数据包选择系统。其中后者又由两部分构成:在Netfilter框架上定义的数据结构“IP表”、“链”和“规则”,在用户空间实现的应用程序IPTables用于插入、修改和删除信息包过滤表中的规则。
[3]
收稿日期:2006-07-23E-mail:chj_yh@hnbc.com.cn
基金项目:湖南省自然科学基金项目(05JJ40118);湖南省教育厅基金项目(04C313)。
作者简介:陈海军(1974-),男(土家族),湖南张家界人,硕士,工程师,研究方向为计算机网络安全、分布式计算;王四春,博士,副教授,研究方向为计算机人工智能、自动程序设计;叶晖,硕士,助教,研究方向为网络管理。
-3912-
由于Netfilter架构的加入,可以通过简单的内核模块化来实现新功能的扩展,在现有的(Netfilter/IPTables)中可以通过两种方式对现有的防火墙进行扩充,一种是扩展Netfilter通过编写相关内核模块调用nf_register_hook()直接在相关的钩子上注册从而获得新特性,一种是扩展IP表通过编写相关的匹配标准和目标来实现新特性;扩展IP表方式是对现有表的匹配规则的扩充与具体表无关。
扩展IP表需要编写内核和用户两方的代码,内核模块提供了实际的数据包匹配规则代码,用户方代码提供了IPTables新的命令行选项的共享库。
2Linux防火墙P2P流量控制扩展匹配设计
新的匹配函数常常被当成一个的模块来写。用这些
模块具有可扩展性,有两种方法可以实现,一个是用netfilter框架的“nf_register_sockopt”函数让用户直接和你的扩展模块对话;另一个方法是输出新模块的标记来让别的模块注册它们自己,netfilter和ip_tables都是这么做[4]。
这种两种方式简单而有效,因此可以借鉴这种思想在防火墙的匹配选项中加入匹配选项来检测数据包中的内容,由于扩展IP表具有很好地灵活性,为此可以选用这种方式扩充匹配标准来实现扩展P2P流量感知模块。
这种方式需要编写内核和用户空间代码,Netfilter/Iptables的标准化提供了两种使用的重要数据结构,在实现这两部分代码时主要是填充相应的数据结构内容然后将它们注册从而扩展功能。
2.1内核模块数据结构
新的MATCH功能可作为一个的模块,为了能使新
模块被别的模块使用,可以使用IPTables提供的ipt-register-ma-tch()将该模块进行注册,新的MATCH模块核心是ipt-match结构,它将作为ipt-register-match()的参数注册到MATCH链表中备用,用来注册一个新的匹配类型,从而增加新的规则匹配选项[5-6]。
构造新的匹配函数,核心是structipt_match结构,它传递参数给“ipt_register_match()”,这个结构有下面这些成员:
structlist_headlist:这个成员常设置为空“{NULL,NULL}”,由核心使用。
constcharname[]:这个成员是匹配函数的名称,被用户来指定。为了自动加载工作,这个名称必须和模块的名称相相匹配。
int(*match)():一个指向MTACH功能函数的指针,返回非0表示匹配
int(*checkentry)():该成员是一个指向一个函数的指针,该函数为一个控制检查其规范;如果它返回0,这个控制就不被用户接受。
iptablesvoid(*destroy)():该成员是一个指向函数的指针,当一个使用该匹配的入口被注销的时候就调用该函数。
这样就允许你在用checkentry的时候能动态的分配资源并且在这里把它们完全的清理掉。
Structmodule
me:该成员被标志为“THIS_MODU-LES”,它给出一个指向你的模块的指针。当该种类型的控制
被创建后者销毁,它使得计数器呈现出增长或者降低。这能防止某个用户在控制指向某个模块的时候移除该模块(并且因此cleanup_module()被调用)。
2.2用户空间数据结构
在内核中加入相关的内核模块后,为了在用户空间使用
IPTables提供相关的规则必须为该应用提供相关的命令行选项,为了使各个扩展模块使用一个版本的IPTables而不必编写相关扩展的特定软件版本,采用共享库可以解决该问题。共享库应该具有_init()函数,它的功能和内核模块功能相似,在装载时被自动调用,根据共享库是提供一个新的匹配或者一个新的对象,分别调用register-match()或register-target,共享库可以提供初始化数据结构和提供相关选项的功能。编写共享库中使用的重要数据结构是iptables_match,它作为参数传递给register-match()注册相关的命令行匹配选项让IPTables识别该新匹配。
Structiptables_match{structiptables_match*next
用于形成一个MATCH列表的指针,初始化为NULLipt_chainlabelname
MATCH功能的名字,必须与库函数名相同便于主程序根据MATCH名加载相应的动态连接库
constchar*version
版本信息通常被设置IPTABLES_ver-sion宏size_tsize;该MATCH的数据大小size_tuserspacesize;由于内核可能修改某些域,在这里填写被改变数据区大小,它一般和size大小同。
void*init)();初始化ipt-entry-match结构
int*parse)();扫描并接收本MATCH的命令行参数,正确接受返回非0
void*final_check)()
检查是否强制选项(如—P2P描述,(如果不正确退出void*print)()
查询当前表中的规则时,显示使用了当前(match规则的额外信息
void(*save)()
PARSE的反转,被iptable-save调用再生match的命令行参数
conststructoption*extra_opts
NULL结尾的参数列表,提供命令行其余选项/*以下参数由iptables内部使用,用户不必填写*/
Unsignedintoption_offset;Structipt_entry_match*m;Unsignedintmflags;Unsignedintused;}
2.3P2P协议数据识别
netfilter的pom中提供了ipp2p匹配,ipt_ipp2p.c中定义了
很多P2P软件的数据的判断模式,我们可以对其进行有效的扩展,便可以实现不同的P2P协议流量控制的需要[7]。
(1)eMule/eDonkey/Kad这几个协议用二进制数进行协商,如表1所示。
-3913-
表1
P2P协议特征
第1字节第2字节第3字节其它字节UDP长度
类型0xe30x9aanyany26edonkey0xc50x91!0any12emule0xc50x90!0any26emule0xc50x92anyany10emule0xc50x93anyany10emule0xe40x50anyany12kad0xe40x58!0any14kad0xe40x59anyany10kad…
…
…
…
…
…
(2)Gnutella:就是明文检查起始数据是否为“GNUTELLA或“GND”
(3)KaZaA:UDP数据部分的结尾6个字节是:“KaZaA\\0”;(4)BitTorrent:UDP长度24字节(含UDP头),起始8个字节为:0000041727101980;
(5)SoulSeek:前8个字节格式为:xxxx0000yyzz0000,其中xxxx为16位负载长度-4,yy!=0,zz任意或者数据长度8字节,全0或者数据格式为:01xx000000yy,其
中负载长度大于xx+6,负载第xx+4+1字节(zz)不为0,而负载
第xx+5+1字节,第xx+6+1字节为0;
(6)BitTorrent:负载第1字节为0x13,而且后续数据为:BitTorrentprotocol”;
表示的长度大于负载长度减5,而且第4,5字节为0,第6字节为0x01或0x4c;如果第2,3字节等表示的长度小于负载长度减5,则负载偏移该长度字节后的第6字节为0xe3/0xc5。
2.4编写新的Netfilter模块
为了在内核里接收/割裂信息包,关键在特殊的协议和特
殊的协议中netfilter头文件中的定义,如“netfilter_ipv4.h”,用函数“nf_register_hook”和“nf_unregister_hook”注册和注销netfilter钩子,如下写一个注册到“netfilter钩子”的模块。
list
用来加入到链表中:设置为“{NULL,NULL}”hook
当一个信息包找到这个钩子的点(point)这个函数就被调用。函数必须返回NF_ACCEPT,NF_DROPorNF_QUEUE。如果是NF_ACCEPT,下一个钩子到达那个点的时候将会被调用。如果是NF_DROP,信息包被丢弃。如果是NF_QUEUE,它是队列。
flush
通常不使用:当缓存被刷新的时候用来传递数据包采样数。可能永远不会被执行:设置为NULL。
pf
协议家族,如对于Ipv4的“PF_INET”。hooknum
你感兴趣的钩子的号码,如“NF_IP_LOCAL_OUT”。
2.5在用户空间调用内核模块
和用户空间互动对于netfilter的方法是使用setsockopt机
制,每个协议必须被修改以用来为setsockopt不能理解的号码调用nf_setsockopt()(对于getsockopt号码是nf_setsockopt()),并
-3914-
且迄今为止只有IPv4,IPv6和DECnet被修改[8]。
添加好匹配模块后,就可以通过IPTABLES定义相应的匹配规则,根据模块的定义,可以实现P2P流量检测功能,并根据需要实施有效的控制,甚至是阻断,如:
iptables-AFORWARD-mipp2p--edk--kazaa--bit-jDROPiptables-AFORWARD-ptcp-mipp2p--ares-jDROPiptables-AFORWARD-pudp-mipp2p--kazaa-jDROP这样的命令就能把edk、ares、kazaa这3种P2P网络的流量控阻断。标准ipp2p目前支持的协议以及甑别质量如表2所示。
表2
ipp2p应用效果比较
选项P2P网络
协议类型控制质量--edkeDonkey,eMule,Kademlia
TCPandUDPverygood--kazaaKaZaA,FastTrack
TCPandUDPgood--gnuGnutellaTCPandUDPgood--dcDirectConnectTCPonlygood--bitBitTorrent,extendedBT
TCPandUDPgood--apple
AppleJuice
TCPonly
needfeedback
3结束语
通过实验该控制系统可以对常见的P2P应用,如BT和电
驴等实施有效控制,如果再联合TOS,将此系统安置在Intranet边际路由器之外,则可以很好的阻断和控制P2P流量,并可以实现流量均衡,具有很好的扩展能力。而且Netfilter/Iptables具有很好的灵活性,在该框架上可以方便地对防火墙进行功能扩展,在内核中保证了控制的响应速度,可以迅速更新规则库,同时通过该方式也可以按照自身需要扩展防火墙功能,设计出廉价、安全、实用、易定制的P2P网络防控系统。
参考文献:
[1]
DejanSMilojicic,VanaKalogeraki.Peer-to-peercomputing[M].California:HPLaboratoriesPaloAltoCopyrightHewlett-Pac-kardCompany,2002.[2]张国治,党小超.P2P环境下访问控制模型的研究[J].甘肃科技,2006,22(2):65-69.
[3]
RustyRussell.Linux2.4packetfilteringHOWTO[EB/OL].http://www.netfilter.org/documention/HOWTO/en/packet-filtering-HOWTO.html,2002.[4]赵晓怡,杨明福,黄桂敏.基于蚁群算法的对等网模拟器的设计与实现[J].计算机应用与软件,2005,22(1):15-17.
[5]王莉,黄光明,刘志愚.基于Linux的具有DMZ防火墙的实现[J].微机发展,2004,14(4):71-73.
[6]凌波,王晓宇,周傲英.一种基于Peer-to-Peer技术的Web缓存共享系统研究[J].计算机学报,2005,28(2):72-78.
[7]王国伟,贾宗璞.基于防火墙的网络入侵检测研究与设计[J].计算机与数字工程,2005,33(5):127-130.
[8]
JoeHellerstein.Architecturesandalgorithmsforinternet-scale(P2P)datamanagement[R].IntelResearchandUCBerkeley,2004.
”“