




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
研究生实验报告 实验名称:基于基于 lpcap 的网络数据捕获系统设计与实现的网络数据捕获系统设计与实现 课程名称:信息系统及其安全对抗 任课教师: 学生姓名: 学生学号: 学生学院: 学生学科: 目 录 1引言引言3 2系统设计与实现系统设计与实现3 3系统特色分析系统特色分析6 4系统自测试系统自测试7 5参考文献参考文献8 6附件附件8 1引言引言 现如今,随着 Linux 操作系统的推广,Linux 下的相关监控、维护需求也逐渐 增多,本捕获器正是利用了这一优势。数据包捕获开发包 Libpcap(The Packet Capture Library)是一个平台独立的网络数据包捕获开发包。它是一个高层的编程 接口,隐藏了操作系统的细节,可以捕获网络上的所有数据包,包括到达其他主机 的数据包。Libpcap 中使用了 BPF 过滤机制,这部分是基于内核的过滤模块,它使 得 Libpcap 具有捕获特定数据包的功能。 2系统设计与实现系统设计与实现 2.12.1 LibpcapLibpcap 工作原理工作原理 Libpcap 主要由两部份组成:网络分接头(Network Tap)和数据过滤器 (Packet Filter) 。网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是 否接收该数据包。 Libpcap 利用 BSD Packet Filter(BPF)算法对网卡接收到的链路 层数据包进行过滤。BPF 算法的基本思想是在有 BPF 监听的网络中,网卡驱动将接 收到的数据包复制一份交给 BPF 过滤器,过滤器根据用户定义的规则决定是否接收 此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关 联的上层应用程序。 BPF 的架构如图所示。 图 2-1 BPF 架构 Libpcap 的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达 网络接口时,Libpcap 首先利用已经创建的 Socket 从链路层驱动程序中获得该数据 包的拷贝,再通过 Tap 函数将数据包发给 BPF 过滤器。BPF 过滤器根据用户已经定 义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用 户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内 核缓冲区,并传递给用户层缓冲区。 2.22.2 LibpcapLibpcap 函数库函数库 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.32.3 LibpcapLibpcap 功能结构功能结构 图 2-2 Libpcap 功能结构图 2.3.1 数据包捕获 通过调用 Libpcap 的库函数实现数据包的捕获,程序流程图如图所示: 图 2-3 数据包获取流程图 2.3.2 数据包解析 当计算机将数据从 TCP/IP 协议族的一层传到另一层时,会加入相应的头和控 制信息。从上层传到下层的任何信息对下层来说都将被视为普通的数据。 对应用程序数据在网络上传输的过程中,是通过协议栈发到网络上的,每层协 议都要加上一个数据收不,称为封装,不同的协议层对数据包有不同的称谓,在传 输层叫做段,在网络层叫做数据报,在链路层叫做帧。 数据封装成帧后发到传输 介质上,到达目的主机后每层协议再去掉相应的首部,最后将应用层数据交给应用 程序处理。此处,就是按照解封装的过程获得数据包各字段的内容和信息。 2.3.3 数据包存库及显示 使用 MySQL 提供的 C 语言的 API,主要用到的有以下几个。 1、MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag);该函数用于与 MySQL 数据库引擎建立连接。在执行进一 步的数据操作之前,必须保证 mysql_real_connect()成功返回。参数 mysql 是指向 MySQL 数据结构的指针;host 是运行 MySQL 数据库引擎的机器的 TCP/IP 主机名; user 和 password 是 MySQL 数据库的合法用户和口令;db 是连接的数据库名; port,unix_socket 和 client_flag 一般取默认值。 2、int mysql_query(MYSQL *mysql, const char *query);该函数用于执行 query 字符串中的 SQL 语句,query 必须以0 结尾。如果成功,返回 0。 3、MYSQL_ROW mysql_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 #define SNAP_LEN 1518 / 以太网帧最大长度 #define SIZE_ETHERNET 14 / 以太网包头长度 mac 6*2, type: 2 #define ETHER_ADDR_LEN 6 / mac 地址长度 struct packet_ethernet u_char ether_dhostETHER_ADDR_LEN; /* destination host address */ u_char ether_shostETHER_ADDR_LEN; /* source host address */ u_short ether_type; /* IP? ARP? RARP? etc */ ; /* IP header */ struct packet_ip u_char ip_vhl; /* version 2 */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ /struct in_addr ip_src; /struct in_addr ip_dst; /* source and dest address */ ; #define IP_HL(ip) (ip)-ip_vhl) struct packet_tcp u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ u_char th_offx2; /* data offset, rsvd */ #define TH_OFF(th) (th)-th_offx2 #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ ; void loop_callback(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) static int count = 0; / 包计数器 const struct packet_ethernet *ethernet; /* The ethernet header 1 */ const struct packet_ip *ip; /* The IP header */ const struct packet_tcp *tcp; /* The TCP header */ const char *payload; /* Packet payload */ int size_ip; int size_tcp; int size_payload; count+; /* 以太网头 */ ethernet = (struct packet_ethernet*)(packet); /* IP 头 */ ip = (struct packet_ip*)(packet + SIZE_ETHERNET); size_ip = IP_HL(ip)*4; if (size_ip ip_p != IPPROTO_TCP ) / TCP,UDP,ICMP,IP return; /* TCP 头 */ tcp = (struct packet_tcp*)(packet + SIZE_ETHERNET + size_ip); size_tcp = TH_OFF(tcp)*4; if (size_tcp th_sport); int dport = 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(“%d bytes:n“, size_payload, payload); printf(“%d %d %d %d bytesn“, 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); int write(const u_char *p, int len ) FILE *fp; fp = fopen(“/opt/mm/bin“,“a“); fwrite(p, len, 1, fp ); fwrite(“nn“, 4, 1, fp ); fclose(fp); void aloop_callback(u_char* argument, const struct pcap_pkthdr* header, const u_char* content) write( conte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 签批文件管理办法
- 犬只检疫管理办法
- 滩涂保护管理办法
- 短期劳务管理办法
- 测量实习心得体会参考(28篇)
- 环境记分管理办法
- 电动扶梯管理办法
- 现金管理办法全称
- 矿山取暖管理办法
- 稻苗出牙管理办法
- GB/T 44127-2024行政事业单位公物仓建设与运行指南
- 喷灌管线施工安装工程施工组织设计方案
- 厂房钢结构安装施工方案
- 完整版交管12123驾照学法减分复习通关秘籍题库及答案(名师系列)
- 水利工程(水电站)安全生产风险分级管控体系方案全套资料(2021-2022版)
- 流水线清洁记录表
- 政府会计制度专题培训全套课件
- 手外伤清创手术配合
- 起重机的手势指挥信号
- (高清版)DZT 0338.2-2020 固体矿产资源量估算规程 第2部分 几何法
- 2023-2024学年安徽省合肥市瑶海区七年级(上)期末数学试卷
评论
0/150
提交评论