使用libnet与libpcap构造TCP/IP协议软件

本文介绍了如何在Linux环境下利用libnet和libpcap库实现用户态的TCP/IP协议软件minitcpip,该软件实现了TCP基本通讯功能,提供调试接口和类似SOCKET接口的函数库。文章详细阐述了libnet和libpcap的作用,以及如何使用这两个库构建ARP协议,并讨论了minitcpip的实现细节和限制。
摘要由CSDN通过智能技术生成

转自:褚蓬飞 (white_cpf@21cn.com), 中国科学院软件技术研究所

简介: 本文在RED HAT Linux8.0+以太网环境下,利用libnet和libpcap库实现了一个以太网上用户态的单进程的TCP/IP协议软件包:minitcpip,该软件实现了TCP协议的基本通讯功能,并提供了一个调试接口和一个与标准SOCKET接口类似的接口函数库minisocket,方便用户的调试与应用软件的调用。这个用户态的协议软件包的实现,为学习综合使用libnet和libpcap提供了良好的范例;通过对这个软件包的学习,还可以加深对TCP/IP协议(尤其是在以太网上)的运行原理的理解;另外,由于这个软件包运行在单进程、用户态环境下,也为调试和学习带来了极大的方便。


概述

目前有许多不同的成熟的TCP/IP协议的实现版本,其中大部分都在操作系统的核心实现,这种方案固然是提高TCP/IP协议软件的效率的必然所选,但却给TCP/IP协议的学习、研究和调试带来了很大的困难。于是,如果不考虑TCP/IP协议软件实现的效率问题,在应用进程中实现一个TCP/IP协议软件,是具有一定的意义和价值的。

本文作者构造了一个单进程的TCP/IP协议软件:minitcpip,并提供了一个SOCKET接口函数库:minisocket。在实现这个协议软件函数库时,作者选择采用了libnet+libpcap的方式在用户态下实现这个软件,不仅是因为这样可以避开一些操作系统对底层网络开发的种种限制带来的不便,将精力集中在对协议软件本身的理解上;另外一个原因,则是为大家学习和综合使用libnet和libpcap提供一个范例。

下文首先介绍了libnet和libpcap函数库及其使用,并给出了一个利用其实现ARP协议的例程--该协议的实现也包括在minitcpip软件之中,然后给出了本文的协议软件和SOCKET函数库实现的方案,并围绕本文主题,对涉及到的一些关键技术问题进行了分析,最后,对这种实现方法做了一个简单的总结,指出了这种实现方法的一些局限。

何谓libnet、libpcap

目前众多的网络安全程序、工具和软件都是基于socket设计和开发的。由于在安全程序中通常需要对网络通讯的细节(如连接双方地址/端口、服务类型、传输控制等)进行检查、处理或控制,象数据包截获、数据包头分析、数据包重写、甚至截断连接等,都几乎在每个网络安全程序中必须实现。为了简化网络安全程序的编写过程,提高网络安全程序的性能和健壮性,同时使代码更易重用与移植,最好的方法就是将最常用和最繁复的过程函数,如监听套接口的打开/关闭、数据包截获、数据包构造/发送/接收等,封装起来,以API library的方式提供给开发人员使用。

在众多的API library中,对于类Unix系统平台上的网络安全工具开发而言,目前最为流行的C API library有libnet、libpcap、libnids和libicmp等。它们分别从不同层次和角度提供了不同的功能函数。使网络开发人员能够忽略网络底层细节的实现,从而专注于程序本身具体功能的设计与开发。其中,

libnet提供的接口函数主要实现和封装了数据包的构造和发送过程。

libpcap提供的接口函数主要实现和封装了与数据包截获有关的过程。

利用这些C函数库的接口,网络安全工具开发人员可以很方便地编写出具有结构化强、健壮性好、可移植性高等特点的程序。因此,这些函数库在网络安全工具的开发中具有很大的价值,在scanner、sniffer、firewall、IDS等领域都获得了极其广泛的应用,著名的tcpdump软件、ethereal软件等就是在libpcap的基础上开发的。

另外也应该指出:由于其功能强大,这些函数库也被黑客用来构造TCP/IP网络程序对目标主机进行攻击。然而,TCP/IP网络的安全不可能也不应该建立在禁止大家使用工具的基础上,一个理想的网络,首先必须是一个开放的网络,这个网络应该在使用任何工具的情况下都是安全的和健壮的。从这点考虑,这些工具的使用,对促进现有网络系统的不断完善是大有裨益的。

libnet函数库框架和使用

libnet是一个小型的接口函数库,主要用C语言写成,提供了低层网络数据报的构造、处理和发送功能。libnet的开发目的是:建立一个简单统一的网络编程接口以屏蔽不同操作系统低层网络编程的差别,使得程序员将精力集中在解决关键问题上。他的主要特点是:

高层接口:libnet主要用C语言写成

可移植性:libnet目前可以在Linux、FreeBSD、Solaris、WindowsNT等操作系统上运行,并且提供了统一的接口

数据报构造:libnet提供了一系列的TCP/IP数据报文的构造函数以方便用户使用

数据报的处理:libnet提供了一系列的辅助函数,利用这些辅助函数,帮助用户简化那些烦琐的事务性的编程工作

数据报发送:libnet允许用户在两种不同的数据报发送方法中选择。

另外libnet允许程序获得对数据报的绝对的控制,其中一些是传统的网络程序接口所不提供的。这也是libnet的魅力之一。

libnet支持TCP/IP协议族中的多种协议,比如其上一个版本libnet1.0支持了10种协议,一些新的协议,比如对IPV6的支持还在开发之中。

libnet目前最新的版本是1.1版本,在该版本中,作者将这些函数做了进一步的封装,用户的使用步骤也得到了进一步的简化。内存的初始化、管理、释放等以及校验和的计算等函数,在默认情况下,都无须用户直接干预,使得libnet的使用更为方便。作者还提供了基于老版本的应用程序移植到新版本上的方法指导。利用libnet1.1函数库开发应用程序的基本步骤以及几个关键的函数使用方法简介如下:

  1. 初始化
    libnet_t *libnet_init(int injection_type, char *device, char *err_buf);
    

    该函数初始化libnet函数库,返回一个libnet_t类型的描述符,以备随后的构造数据报和发送数据报的函数中使用。injection_type指明了发送数据报使用的接口类型,如数据链路层或者原始套接字等。Device是一个网络设备名称的字符串,在Linux下是"eth0"等。如果函数错误,返回NULL,而err_buf字符串中将携带有错误的原因。

  2. 数据报的构造

    libnet提供了丰富的数据报的构造函数,可以构造TCP/IP协议族中大多数协议的报文,还提供了一些对某些参数取默认数值的更简练的构造函数供用户选择。比如libnet_autobuild_ipv4()等。

  3. 数据报的发送
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值