论文部分内容阅读
随着互联网的迅速发展,IPv4地址即将被IPv6地址取代。IPv6不仅可以提供足够的IP地址,同时还具有可扩展、支持QoS和支持移动通信等其他重要特性。然而,潜在安全威胁依然存在于由大量IPv6设备组成的企业网络中,包括所有运行Windows 7、Mac OS/X和Linux的设备。因此,在网络入侵检测系统中,对于IPv6数据包的监控和分析至关重要。
while(true) {//建立一个死循环不断监听网络
WSARecv(m_Socket,&wbuf,1,&dwBytesRead,&dwFlags,NULL,NULL);//捕获数据报
WSABUF *pBuf=(WSABUF*)&wbuf;
buf=(UCHAR*)GlobalAlloc(GPTR,pBuf->len);//分配缓冲区
buf=(unsigned char *)pBuf->buf;//获取缓冲区中数据
ip_header=( IPv6_HEADER)buf;//将缓冲区中的数据转换成IPv6报头结构
ipv6_header=( IPv6_HEADER)(buf+sizeof(IPv4_HEADER));
… }
4)简单解析IPv6数据报。
printf("IPv6包头: ");
Printf("版本:%d",ipv6_header->ver_tf); //IP版本号
Printf("数据包长度:%d",ipv6_header->length[0]*256+ipv6_header
->length[1]);
printf("下一个包头类型:%d",ipv6_header->next_header);
printf("限跳数:%d ",ipv6_header->limits);
printf("源IPv6 地址: ");
for(int i=0;i<14;i++) {
printf("%X",ipv6_header->Srcv6[0+i]); //显示源IPv6地址
i++;
printf("%X:",ipv6_header->Srcv6[0+i]); }
printf("%X%X ",ipv6_header->Srcv6[14],ipv6_header->Srcv6[15]);
显示目的地址的代码与显示源地址相类似。
用于测试的网络环境由两台安装Windows7系统的主机和一台二层交换机组成,手动配置IPv6地址进行通信,截获数据包的测试结果如图1所示。
3.2 使用WinPcap编程实现
Windows 7系统中,MFC环境结合WinPcap工具包也可以很方便地开发可视化界面的IPv6协议分析器,实现过程即关键程序如下。
1)获取系统中的网卡设备列表并选择。
pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf);//获取网卡列表
for(d=alldevs; d&& m_DetailSizenext) { //显示网卡列表
name = d->name;
m_CombAdapter.InsertString(m_DetailSize,(LPCTSTR)name);
if (d->description)
m_Detailtext[m_DetailSize] = d->description; //获取设备描述信息
else
m_Detailtext[m_DetailSize] = "无有效设备描述";
m_DetailSize ++;
}
pcap_freealldevs(alldevs); // 释放设备列表
2)选择接收数据的网卡后开始执行捕获数据包线程。
m_CombAdapter.GetCurSel(); //选择了网卡设备
m_pThread=AfxBeginThread(Capture_packet,this,THREAD_PRIORITY_NORMAL);
3)IPv6数据捕获及协议分析工作线程的定义代码如下:
Ad=pcap_open(name,// 设备名
65536, // 要捕捉的数据包的最大长度
PCAP_OPENFLAG_PROMISCUOUS, // 设置网卡为混杂模式
1000, // 超时时间
NULL, // 远程主机验证
errbuf ) ; // 错误信息缓冲区
pcap_datalink(ad); //检验/以太网连接
4)编译并设置过滤规则。
pcap_compile(adhandle, &fcode, packet_filter, 1, netmask);
pcap_setfilter(adhandle, &fcode);
5)开始捕获IPv6数据。
res = pcap_next_ex( adhandle, &header, &pkt_data);
ih = (ip6_header *)(pkt_data +14); //以太网IPv6的头部长度
6)显示IPv6源地址,显示目的地址的代码与之类似。
for (int i=0;i<8;i++)
{ itoa(ntohs(ih->Ipv6_src.byte[i]),temp,16);
srcip += temp;
if(i<7) srcip +=":"; }
7)对数据报进行简单协议分析,显示数据特征。
int nhead = ih->NextHeader; //定义变量获取下一头部字段
变量nhead的值是6,表示TCP协议,值17表示UDP协议,值58表示ICMP协议。
通过完成以上各步骤,程序运行后的界面如图2所示。
4 结束语
目前IPv6仍然处于测试阶段,本文所述的方法着重强调了协议分析的思路和编程实现,是在与之相关的技术理论基础上进行了验证和改进。支持IPv6的新型软件技术和设备将不断地涌现和发展。
基金项目:南京工程学院科研基金项目(编号:KXJ08073)。
参考文献:
[1]刘文涛,网络安全编程技术与实例[M].北京:机械工业出版社,2008:181-183.
[2]吴功宜、董大凡等,计算机网络高级软件编程技术[M].北京:清华大学出版社,2010:100-101.
[3]The Internet Society.RFC4291.[EB/OL].http://www.ietf.org/rfc/
rfc4291.txt.2006.2.
[4]许爱军、谢娟,基于WinPcap的网络数据解析及其实现[J].科学技术与工程,2009,5(10):2797-2798.
[5]袁德明,IPv6新型套接字的网络变成剖析[J].通信技术,2007,12(40):364-365.
作者简介:
庄严(1969-),硕士,讲师,主要研究方向:网络安全、多媒体技术;张倩,硕士,讲师。
while(true) {//建立一个死循环不断监听网络
WSARecv(m_Socket,&wbuf,1,&dwBytesRead,&dwFlags,NULL,NULL);//捕获数据报
WSABUF *pBuf=(WSABUF*)&wbuf;
buf=(UCHAR*)GlobalAlloc(GPTR,pBuf->len);//分配缓冲区
buf=(unsigned char *)pBuf->buf;//获取缓冲区中数据
ip_header=( IPv6_HEADER)buf;//将缓冲区中的数据转换成IPv6报头结构
ipv6_header=( IPv6_HEADER)(buf+sizeof(IPv4_HEADER));
… }
4)简单解析IPv6数据报。
printf("IPv6包头: ");
Printf("版本:%d",ipv6_header->ver_tf); //IP版本号
Printf("数据包长度:%d",ipv6_header->length[0]*256+ipv6_header
->length[1]);
printf("下一个包头类型:%d",ipv6_header->next_header);
printf("限跳数:%d ",ipv6_header->limits);
printf("源IPv6 地址: ");
for(int i=0;i<14;i++) {
printf("%X",ipv6_header->Srcv6[0+i]); //显示源IPv6地址
i++;
printf("%X:",ipv6_header->Srcv6[0+i]); }
printf("%X%X ",ipv6_header->Srcv6[14],ipv6_header->Srcv6[15]);
显示目的地址的代码与显示源地址相类似。
用于测试的网络环境由两台安装Windows7系统的主机和一台二层交换机组成,手动配置IPv6地址进行通信,截获数据包的测试结果如图1所示。
3.2 使用WinPcap编程实现
Windows 7系统中,MFC环境结合WinPcap工具包也可以很方便地开发可视化界面的IPv6协议分析器,实现过程即关键程序如下。
1)获取系统中的网卡设备列表并选择。
pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf);//获取网卡列表
for(d=alldevs; d&& m_DetailSize
name = d->name;
m_CombAdapter.InsertString(m_DetailSize,(LPCTSTR)name);
if (d->description)
m_Detailtext[m_DetailSize] = d->description; //获取设备描述信息
else
m_Detailtext[m_DetailSize] = "无有效设备描述";
m_DetailSize ++;
}
pcap_freealldevs(alldevs); // 释放设备列表
2)选择接收数据的网卡后开始执行捕获数据包线程。
m_CombAdapter.GetCurSel(); //选择了网卡设备
m_pThread=AfxBeginThread(Capture_packet,this,THREAD_PRIORITY_NORMAL);
3)IPv6数据捕获及协议分析工作线程的定义代码如下:
Ad=pcap_open(name,// 设备名
65536, // 要捕捉的数据包的最大长度
PCAP_OPENFLAG_PROMISCUOUS, // 设置网卡为混杂模式
1000, // 超时时间
NULL, // 远程主机验证
errbuf ) ; // 错误信息缓冲区
pcap_datalink(ad); //检验/以太网连接
4)编译并设置过滤规则。
pcap_compile(adhandle, &fcode, packet_filter, 1, netmask);
pcap_setfilter(adhandle, &fcode);
5)开始捕获IPv6数据。
res = pcap_next_ex( adhandle, &header, &pkt_data);
ih = (ip6_header *)(pkt_data +14); //以太网IPv6的头部长度
6)显示IPv6源地址,显示目的地址的代码与之类似。
for (int i=0;i<8;i++)
{ itoa(ntohs(ih->Ipv6_src.byte[i]),temp,16);
srcip += temp;
if(i<7) srcip +=":"; }
7)对数据报进行简单协议分析,显示数据特征。
int nhead = ih->NextHeader; //定义变量获取下一头部字段
变量nhead的值是6,表示TCP协议,值17表示UDP协议,值58表示ICMP协议。
通过完成以上各步骤,程序运行后的界面如图2所示。
4 结束语
目前IPv6仍然处于测试阶段,本文所述的方法着重强调了协议分析的思路和编程实现,是在与之相关的技术理论基础上进行了验证和改进。支持IPv6的新型软件技术和设备将不断地涌现和发展。
基金项目:南京工程学院科研基金项目(编号:KXJ08073)。
参考文献:
[1]刘文涛,网络安全编程技术与实例[M].北京:机械工业出版社,2008:181-183.
[2]吴功宜、董大凡等,计算机网络高级软件编程技术[M].北京:清华大学出版社,2010:100-101.
[3]The Internet Society.RFC4291.[EB/OL].http://www.ietf.org/rfc/
rfc4291.txt.2006.2.
[4]许爱军、谢娟,基于WinPcap的网络数据解析及其实现[J].科学技术与工程,2009,5(10):2797-2798.
[5]袁德明,IPv6新型套接字的网络变成剖析[J].通信技术,2007,12(40):364-365.
作者简介:
庄严(1969-),硕士,讲师,主要研究方向:网络安全、多媒体技术;张倩,硕士,讲师。