Libnids学习笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;