WEB开发网
开发学院网络安全防火墙 Linux防火墙数据包捕获模块 阅读

Linux防火墙数据包捕获模块

 2006-07-04 12:38:22 来源:WEB开发网   
核心提示: (2)打开Socket设备用socket函数来打开Socket设备,sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))domain域使用AF_PACKET,能够既接收链路层也接收网络层的数据包,Linux防火墙数据包捕获模块(6),(3

(2)打开Socket设备

用socket函数来打开Socket设备。

sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

domain域使用AF_PACKET,能够既接收链路层也接收网络层的数据包。

(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位的源地址的物理网卡地址*/

上一页  1 2 3 4 5 6 7  下一页

Tags:Linux 防火墙 数据

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接