基于lpcap的网络数据捕获系统设计与实现实验报告大学论文.docx
- 文档编号:28871698
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:14
- 大小:340.86KB
基于lpcap的网络数据捕获系统设计与实现实验报告大学论文.docx
《基于lpcap的网络数据捕获系统设计与实现实验报告大学论文.docx》由会员分享,可在线阅读,更多相关《基于lpcap的网络数据捕获系统设计与实现实验报告大学论文.docx(14页珍藏版)》请在冰豆网上搜索。
基于lpcap的网络数据捕获系统设计与实现实验报告大学论文
研究生实验报告
实验名称:
基于lpcap的网络数据捕获系统设计与实现
课程名称:
信息系统及其安全对抗
任课教师:
学生姓名:
学生学号:
学生学院:
学生学科:
目录
1引言3
2系统设计与实现3
3系统特色分析6
4系统自测试7
5参考文献8
6附件8
1
引言
现如今,随着Linux操作系统的推广,Linux下的相关监控、维护需求也逐渐增多,本捕获器正是利用了这一优势。
数据包捕获开发包Libpcap(ThePacketCaptureLibrary)是一个平台独立的网络数据包捕获开发包。
它是一个高层的编程接口,隐藏了操作系统的细节,可以捕获网络上的所有数据包,包括到达其他主机的数据包。
Libpcap中使用了BPF过滤机制,这部分是基于内核的过滤模块,它使得Libpcap具有捕获特定数据包的功能。
2系统设计与实现
2.1Libpcap工作原理
Libpcap主要由两部份组成:
网络分接头(NetworkTap)和数据过滤器(PacketFilter)。
网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。
Libpcap利用BSDPacketFilter(BPF)算法对网卡接收到的链路层数据包进行过滤。
BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。
BPF的架构如图所示。
图2-1BPF架构
Libpcap的包捕获机制就是在数据链路层加一个旁路处理。
当一个数据包到达网络接口时,Libpcap首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。
BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。
如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。
2.2Libpcap函数库
1、pcap_lookupdev()函数用于查找网络设备,返回可被pcap_open_live()函数调用的网络设备名指针。
2、pcap_open_live()函数用于打开网络设备,并且返回用于捕获网络数据包的数据包捕获描述字。
3、pcap_lookupnet()函数获得指定网络设备的网络号和掩码。
4、pcap_compile()函数用于将用户制定的过滤策略编译到过滤程序中。
5、pcap_setfilter()函数用于设置过滤器。
6、pcap_loop()函数pcap_dispatch()函数用于捕获数据包,捕获后还可以进行处理。
7、pcap_next()函数pcap_next_ex()函数也可以用来捕获数据包。
8、pcap_close()函数用于关闭网络设备,释放资源。
2.3Libpcap功能结构
图2-2Libpcap功能结构图
2.3.1数据包捕获
通过调用Libpcap的库函数实现数据包的捕获,程序流程图如图所示:
图2-3数据包获取流程图
2.3.2数据包解析
当计算机将数据从TCP/IP协议族的一层传到另一层时,会加入相应的头和控制信息。
从上层传到下层的任何信息对下层来说都将被视为普通的数据。
对应用程序数据在网络上传输的过程中,是通过协议栈发到网络上的,每层协议都要加上一个数据收不,称为封装,不同的协议层对数据包有不同的称谓,在传输层叫做段,在网络层叫做数据报,在链路层叫做帧。
数据封装成帧后发到传输介质上,到达目的主机后每层协议再去掉相应的首部,最后将应用层数据交给应用程序处理。
此处,就是按照解封装的过程获得数据包各字段的内容和信息。
2.3.3数据包存库及显示
使用MySQL提供的C语言的API,主要用到的有以下几个。
1、MYSQL*mysql_real_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd,constchar*db,unsignedintport,constchar*unix_socket,unsignedintclient_flag);该函数用于与MySQL数据库引擎建立连接。
在执行进一步的数据操作之前,必须保证mysql_real_connect()成功返回。
参数mysql是指向MySQL数据结构的指针;host是运行MySQL数据库引擎的机器的TCP/IP主机名;user和password是MySQL数据库的合法用户和口令;db是连接的数据库名;port,unix_socket和client_flag一般取默认值。
2、intmysql_query(MYSQL*mysql,constchar*query);该函数用于执行query字符串中的SQL语句,query必须以\0结尾。
如果成功,返回0。
3、MYSQL_ROWmysql_fetch_row(MYSQL_RES*result);该函数取回结果集中的下一条记录,如果没有记录或出错,返回NULL。
该部分实现的功能是将数据包解析出来的各个字段的信息插入到Mysql数据库中,在这个过程中要先连接数据库,然后通过设置执行insert语句将内容插入数据库,最后关闭数据库连接。
在该程序的开发过程中,在获得数据包的信息之后,将数据包存入数据库。
最后通过web页面显示数据包的信息。
此处通过LAMP实现的数据信息的web显示。
3系统特色分析
传统的网络数据包处理,需要经过网络设备到操作系统内存空间、系统内存空间到用户应用程序空间的2次拷贝,同时在拷贝过程中用户还要向系统发出系统调用请求。
为了提高大流量网络环境下数据捕获系统报文处理的性能,有必要减少报文传输过程的中间环节,绕过操作系统内核,减少或消除数据拷贝次数,降低系统有限资源的消耗。
零拷贝技术将网络数据包直接传递到系统内核预先分配的地址空间,避免CPU的参与,同时将系统内核中存储数据包的内存区域映射到用户空间的应用程序,应用程序直接对该内存进行访问,从而减少了系统内核向用户空间的内存拷贝及系统调用时间。
零拷贝的关键是同步问题,包括2个方面:
一是处于内核空间的网卡驱动向缓存中写入网络数据包;二是用户进程直接对缓存中的数据包进行分析。
由于二者处于不同的空间,使得存取变得更加复杂。
4系统自测试
在centos6.0上对该程序进行了测试,测试环境搭建如图所示。
图4-1测试环境
通过使用FIFO来缓存捕获的数据包,可以有效的降低数据包的丢失率,对数据包内容信息的检测,可以有效的拦截或发现网络中潜在的安全隐患。
图4-2编程实现
5参考文献
[1]寇应展,杨素敏,陈利军,王纪增.基于Libpcap网络数据包捕获技术的改进[J].军械工程学院学报,2011
[2]吴荣焕,周锋.基于Libpcap的高速率数据包捕获[J].中国科技论文在线,2012
6附件
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSNAP_LEN1518 //以太网帧最大长度
#defineSIZE_ETHERNET14 //以太网包头长度mac6*2,type:
2
#defineETHER_ADDR_LEN 6 //mac地址长度
structpacket_ethernet{
u_char ether_dhost[ETHER_ADDR_LEN]; /*destinationhostaddress*/
u_char ether_shost[ETHER_ADDR_LEN]; /*sourcehostaddress*/
u_shortether_type; /*IP?
ARP?
RARP?
etc*/
};
/*IPheader*/
structpacket_ip{
u_char ip_vhl; /*version<<4|headerlength>>2*/
u_char ip_tos; /*typeofservice*/
u_shortip_len; /*totallength*/
u_shortip_id; /*identification*/
u_shortip_off; /*fragmentoffsetfield*/
#defineIP_RF0x8000 /*reservedfragmentflag*/
#defineIP_DF0x4000 /*dontfragmentflag*/
#defineIP_MF0x2000 /*morefragmentsflag*/
#defineIP_OFFMASK0x1fff /*maskforfragmentingbits*/
u_char ip_ttl; /*timetolive*/
u_char ip_p; /*protocol*/
u_shortip_sum; /*checksum*/
struct in_addrip_src,ip_dst; /*sourceanddestaddress*/
//structin_addrip_src;
//structin_addrip_dst; /*sourceanddestaddress*/
};
#defineIP_HL(ip) (((ip)->ip_vhl)&0x0f)
#defineIP_V(ip) (((ip)->ip_vhl)>>4)
/*TCPheader*/
typedefu_inttcp_seq;
structpacket_tcp{
u_shortth_sport; /*sourceport*/
u_shortth_dport; /*destinationport*/
tcp_seqth_seq; /*sequencenumber*/
tcp_seqth_ack; /*acknowledgementnumber*/
u_char th_offx2; /*dataoffset,rsvd*/
#defineTH_OFF(th) (((th)->th_offx2&0xf0)>>4)
u_char th_flags;
#defineTH_FIN 0x01
#defineTH_SYN 0x02
#defineTH_RST 0x04
#defineTH_PUSH0x08
#defineTH_ACK 0x10
#defineTH_URG 0x20
#defineTH_ECE 0x40
#defineTH_CWR 0x80
#defineTH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_shortth_win; /*window*/
u_shortth_sum; /*checksum*/
u_shortth_urp; /*urgentpointer*/
};
voidloop_callback(u_char*args,conststructpcap_pkthdr*header,constu_char*packet){
staticintcount=0; //包计数器
conststructpacket_ethernet*ethernet; /*Theethernetheader[1]*/
conststructpacket_ip*ip; /*TheIPheader*/
conststructpacket_tcp*tcp; /*TheTCPheader*/
constchar*payload; /*Packetpayload*/
intsize_ip;
intsize_tcp;
intsize_payload;
count++;
/*以太网头*/
ethernet=(structpacket_ethernet*)(packet);
/*IP头*/
ip=(structpacket_ip*)(packet+SIZE_ETHERNET);
size_ip=IP_HL(ip)*4;
if(size_ip<20){
printf("无效的IP头长度:
%ubytes\n",size_ip);
return;
}
if(ip->ip_p!
=IPPROTO_TCP){//TCP,UDP,ICMP,IP
return;
}
/*TCP头*/
tcp=(structpacket_tcp*)(packet+SIZE_ETHERNET+size_ip);
size_tcp=TH_OFF(tcp)*4;
if(size_tcp<20){
printf("无效的TCP头长度:
%ubytes\n",size_tcp);
return;
}
intsport= ntohs(tcp->th_sport);
intdport= ntohs(tcp->th_dport);
printf("%s:
%d->",inet_ntoa(ip->ip_src),sport);
printf("%s:
%d",inet_ntoa(ip->ip_dst),dport);
//内容
payload=(u_char*)(packet+SIZE_ETHERNET+size_ip+size_tcp);
//内容长度
size_payload=ntohs(ip->ip_len)-(size_ip+size_tcp);
if(size_payload>0){
//printf("%dbytes:
\n",size_payload,payload);
printf("%d%d%d%dbytes\n",ntohs(tcp->th_seq),ntohs(tcp->th_ack),ntohs(tcp->th_flags),size_payload);
write(payload,size_payload);
}else{
printf("%d%d%d\n",ntohs(tcp->th_seq),ntohs(tcp->th_ack),ntohs(TH_SYN));
}
}
intwrite(constu_char*p,intlen){
FILE*fp;
fp=fopen("/opt/mm/bin","a");
fwrite(p,len,1,fp);
fwrite("\n\n",4,1,fp);
fclose(fp);
}
voidaloop_callback(u_char*argument,conststructpcap_pkthdr*header,constu_char*content){
write(content,header->caplen);
}
intmain(intargc,char*argv[]){
pcap_t*handle;/*会话句柄*/
char*dev;/*执行嗅探的设备*/
charerrbuf[PCAP_ERRBUF_SIZE];/*存储错误信息的字符串*/
structbpf_programfilter;/*已经编译好的过滤器*/
charfilter_app[]="port80";/*过滤表达式*/
bpf_u_int32mask;/*所在网络的掩码*/
bpf_u_int32net;/*主机的IP地址*/
structpcap_pkthdrheader;/*由pcap.h定义*/
constu_char*packet;/*实际的包*/
/*Definethedevice*/
/*dev=pcap_lookupdev(errbuf);*/
dev="em2"; /*网卡名称*/
pcap_lookupnet(dev,&net,&mask,errbuf);/*探查设备属性*/
handle=pcap_open_live(dev,65536,1,0,errbuf);/*以混杂模式打开会话*/
pcap_compile(handle,&filter,filter_app,0,net);/*编译并应用过滤器*/
pcap_setfilter(handle,&filter);
pcap_loop(handle,10,loop_callback,NULL);
pcap_close(handle);/*关闭会话*/
return(0);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 lpcap 网络 数据 捕获 系统 设计 实现 实验 报告 大学 论文