(3)接收数据
使用recvfrom()函数来实现接收数据包:
recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len)
这是从打开的网络插座Socket读取数据包的地方,但要注意,addr结构有一个强制类型转换,以适应recvfrom()函数的语法要求,recvfrom()函数在成功读取的情况下返回读取的字节数,否则返回-1。
(4)判断包头指针
该数据包捕获模块可以接收到的数据包都是原始数据包,它们的格式一般先是以太网数据帧的头部,接着是ARP或者IP数据包的头部。IP数据包后紧跟着TCP或UDP、ICMP的头部,最后才是真正要传输的数据。于是,在拆分IP数据包时,先提取以太网数据帧的头部,再提取IP数据包的头部,然后分析TCP或UDP、ICMP数据包的头部。最后,从数据包提取出需要的数据。
3、程序中用到的一些结构体解析
(1)sockadd_in结构体
在网络中第一个被创造的结构类型是sockaddr。这个数据结构是为许多类型的套接口储存地址信息。它的定义如下:
struct sockaddr{
unsigned shortsa_family; /*这个是地址族,通常是AF-xxxx的形式*/
charsa_data[14]; /*14字节的地址信息*/
};
(2)ethhdr结构体
以下是相应数据结构:
struct ethhdr
{
unsigned char h_dest[ETH_ALEN];/*48位的目标地址的网卡物理地址*/
unsigned char h_source[ETH_ALEN];/*48位的源地址的物理网卡地址*/
unsigned short h_proto;/*16位的以太网协议*/
}
(3)iphdr结构体
这是Linux 的ip协议报头,针对版本的不同它可以有不同的定义,我们国内一般用BIG的定义,其中version 是ip的版本,protocol是ip的协议分类,saddr是32位的源ip地址,daddr是32位的目标ip地址。
(4)tcphdr结构体
这是Linux 下tcp协议的一部分,与ip协议相同取BIG,其中source是源端口,dest 是目的端口,seq是s序,ack_seq是a序号,其余的是tcp的连接标志其中包括6个标志:syn表示连接请求,urg 表示紧急信息,fin表示连接结束,ack表示连接应答,psh表示推栈标志,rst表示中断连接。window是表示接受数据窗口大小,check是校验码,urg ptr是紧急指针。
(5)udphdr结构体
这是Linux下ip协议中udp协议的一部分,以下是相应数据结构:
struct udphdr
{
u_int16_t source;/* 源端口*/
u_int16_t dest;/* 目的端口*/
u_int16_t len;/* udp 长度*/
u_int16_t check;/*校验码*/
}
本文设计的是一个基于Linux主机的包过滤型个人防火墙,它实现的功能和现今市场上流行的防火墙有巨大差距。随着技术的不断发展,防火墙也处于不断的变化之中。防火墙技术经历了包过滤、应用代理网关再到状态检测三个阶段。其中状态检测是比较先进的防火墙技术,它摒弃了包过滤防火墙仅考查数据包的 IP 地址等几个参数,而不关心数据包连接状态变化的缺点,在防火墙的核心部分建立状态连接表,并将进出网络的数据当成一个个的会话,利用状态表跟踪每一个会话状态。状态检测技术在大力提高安全防范能力的同时也改进了流量处理速度。状态监测技术采用了一系列优化技术,使防火墙性能大幅度提升,能应用在各类网络环境中,尤其是在一些规则复杂的大型网络上。深度包检测技术将为防火墙的发展提升到一个新的阶段。该技术对数据包头或有效载荷所封装的内容进行分析,从而引导、过滤和记录基于IP的应用程序和Web服务通信流量,其工作并不受协议种类和应用程序类型的限制。采用深度包检测技术,企业网络可以获得性能上的大幅度提升而无需购买昂贵的服务器或是其他安全产品。
参考文献
[1]孙建华 等编著. 网络系统管理――Linux实训篇[M]. 人民邮电出版社.2003.10.
[2][美]Robert L.Ziegler著. 余青霓译. Linux防火墙[M]. 人民邮电出版社. 2000.10.
[3][美]Arthur Griffith著. GCC技术参考大全[M]. 清华大学出版社. 2004.7.
[4][美]Christopher Negus著. Red Hat Linux 9宝典[M]. 电子工业出版社.2004.10.
[5][美]Terry William Ogletree著. 防火墙原理与实施[M]. 电子工业出版社.2001.2.
[6]林宇 郭凌云编著. Linux网络编程[M]. 人民邮电出版社 2000.10.
[7]Linux环境下的网络编程. http://www.blog.edu.cn/more.asp?name=minico&id=114134.
[8]深入学习Linux下的网络监听技术. .
(华南理工大学计算机学院 陈晓霞 华南师范大学电信学院 刘寿强 陈梓忠)