网络数据包捕获及分析.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1西安电子科技大学计算机应用陕西710071
2平鲁区职业中学山西036000
网络数据包捕获及分析
卢建华1蒋明1陈淑芳2
摘要:网络数据包捕获及分析主要实现了对网络上的数据包进行捕获及分析。
包捕获功能模块主要是利用原始套接字对网络层的数据进行抓包。
在包分析功能模块,根据报文协议的格式,把抓到的包进行解析,从而得到网络层和传输层协议的报头内容。
关键词:包捕获;套接字;网络协议
0引言
目前,网络上的数据流量与日俱增,随之而来的网络安全问题也日渐重要。
无论是实现防火墙,NAT 还是VPN,首先就是获得网络数据包,在此基础上才能进行下一步的工作。
因此研究数据包捕获及分析技术具有极其重要的意义。
本文介绍了利用RAW SOCKET 进行网络数据包捕获的原理,并且开发了一个程序模型来探讨捕获数据包实现的方法。
1原理1.1数据收发
以太网是基于广播方式传送数据的,也就是说,通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据,而每一个网络接口都对应惟一的硬件地址,即网卡MAC 地址。
正常情况下,一个网络接口应该只响应两种数据帧:①与自己硬件地址相匹配的数据帧;②向所有计算机的广播数据帧。
在实际系统中由网卡来完成数据的收发。
网卡接收到传来的数据,网卡内的程序接收数据帧的目的MAC 地址,然后根据网卡驱动程序设置的接收模式判断:认为应该接收,就在接收后产生中断信号通知CPU;认为不该接收就丢掉不管。
CPU 得到中断信号产生中断,操作系统就根据网卡驱动程序设置的网卡中断程序地址调用驱动程序接收数据。
驱动程序接收数据后,放入信号堆栈让操作系统处理。
对于网卡来说一般有4种接收模式:①广播方式:该模式下的网卡能够接收网络中的广播信息。
②组播方式:该模式下的网卡能够接收组播数据。
③直接方式:该模式下只有目的网卡才能接收数据。
④混杂模式:该模式下的网卡能够接收一切通过它的数据。
所以要想实现对网络的数据进行获取分析,首先应该把网卡设置成混杂模式。
1.2数据获取
数据获取主要有两种方法:通过数据链路层获取和通过
网络层获取。
(1通过链路层获取
在TCP/IP的体系结构中,数据链路层和物理层共同构成网络接口层,作为
TCP/IP 的第一层。
在这一层传输的数据格式是以太帧。
获取以太帧目前可以通过LibPcap和WinPcap两种捕包工具。
LibPcap是一种与系统无关,采用分组捕获机制的分组捕获函数库。
使用LibPcap编写的程序可自由的跨平台使用。
而WinPcap 是LibPcap的Windows 版本,集成于Windows95,98,ME,NT,2000和XP 操作系统的设备驱动程序,可以从网卡捕获或者发送原始数据,同时能够过滤并且存储数据包。
(2通过网络层获取
通过网络层获取数据主要借助原始套接字。
套接字是网络应用编程接口。
套接字有三类:流式套接字、数据报套接字和原始套接字。
前两种套接字只能访问到传输层。
而原始套接字则可以获取ICMP、TCP、UDP 等数据包。
在Windows 环境下可用Winsock来实现。
2相关协议介绍2.1IP 协议
IP 的基本功能:寻址、路由选择和数据包的分割和组装。
它不提供可靠的传输服务。
依据IP 报文格式在程序中声明IP 首部:
typedef struct_IPHEADER{
unsigned char header_len:4;
unsigned char version:4;unsigned char tos;unsigned short
total_len;unsigned short ident;unsigned short flags;
unsigned char ttl;
作者简介:卢建华(1982-,女,西安电子科技大学2006级硕士研究生,研究方向:计算机应用。
蒋明(1958-,男,
西安电子科技大学高工,硕士生导师。
陈淑芳(1970-,女,山西省朔州市平鲁区职业中学讲师。
unsigned char proto;unsigned short checksum;unsigned int sourceIP;unsigned int destIP;}IPHEADER;
2.2TCP 协议
TCP 提供全双工和可靠交付的服务。
该协议主要用于在主机间建立一个虚拟
连接,以实现高可靠性的数据包交换。
依据T C P 报文格式在程序中声明T C P 报头:
struct TCPPacketHead{WORD SourPort;WORD DestPort;DWORD SeqNo;DWORD AckNo;BYTE HLen;BYTE Flag;WORD
WndSize;WORD ChkSum;WORD UrgPtr;};
2.3UDP协议
UDP 是一个无连接协议,传输数据之前源端和终端不建立连接,也不使用拥塞控制、不保证可靠交付。
依据UDP 报文格式在程序中声明U D P 报头:
struct UDPPacketHead{WORD SourPort;WORD DestPort;WORD Len;WORD ChkSum;};
2.4ICMP协议
ICMP 是TCP/IP 协议集中的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
依据ICMP
报文格式在程序中声明I C M P 报头:
struct ICMPPacketHead{BYTE Type;BYTE Code;WORD ChkSum;WORD Id;//增加了标识变量
WORD Seq;//增加了序号变量
};
3具体实现
系统的开发环境是VC++6.0,利用RAW SOCKET 套接字来实现包捕获功能。
3.1包捕获模块的实现
(1m_s=socket(AF_INET,SOCK_RAW,IPPROTO_IP ;//创建原始套接字
(2setsockopt(m_s,SOL_SOCKET,SO_RCVTIMEO,(constchar*&rcvtimeo,sizeof (rcvtimeo
;//设置IP头操作选项,超时接收选择(3SOCKADDR_IN sa;sa.sin_family =AF_INET;sa.sin_port=htons(6000;
//设置端口号sa.sin_addr.s_addr=m _iphostsource;
//设置IP地址
bind(m_s,(PSOCKADDR&sa,sizeof(sa;//将原始套接字绑定到本地网卡
(4设置套接字接收模式,并启动新的接收线程thread-Func
If(SOCKET_ERROR!=WSAIoctl(m_s,SIO_RCVALL,&dwBufferInLen,s izeof(dwBufferInLen,&dwBufferLen,sizeof
(dwBufferLen,&dwBytesReturned,NULL,NULL
其中threadFunc 方法的实现是:UINT threadFunc (LPVOID pParam{
PeekMessage(&msg,NULL,WM_USER,WM_USER,
P M _N O R E M O V E ;
pDlg->m_threadID=GetCurrentThreadId(;//取得线
程的ID 号
While(TRUE//循环接收消息
{if(PeekMessage(&msg,0,WM_CLOSE,WM_CLOSE,
PM_NOREMOVE
{closesocket(pDlg->m_s;//检测
W M _C L O S E 消息
…………break;}
memset(buf,0,sizeof(buf;
int iRet=recv(pDlg->m_s,buf,sizeof(buf,0;//从
套接字接收数据
//分析模块…}}
3.2包分析模块的实现
首先根据先前定义各协议的报头,解析IP 报头内容,进而确定协议类型,T C P、U D P 或I C M P,之后再分别进行相应的报头解析。
部分程序为:
定义一个IP头指针pIpHeader,利用指针的移动来实现包的解析。
然后依据IP 数据包结构,分别读取IP 数据包的各项信息。
根据proto 字段进一步确定其为TCP 数据包、UDP 数据包还是I C M P 数据包。
[下转27页]
Router(config#ip access-list extended internal_ACL Router(config-ext-
nacl#permit tcp any host192.1.2.1eq smtp Router(config-ext-nacl#permit tcp any host192.1.2.1eq pop Router(config-ext-nacl#deny tcp any any ep pop Router(config-ext-nacl#deny tcp any any eq smtp Router(config-ext-nacl#permit ip any any Router(config-ext-nacl#exit
Router(config#ip inspect name internal_CBAC ftp Router(config#ip inspect name internal_CBAC http Router(config#ip inspect name
internal_CBAC tcp Router(config#ip inspect name internal_CBAC udp Router(config#ip inspect name internal_CBAC icmp Router(config#interface e thernet0
Router(config-if#ip access-group internal_ACL in Router(config-if#ip inspect internal_CBAC in
(2在全局模式下,分别设置TCP 的建立时间为15秒,TCP 的空闲超时为60
秒,UDP 的空闲超时为20秒,半开连接阀值为400,1分钟连接尝试次数为400,主机最大半开连接数为250。
Router(config#ip inspect tcp synwait-time15Router(config#ip inspect
tcp idle-time60Router(config#ip inspect udp idle-time20
Router(config#ip inspect max-incomplete high400Router(config#ip inspect max-incomplete low300Router(config#ip inspect one-minute high 400Router(config#ip inspect one-minute low300
Router(config#ip inspect tcp max-incomplete host250block-time0
4结束语
充分应用CBAC 的访问控制特性,能够使我们在一定程度上较好的防御特定的DoS 风暴攻击。
但应该注意,在修改超时值和连接阀值时,要考虑网络规模与具体应用,监控C B A C 及网络活动日志,确保没有因为参数设置影响正常的网络应用。
另外,我们还可以结合CISCO IOS的ACL、入侵检测系统、日志和审查功能以及应用层过滤技术等,检测和防御更多类型的网络攻击,做好网络安全工作。
应用CBAC 也存在一些局限性,如流量审查会增加路由器的负荷,不能审查加密的数据包,以及有限的应用层审查等。
参考文献
[1]李德全.拒绝服务攻击[M].北京:电子工业出版社.2007.[2]W.Rchard Stevens.TCP/IP Illustrated Volume1:The Protocols [M].范建华等译.北京:机械工业出版社.2000.
[3]Richard A.Deal.陈克忠译.Cisco Router Firewall Security[M].北京:人民邮电出版社.2000.
HdrLen=(pIpHeader->header_len*4;m=pIpHeader->proto;switch(m {
case IPPROTO_TCP:
pTCPHead=(struct TCPPacketHead*
(buf+HdrLen;
…………break;
case IPPROTO_UDP:
pUDPHead=(struct UDPPacketHead*
(buf+HdrLen;
…………break;
case IPPROTO_ICMP:
pICMPHead=(struct ICMPPacketHead*
(buf+HdrLen;
…………break;
d e f a u l t :
break;}
根据不同的选择执行不同的程序,并把最后结果显示在
对话框中。
4总结
本文主要实现的功能是对网络上的数据包进行捕获及分析。
即首先通过捕包模块把经过主机网卡的数据包截获,并存储在缓冲存储器中,然后通过分析模块对它进行分析,从而得到网络层和传输层协议的报头内容。
当然这个系统也有不完善的地
方,如由于捕获到的数据包头不包含有帧信息,因此不能接收到与IP 同属网络层的其它数据包,如ARP 数据包、R A R P 数据包等。
参考文献
[1]谢希仁.计算机网络[M].北京:清华大学出版社.2001.[2]韩新宇,章惠
君.Windows下实现网络数据包捕获[J].维普资讯网.
[3]Jenny J.He,Dimitra Simeonidou.Flow Routing and its Perfor-mance Analysis in Optical IP Networks.Photonic Network Communications.2001.
[上接17页]。