您的位置:首页 > 理论基础 > 计算机网络

(NIDS)网络入侵检测函数接口说明

2014-02-18 17:54 399 查看


网络入侵检测系统(NIDS)函数接口说明

基本函数

1、nids_register_chksum_ctl

struct nids_chksum_ctl {

u_intnetaddr;

u_int mask;

u_intaction;

u_intreserved;

};

void nids_register_chksum_ctl(struct nids_chksum_ctl*ptr,intnr)

该函数没有返回值。

参数1:ptr
表示结构体nids_chksum_ctl的列表

参数2:nr
表示列表的个数

此函数的功能是决定是否计算校验和。它是根据数据结构nids_chksum_ctl中的action进行决定的,如果所要计算的对象不在列表中,则必须都要计算校验和。

2、nids_init

int nids_init(void)

函数返回值:函数调用成功就返回1,失败就返回0。

此函数的功能是对Libnids进行初始化,这是所有设计基于Libnids的程序最开始调用的函数。它的主要内容打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路层类型、进行必要的初始化工作。

TCP数据流重组函数

3、nids_register_tcp

struct half_stream

{

char state;

char collect;

char collect_urg;

char *data;

intoffset;

intcount;

intcount_new;

intbufsize;

intrmem_alloc;

inturg_count;

u_int acked;

u_int seq;

u_int ack_seq;

u_int first_data_seq;

u_char urgdata;

u_char count_new_urg;

u_char urg_seen;

u_int urg_ptr;

u_short window;

u_char ts_on;

u_char wscale_on;

u_int curr_ts;

u_int wscale;

struct skbuff *list;

struct skbuff *listtail;

};

struct tuple4

{

u_short source;
//源端口

u_short dest;
//目的端口

u_int saddr;
//源IP

u_int daddr;
//目的
IP

};

struct tcp_stream

{

struct tuple4 addr;

char nids_state;

struct lurker_node *listeners;

struct half_stream client;

struct half_stream server;

struct tcp_stream *next_node;

struct tcp_stream *prev_node;

inthash_index;

struct tcp_stream *next_time;

struct tcp_stream *prev_time;

intread;

struct tcp_stream *next_free;

void *user;

};

tcp_stream数据结构描述了一个TCP连接的完整信息,包括的内容非常丰富,它是Libnids开发包中最重要一个数据结构。

成员client表示客户端信息,成员server表示服务器端信息,它们都是half_stream类型的。这样tcp_stream数据结构就描述了一个完整的TCP连接的所有信息。

调用回调函数后,在回调函数中会判断tcp_stream结构体中的nids_state成员的状态,该成员表示连接的逻辑状态,共有6种状态:

NIDS_JUST_EST:表示TCP连接建立,在此状态下就可以决定是否对此TCP连接进行数据分析,可以决定是否捕获TCP客户端接收的数据、TCP服务器端接收的数据、TCP客户端接收的紧急数据或者TCP服务器端接收的紧急数据;

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

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

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

NIDS_EXITING:表示Libnids正在退出,在这个状态下可以最后一次使用存储在half_stream数据结构中的缓存数据;

NIDS_DATA:表示接收数据的状态,在这个状态可以判断是否有新的数据到达,如果有就可以把数据存储起来,可以在这个状态之中来分析TCP传输的数据,此数据就存储在half_stream数据结构的缓存之中。

voidnids_register_tcp(void(*))

函数返回值:无

参数描述:一个回调函数

此函数是注册一个TCP连接的回调函数。回调函数的类型定义如下:

voidtcp_callback(struct tcp_stream*ns,void **param);

其中参数ns表示一个TCP连接的所有信息,它的类型是tcp_stream数据结构;

参数param表示要传递的连接参数信息,可以指向一个TCP连接的私有数据。

此回调函数接收的TCP数据存放在half_stream的缓存中,应该马上取出来,一旦此回调函数返回,此数据缓存中存储的数据就不存在了。half_stream成员offset描述了被丢弃的数据字节数。如果不想马上取出来,而是等到存储一定数量的数据之后再取出来,那么可以使用函数nids_discard(structtcp_stream*a_tcp.int
num_bytes)来处理。这样,回调函数返回时,Libnids将丢弃缓存数据之前的num_bytes字节的数据。如果不调用nids_discard()函数,那么缓存数据的字节应该为count_new()字节。一般情况下,缓存中的数据应该是count-offset字节(count减去offset)。

///////////////////////////////////////////////////////

struct half_stream
的成员:

count:自连接建立以来已经有多少字节已经发送到data缓冲区中;

offset:保存到data缓冲区中的第一个字节的偏移量

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

3.1 nids_discard

void nids_discard (structtcp_stream *a_tcp, int num);

函数返回值:无

参数a_tcp:表示一个TCP连接

参数num:表示个数

此函数的功能是:丢弃num字节TCP数据,用于存储更多的数据。

4、nids_run

void nids_run(void);

函数返回值:无

参数描述:无

此函数的功能是运行Libnids,进入循环捕获数据包状态。它实际上是调用Libpcap函数pcap_loop()来循环捕获数据包。

Libnids读书笔记:

Libnids(Library Network
Intrusion
DetectionSystem)网络入侵检测开发包,基于libpcap和libnet开发,是仿照linux内核中的TCP/IP协议部分而实现的。

libnids主要功能:

捕获网络数据包、IP碎片重组、TCP数据流重组以及端口扫描攻击检测和异常数据包检测等。

IP碎片重组是libnids的一个重要内容,是仿照linux内核中的IP重组而实现的,所以非常可靠。

libnids提供了TCP数据流重组功能,这是libpcap所不具备的,利用TCP数据流重组,可以分析基于TCP协议的各种应用层协议。另外,LIBNIDS还提供了检测TCP端口扫描攻击的功能,检测异常数据包的功能,这是入侵检测系统(IDS)最基本的功能。

LIBNIDS的使用范围:

1. 入侵检测系统

2. 网络协议分析

3. 网络嗅探(网络监视)

除此之外利用LIBSNIDS还可以重现网络内容,还原网络数据,如重现HTTP协议中传输的网页、POP3协议中传输的电子邮件等。

LIBNIDS数据结构

基本常量

1.报警类型

下面是在LIBSNIDS中定义的警告描述常量

2. LIBNIDS状态

在对TCP数据流进行重组时,必须考虑到TCP的连接状态,在LIBNIDS中为了方便开发而定义了LIBNIDS状态,共有如下6种:

LIBNIDS描述的是连接的逻辑状态。真正的TCP连接状态有11种,它们对应于TCP协议的状态变迁图中的各个状态,定义如下:

3.校验和

实现了关于是否计算校验和的功能

tuple4

是LIBNIDS中最基本的一种数据结构

half_stream

用来描述TCP连接中一端的所有信息,客户端或服务器端。

tcp_stream

是一个TCP连接的所有信息

nids_prm

描述了LIBNIDS的一些全局参数信息

其中ip_filter函数指针,当IP数据包到达时,默认函数nids_ip_filter被调用,如果此函数返回非零值,此数据包就被处理;如果返回零,就被丢弃。nids_ip_filter函数定义如下:

在LIBNIDS中用nids_prm数据结构定义了一个全部变量nids_params,其定义和初始值如下:

在使用LIBNIDS开发程序时,可以首先对nids_params全局变量的值进行修改,这样对整个libnids就全部有效。

nids_chksum_ctl

描述的是计算检验和

LIBNIDS函数

1.基本函数

int nids_init(void);

函数返回值:函数调用成功返回1,失败返回0

对LIBNIDS进行初始化,主要内容包括打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路类型、进行必要的初始化工作。

void nids_run(void);

欲行LIBNIDS,进入循环捕获数据包状态。实际上是调用LIBPCAP函数pcap_loop()来循环捕获数据包。

int nids_getfd(void);

函数返回值:执行成功就返回文件描述符,失败就返回-1。

获得文件描述符号

int nids_dispatch(int cnt);

函数返回值:函数执行成功就返回个数、失败就返回负数

参数描述:参数cnt表示捕获的数据包的个数

功能是调用LIBPCAP中的捕获数据包函数pcap_dispatch();

int nids_next(void);

函数返回值:成功1,失败0

调用LIBPCAP中捕获数据包函数pcap_next();

void nids_register_chksum_ctl(structnids_chksum_ctl *ptr, int nr)

参数描述:参数ptr表示nids_chksum_ctl列表,参数nr表示列表中的个数

决定是否计算检验和。是根据数据结构nids_chjsum_ctl中的action进行决定的,如果所要计算的对象不在列表中,则必须都要计算检验和。

2.IP碎片函数

void nids_register_ip_frag(void(*));

参数描述:参数应该是一个回调函数的名字

注册一个能够检测所有IP数据包的回调函数,包括IP碎片。例如可用如下方式调用:

nids_register_ip_frag(ip_frag_function);

这样就注册了一个回调函数ip_ftag_function的定义类型如下:

void ip_frag_function(struct ip*a_packet, int len);

其中a_packet表示接受的IP数据包,参数len表示接受的数据包的长度。

此回调函数中可以检测所有的IP数据包,包括IP碎片。

void nids_register_ip(void(*));

参数描述:参数应该是一个回调函数的名字。

注册一个回调函数,可以接受正常的IP数据包。可以使用如下方式调用:

nids_register_ip(ip_function);

注册一个回调函数ip_function,此回调函数的定义类型如下:

void ip_function(struct ip *a_packet);

其中a_packet表示的是所捕获的IP数据包。

3.TCP数据流重组函数

void nids_register_tcp(void(*));

参数是一个回调函数

注册一个TCP连接的回调函数。定义如下:

void tcp_callback(struct tcp_stream*ns, void **param);

其中参数ns表示一个TCP连接的所有信息,它的类型是tcp_stream数据结构;参数param表示要传递的连接参数信息,可以指向一个TCP连接的私有数据。

此回调函数接受的TCP数据存放在half_stream的缓存中,应该马上取出来,一旦此回调函数返回,此数据缓存中存储的数据就不存在了。half_stream成员offset描述了呗丢地的数据字节数。如果不想马上取出来,而是等到存储一定数量的数据之后再取出来,那么可以使用函数nids_discard(struct
tcp_stream *a_tcp, int num_bytes);来处理。这样回调函数返回时,LIBNIDS将丢弃缓存数据之前的num_bytes字节的数据。如果不调用nids_discard()函数,那么缓存数据的字节应该为count_new字节。一般情况下,缓存中的数据应该是count_offset字节。

void nids_killtcp(struct tcp_stream * a_tcp)

a_tcp表示一个TCP连接

终止TCP连接。实际上是调用LIBNET的函数进行构造数据包,然后发送出去。

void nids_discard(struct tcp_stream *a_tcp, int num)

a_tcp表示一个TCP连接,参数num表示个数

丢弃num字节TCP数据,用于存储更多的数据。

4. UDP注册函数

LIBNIDS也提供了对UDP协议的分析,其注册函数定义如下:

void nids_register_udp(void(*))

参数是一个回调函数

注册一个分析UDP协议的回调函数,定义如下:

void udp_callback(struct tuple4*addr, char * buf, int len, struct ip *iph)

addr表示地址端口信息,包括UDP发送端的IP地址和端口,以及UDP接收端额IP地址和端口;buf表示UDP协议负载数据内容;len表示UDP负载数据的长度;iph表示一个IP数据包,包括IP首部、UDP首部以及UDP负载内容。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: