Libnids学习笔记

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Libnids学习笔记

一、Libnids概述

Libnids(Library Network Intrusion Detection System)是网络入侵检测开发的专业编程接口,实现了网络入侵检测系统的基本框架,提供了一些基本的功能。Libnids是基于Libpcap和Libnet而开发的,其主要功能包括捕获网络数据包、IP碎片重组、TCP数据流重组以及端口扫面攻击检测和异常数据包检测等。

二、Libnids安装

Libnids需要支持库Libpcap和Libnet,此外,编译过程还需要byacc、flex 和glib(2.2+)。在CentOS 6.5下安装Libnids的步骤:

1.安装byacc、flex和glib

# yum install byacc

# yum install flex

# yum -y install glib2-devel

2.安装Libpcap开发包

# tar –xzvf libpcap-x.y.z.tar.gz

# ./configure

# make

# make install

3.安装Libnet开发包

# tar –xzvf libnet-x.y.z.tar.gz

# ./configure

# make

# make install

4.安装Libnids开发包

# tar –xzvf libnids.x.y.tar.gz

# ./configure

# make

# make install

三、Libnids编程模型

在Linux下使用libnids开发应用程序,源文件中需要包含头文件nids.h,并且拥有libnids库libnids.a或libnids.so.x.x。程序的main函数通常采用以下结构:main()

{

与libnids无关的程序私有过程

设置libnids参数(可选)

初始化libnids,if (!nids_init()) 失败处理

注册libnids回调函数

运行libnids,nids_run()

}

四、Libnids编译

libnids 1.24版本下,使用到的开发包是libnids、libpcap、libnet、libgthread-2.0和libnsl,它们的库名分别为nids、pcap、net、gthread-2.0和nsl。

在Linux下使用gcc链接编译时,要注意先后顺序,越是底层库,位置越后,因此的编译命令如下:

# gcc x.c -o x -lnids -lpcap -lnet -lgthread-2.0 -lnsl 五、Libnids状态

Libnids中TCP连接的状态主要有如下6种:

#define NIDS_JUST_EST 1:表示TCP连接刚刚建立,在此状态下可以通过连接参数(IP地址、端口号等)决定是否对此TCP连接后来的数据进行分析,并且可以指定接收数据的类型(共四种,分别是给客户端、给服务器以及给二者的带外数据);

#define NIDS_DATA 2:表示新的TCP数据已到达,数据存储在tcp_stream 的half_stream结构中;

#define NIDS_CLOSE 3:表示TCP连接正常关闭;

#define NIDS_RESET 4:表示TCP连接被重置关闭;

#define NIDS_TIMED_OUT 5:表示由于超时TCP连接被关闭;

#define NIDS_EXITING 6:表示Libnids正在退出,在此状态下可以最后一次使用存储在half_stream结构中的数据。

六、Libnids数据结构

1.tuple4结构

该结构描述一个TCP连接的连接参数。

struct tuple4

{

u_short source, dest;// 源、目标端口号

u_int saddr、daddr;// 源、目标IP地址

}

2.half_stream结构

该结构描述TCP连接中一个方向上的信息。

struct half_stream

{

char state;// 套接字的状态,即TCP连接状态

char collect;// 正值则有数据存储在data中,否则该方向数据被忽略

char collect_urg;// 正值则有带外数据存储在urgdata中,否则被忽略

char *data;// 存储正常接收到的数据

int offset;// 存储在data中数据在第一个字节的偏移量

int count;// 从TCP连接开始存储在data中的数据的字节数

int count_new;// 最新存储到data中的数据的字节数

int bufsize;

int rmem_alloc;

int urg_count;

u_int acked;

u_int seq;

u_int ack_seq;

u_int first_data_seq;

u_char urgdata;// 存储带外数据

u_char count_new_urg;// 最新存储到urgdata中的带外数据的字节数

u_int urg_ptr;

u_short window;

u_char ts_on;

u_char wscale_on;

相关文档
最新文档