分类: C/C++
2006-11-12 13:42:02
#ifndef _NIDS_NIDS_H
#define _NIDS_NIDS_H
#define NIDS_MAJOR 1 /*
主版本号
*/
#define NIDS_MINOR 20 /*
次版本号
*/
#include
enum
{
NIDS_WARN_IP = 1, /*
表示
IP
数据包异常
*/
NIDS_WARN_TCP, /*
表示
TCP
数据包异常
*/
NIDS_WARN_UDP, /*
表示
UDP
数据包异常
*/
NIDS_WARN_SCAN
/*
表示有扫描攻击发生
*/
};
enum
{
NIDS_WARN_UNDEFINED = 0, /*
表示未定义
*/
NIDS_WARN_IP_OVERSIZED, /*
表示
IP
数据包超长
*/
NIDS_WARN_IP_INVLIST, /*
表示无效的碎片队列
*/
NIDS_WARN_IP_OVERLAP, /*
表示发生重叠
*/
NIDS_WARN_IP_HDR, /*
表示无效
IP
首部
,IP
数据包发生异常
*/
NIDS_WARN_IP_SRR, /*
表示源路由
IP
数据包
*/
NIDS_WARN_TCP_TOOMUCH, /*
表示
TCP
数据个数太多
,
因为在
Libnids
中在同一时刻捕获的
TCP
个数最大值为
TCP
连接参数的哈西表长度的
3/4*/
NIDS_WARN_TCP_HDR, /*
表示无效
TCP
首部
,TCP
数据包发生异常
*/
NIDS_WARN_TCP_BIGQUEUE, /*
表示
TCP
接受的队列数据过多
*/
NIDS_WARN_TCP_BADFLAGS
/*
表示错误标记
*/
};
/*Libnids
状态描述的是连接的逻辑状态
,
真正的
TCP
连接状态有
11
种
.
*TCP_ESTABLISHED TCP
连接建立
,
开始传输数据
*TCP_SYN_SEND
主动打开
*TCP_SYN_RECV
接受
SYN
*TCP_FIN_WAIT1
*TCP_FIN_WAIT2
*TCP_TIME_WAIT
*TCP_CLOSE
*TCP_CLOSE_WAIT
*TCP_LAST_ACK
*TCP_LISTEN
*TCP_CLOSING
*/
#define NIDS_JUST_EST 1 /*
表示
TCP
连接建立
,
在此状态下就可以决定是否对此
TCP
连接进行数据分析
,
可以决定是否捕获
TCP
客户端接收的数据
,TCP
服务端接收的数据
,TCP
客户端接收的紧急数据或者
TCP
客户端接收的紧急数据
*/
#define NIDS_DATA 2 /*
表示接收数据的状态
,
在这个状态可以判断是否有新的数据到达
,
如果有就可以把数据存储起来
,
可以在这个状态之中来分析
TCP
传输的数据
,
此数据就存储在
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
数据结构中的缓存数据
*/
/*
校验和
*/
#define NIDS_DO_CHKSUM 0 /*
表示告诉
Libnids
要计算校验和
*/
#define NIDS_DONT_CHKSUM 1 /*
表示告诉
Libnids
不要计算校验和
*/
struct tuple4 /*
描述一个地址端口对
,
它表示发送发
IP
和端口以及接收方
IP
和端口
,
适用
TCP,UDP*/
{
u_short source; /*
源
IP
地址的端口号
*/
u_short dest; /*
目的
IP
地址的端口号
*/
u_int saddr; /*
源
IP
地址
*/
u_int daddr; /*
目的
IP
地址
*/
};
struct half_stream /*
描述在
TCP
连接中一端的所有信息
,
可以是客户端
,
也可以是服务端
*/
{
char state; /*
表示套接字的状态
,
也就是
TCP
的状态
*/
char collect; /*
可以表示有数据到达
,
此数据存放在
data
成员中
,
也可以表示不存储此数据到
data
中
,
此数据忽略
.
如果大于
0
就存储
,
否则就忽略
*/
char collect_urg; /*
可以表示有紧急数据到达
,
此数据就存放在
urgdata
中
,
也可以表示不存储此数据到
urgdata
中
,
此速数据忽略
.
如果大于
0
就存储
,
否则就忽略
*/
char *data; /*
用户存储正常接受到的数据
*/
int offset; /*
表示存储在
data
中数据的第一个字节的偏移量
*/
int count; /*
表示从
TCP
连接开始已经存储到
data
中的数据的字节数
*/
int count_new; /*
有多少新的数据存储到
data
中
,
如果为
0,
则表示没有新的数据到达
*/
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; /*
表示有新的紧急数据到达
,
如果为
0
表示没有新的紧急数据
*/
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 tcp_stream /*
描述一个
TCP
连接的所有信息
*/
{
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;
int hash_index;
struct tcp_stream *next_time;
struct tcp_stream *prev_time;
int read;
struct tcp_stream *next_free;
};
struct nids_prm /*
描述了
Libnids
的一些全局参数信息
*/
{
int n_tcp_streams; /*
表示哈西表大小
,
此哈西表用来存放
tcp_stream
数据结构
,
默认值
1040.
在同一时刻
Libnids
捕获的
TCP
数据包的最大个数必须是此参数值的
3/4*/
int n_hosts; /*
表示哈西表的大小
,
此哈西表用来存储
IP
碎片信息的
,
默认值为
256*/
char *device; /*
表示网络接口
,Libnids
将在此网络接口上捕获数据
,
默认值为
NULL.
这样
Libnids
将使用
pcap_lookupdev
来查找可以用的网络接口
.
如果其值为
all,
表示捕获所有网络接口的数据
*/
char *filename; /*
表示用来存储网络数据的捕获文件
,
此文件的类型必须与
Libpcap
类型一致
,
如果设置了文件
,
与此同时就应该设置
device
为
NULL,
默认值为
NULL*/
int sk_buff_size; /*
表示的是数据接口
sk_buff
的大小
.sk_buff
是
Linux
内核中一个重要的数据结构
,
是用来进行数据包排队操作的
,
默认值为
168*/
int dev_addon; /*
表示在数据结构
sk_buff
中用于网络接口上信息的字节数
.
如果是
-1(
默认值
),
那么
Libnids
会根据不同的网络接口进行修正
*/
void (*syslog) (); /*
是一个函数指针
,
默认值为
nids_syslog()
函数
.
在
syslog
函数中可以检测入侵攻击
,
如网络扫描攻击
,
也可以检测一些异常情况
,
如无效
TCP
标记
*/
int syslog_level; /*
表示日志等级
,
默认值是
LOG_ALERT*/
int scan_num_hosts; /*
表示一个哈西表的大小
,(
此哈西表用来存储端口扫描信息
)
表示
Libnids
将要检测的同时扫描的端口数据
.
如果其值为
0,Libnids
将不提供端口扫描功能
.
默认值
256*/
int scan_delay; /*
表示在扫描检测中
,
俩端口扫描的间隔时间
,
以毫秒来计算
,
缺省值为
3000*/
int scan_num_ports; /*
表示相同源地址必须扫描的
TCP
端口数目
,
默认值为
10*/
void (*no_mem) (char *); /*
是一个函数指针
,
当
Libnids
发生内存溢出时被调用
*/
int (*ip_filter) (); /*
是一个函数指针
,
此函数可以用来分析
IP
数据包
,
当有
IP
数据包到达时
,
此函数就被调用
.
如果此函数返回非零值
,
此数据包就被处理
;
如果返回零
,
此
IP
数据包就被丢弃
.
默认值为
nids_ip_filter
函数
,
总是返回
1.*/
char *pcap_filter; /*
表示过滤规则
,
即
Libpcap
的过滤规则
,
默认值为
NULL,
表示捕获所有数据包
.
可以在此设置过滤规则
,
只捕获感兴趣的开发包
*/
int promisc; /*
表示网卡模式
,
如果是非零
,
就把此网卡设置为混杂模式
;
否则
,
设为非混杂模式
.
默认值为
1*/
int one_loop_less; /*
初始值为
0*/
int pcap_timeout; /*
表示捕获数据返回的时间
,
以毫秒计算
.
实际上它表示的就是
Libpcap
函数中的
pcap_open_live
函数的
timeout
参数
,
默认值
1024*/
};
/*
*
返回值
:
调用成功返回
1,
失败返回
0
*
参
数
:
无
*
功
能
:
对
Libnids
初始化
,
这是所有设计基于
Libnids
的程序最开始调用的函数
.
它的主要内容包括打开网络接口
,
打开文件
,
编译过滤规则
,
*
判断网络链路层类型
,
进行必要的初始化工作
*/
int nids_init (void);
/*
*
返回值
:
无
*
参
数
:
回调函数名字
*
功
能
:
注册一个能够检测所有
IP
数据包的回调函数
,
包括
IP
碎片
.e.g
nids_register_ip_frag(ip_frag_function);
void ip_frag_function(struct ip * a_packet,int len)
a_packet
表示接收的
IP
数据包
len
表示接收的数据包长度
此回调函数可以检测所有的
IP
数据包
,
包括
IP
碎片
*/
void nids_register_ip_frag (void (*)); /**/
/*
*
返回值
:
无
*
参
数
:
回调函数名字
*
功
能
:
注册一个回调函数
,
此回调函数可以接收正常的
IP
数据包
.e.g
nids_register_ip_frag(ip_frag_function);
void ip_frag_function(struct ip * a_packet)
a_packet
表示接收的
IP
数据包
此回调函数可以接收正常的
IP
数据包
,
并在此函数中对捕获数到的
IP
数据包进行分析
.
*/
void nids_register_ip (void (*)); /**/
/*
*
返回值
:
无
*
参
数
:
回调函数
*
功
能
:
注册一个
TCP
连接的回调函数
.
回调函数的类型定义如下
:
void tcp_callback(struct tcp_stream * ns,void ** param)
ns
表示一个
TCP
连接的所有信息
, param
表示要传递的参数信息
,
可以指向一个
TCP
连接的私有数据
此回调函数接收的
TCP
数据存放在
half_stream
的缓存中
,
应该马上取出来
,
一旦此回调函数返回
,
此数据缓存中存储的数据就不存在
了
.half_stream
成员
offset
描述了被丢弃的数据字节数
.
如果不想马上取出来
,
而是等到存储一定数量的数据之后再取出来
,
那么可
以使用函数
nids_discard(struct tcp_stream * ns, int num_bytes)
来处理
.
这样回调函数返回时
,Libnids
将丢弃缓存数据之前
的
num_bytes
字节的数据
.
如果不调用
nids_discard()
函数
,
那么缓存数据的字节应该为
count_new
字节
.
一般情况下
,
缓存中的数据
应该是
count-offset
字节
*/
void nids_register_tcp (void (*));
/*
*
返回值
:
无
*
参
数
:
回调函数
*
功
能
:
注册一个分析
UDP
协议的回调函数
,
回调函数的类型定义如下
:
void udp_callback(struct tuple4 * addr,char *buf,int len,struct ip *iph)
addr
表示地址端口信息
buf
表示
UDP
协议负载的数据内容
len
表是
UDP
负载数据的长度
iph
表示一个
IP
数据包
,
包括
IP
首部
,UDP
首部以及
UDP
负载内容
*/
void nids_register_udp (void (*));
/*
*
返回值
:
无
*
参
数
:
表示一个
TCP
连接
*
功
能
:
终止
TCP
连接
.
它实际上是调用
Libnet
的函数进行构造数据包
,
然后发送出去
*/
void nids_killtcp (struct tcp_stream *);
/*
*
返回值
:
无
*
参
数
:
参数
1
一个
TCP
连接
参数
2
个数
*
功
能
:
丢弃参数
2
字节
TCP
数据
,
用于存储更多的数据
*/
void nids_discard (struct tcp_stream *, int);
/*
*
返回值
:
无
*
参
数
:
无
*
功
能
:
运行
Libnids,
进入循环捕获数据包状态
.
它实际上是调用
Libpcap
函数
pcap_loop()
来循环捕获数据包
*/
void nids_run (void);
/*
*
返回值
:
调用成功返回文件描述符
,
失败返回
-1
*
参
数
:
无
*
功
能
:
获得文件描述符号
*/
int nids_getfd (void);
/*
*
返回值
:
调用成功返回个数
,
失败返回负数
*
参
数
:
表示捕获数据包的个数
*
功
能
:
调用
Libpcap
中的捕获数据包函数
pcap_dispatch()
*/
int nids_dispatch (int);
/*
*
返回值
:
调用成功返回
1,
失败返回
0
*
参
数
:
无
*
功
能
:
调用
Libpcap
中的捕获数据包函数
pcap_next()
*/
int nids_next (void);
extern struct nids_prm nids_params; /*libnids.c
定以了一个全部变量
,
其定义和初始值在
nids_params*/
extern char *nids_warnings[];
extern char nids_errbuf[];
extern struct pcap_pkthdr *nids_last_pcap_header;
struct nids_chksum_ctl { /*
描述的是计算校验和
,
用于决定是否计算校验和
*/
u_int netaddr; /*
表示地址
*/
u_int mask; /*
表示掩码
*/
u_int action; /*
表示动作
,
如果是
NIDS_DO_CHKSUM,
表示计算校验和
;
如果是
NIDS_DONT_CHKSUM,
表示不计算校验和
*/
u_int reserved; /*
保留未用
*/
};
/*
*
返回值
:
无
*
参
数
:
参数
1
表示
nids_chksum_ctl
列表
参数
2
表示列表中的个数
*
功
能
:
决定是否计算校验和
.
它是根据数据结构
nids_chksum_ctl
中的
action
进行决定的
,
如果所要计算的对象不在列表中
,
则必须都要计算校验和
*/
extern void nids_register_chksum_ctl(struct nids_chksum_ctl *, int);