科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道Linux防火墙数据包捕获模块(5)

Linux防火墙数据包捕获模块(5)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文设计的是一个基于Linux主机的包过滤型个人防火墙,它实现的功能和现今市场上流行的防火墙有巨大差距。随着技术的不断发展,防火墙也处于不断的变化之中。

作者:51CTO.COM 2007年11月11日

关键字: 模块 数据包 防火墙 Linux

  • 评论
  • 分享微博
  • 分享邮件

  网络接口的混杂模式使得一个网络接口设备从只能读取目标地址为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设备

  用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结构体

  以下是相应数据结构:

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章