防火墙 Linux 数据包捕获模块 包过滤

  一、防火墙

本文研究的是防火墙系统的软硬件环境以及该防火墙的开发步骤和所要实现的功能,最后重点对该防火墙系统所需要的硬件和软件平台原理进行说明。尽管所有Linux系统都自带防火墙内核程序,但需要用户进行配置才能起到保护网络安全的目的。

1、防火墙系统总体设计

本节就监控层数据包捕获模块的结构特性进行探讨,并详细论述其原理,且对实现数据包捕获功能的程序的一些重要函数进行说明。

1、数据包捕获模块结构

(1)网卡设置原理

本文中在Linux主机上用C语言编写数据包捕获程序,所编写的程序中用到很多Linux中的预定义函数,在此节将对这些基本函数的功能和使用特点进行说明。

1)ioctl函数定义

常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据包式Socket (SOCK_DGRAM)。流式是一种面向连接的Socket,针对面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,针对无连接的UDP服务应用。Socket函数原型为:

int socket(int domain, int type,int protocol);

3)recvfrom()函数定义

因为网络和主机采用的存储字节时内存顺序安排方式的差异,就存在“字节顺序”的问题。在网络环境下存储时,高位字节存放在内存的起始位置,而低字节则存放在较高的位置。主机形式的存放顺序恰好相反,低位字节存放在内存的起始位置。这就需要以下相应的字节顺序转换函数:

inet_ntoa():将32位的网络二进制数值转换为可读十进制形式的带点分割符的IP地址。

inet_addr():将带有分割符的IP地址转换为32位的unsigned long的格式。

ntohs():将网络字节顺序转换为32位的主机字节顺序。

ntohl():将网络字节顺序转换成16位的主机字节顺序。

htonl():将32位u_long的值由主机字节顺序转换为网络字节顺序。

htons():将16位u_long的值由主机字节顺序转换为网络字节顺序。

本文设计的数据捕获程序需要使用SOCK_PACKET设备,SOCK_PACKET只在基于Linux的操作系统中有效定义。为此,美国洛仑兹伯克利国家实验室编写了专用于数据包截获的API函数库“Libpcap”。该函数的设计目标是统一不同系统上所提供的用于数据包截获的不同类型接口,并使得类似的高层应用程序的编写和移植变得简单有效,不再需要对每一个应用都使用不同的依赖于具体系统的数据包截获模块。

四、基于Linux的数据包捕获模块设计实现

在数据包捕获程序中,通过设置网卡工作于混杂状态,对网络链路进行监听并收集数据包,从而获得数据包头信息。其流程图如图2所示:

启动SOCKET函数

设置网卡为混杂模式

从缓冲区接收数据

数据包格式检查并显示

数据处理模块

图2 数据包捕获模块流程图

2、数据包捕获模块实现

网络接口的混杂模式使得一个网络接口设备从只能读取目标地址为6字节MAC地址的数据包,变为可读取网络广播媒体中的所有数据包。该部分通过两次ioctl函数调用实现:

ioctl(sock, SIOCGIFFLAGS, &ifr)

ifr.ifr_flags |= IFF_PROMISC

ioctl(sock, SIOCGIFFLAGS, &ifr)

第一次的ioctl函数调用,用来截获ifr(struct ifreq)结构中所含接口名称所指接口的标记。第一个参数是打开的原始套接字描述符“sock”,第二个参数是所要执行的请求操作。第三个参数是接口请求数据结构的地址指针,该结构中包含了所以进行请求操作的接口名称值。

我们通过将混合标记(IFF_PROMISC)应用到接口请求结构的标记位变量中来改变接口标记位。操作符“|=”将混合标记符与原有的接口标记进行“或”操作来设置新的接口标记。获得新的接口标记后,将其设置到实际接口中。第二次的ioctl调用,将接口设备设置为混合模式。正如第一个ioctl调用是获得网络接口的标记,这次调用是设置ifr结构中修改过的新标记写到物理接口上。

(2)打开Socket设备

使用recvfrom()函数来实现接收数据包:

recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len)

这是从打开的网络插座Socket读取数据包的地方,但要注意,addr结构有一个强制类型转换,以适应recvfrom()函数的语法要求,recvfrom()函数在成功读取的情况下返回读取的字节数,否则返回-1。

(4)判断包头指针

(1)sockadd_in结构体

以下是相应数据结构:

struct ethhdr

{

unsigned char h_dest[ETH_ALEN];/*48位的目标地址的网卡物理地址*/

unsigned char h_source[ETH_ALEN];/*48位的源地址的物理网卡地址*/

unsigned short h_proto;/*16位的以太网协议*/

}

(3)iphdr结构体

这是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服务通信流量,其工作并不受协议种类和应用程序类型的限制。采用深度包检测技术,企业网络可以获得性能上的大幅度提升而无需购买昂贵的服务器或是其他安全产品

即使没有收获的希望也心平气和的继续。

防火墙 Linux 数据包捕获模块 包过滤

相关文章:

你感兴趣的文章:

标签云: