#ifndef _NIDS_NIDS_H
#define _NIDS_NIDS_H
#define NIDS_MAJOR 1???? /*
主版本號(hào)
*/
#define NIDS_MINOR 20??? /*
次版本號(hào)
*/
#include <sys/types.h>
enum
{
?
NIDS_WARN_IP = 1,????? /*
表示
IP
數(shù)據(jù)包異常
*/
?
NIDS_WARN_TCP,???????? /*
表示
TCP
數(shù)據(jù)包異常
*/
?
NIDS_WARN_UDP,??????? /*
表示
UDP
數(shù)據(jù)包異常
*/
?
NIDS_WARN_SCAN
?????? /*
表示有掃描攻擊發(fā)生
*/
};
?
enum
{
?
NIDS_WARN_UNDEFINED = 0,???? /*
表示未定義
*/
?
NIDS_WARN_IP_OVERSIZED,?????? /*
表示
IP
數(shù)據(jù)包超長(zhǎng)
*/
?
NIDS_WARN_IP_INVLIST,????????????? /*
表示無(wú)效的碎片隊(duì)列
*/
?
NIDS_WARN_IP_OVERLAP,?????????? /*
表示發(fā)生重疊
*/
?
NIDS_WARN_IP_HDR,?????????? /*
表示無(wú)效
IP
首部
,IP
數(shù)據(jù)包發(fā)生異常
*/
?
NIDS_WARN_IP_SRR,???????????? /*
表示源路由
IP
數(shù)據(jù)包
*/
?
NIDS_WARN_TCP_TOOMUCH,??? /*
表示
TCP
數(shù)據(jù)個(gè)數(shù)太多
,
因?yàn)樵?/span>
Libnids
中在同一時(shí)刻捕獲的
TCP
個(gè)數(shù)最大值為
TCP
連接參數(shù)的哈西表長(zhǎng)度的
3/4*/
?
NIDS_WARN_TCP_HDR,???????????????? /*
表示無(wú)效
TCP
首部
,TCP
數(shù)據(jù)包發(fā)生異常
*/
?
NIDS_WARN_TCP_BIGQUEUE,???? /*
表示
TCP
接受的隊(duì)列數(shù)據(jù)過(guò)多
*/
?
NIDS_WARN_TCP_BADFLAGS
????
/*
表示錯(cuò)誤標(biāo)記
*/
};
?
/*Libnids
狀態(tài)描述的是連接的邏輯狀態(tài)
,
真正的
TCP
連接狀態(tài)有
11
種
.
?*TCP_ESTABLISHED?????? TCP
連接建立
,
開(kāi)始傳輸數(shù)據(jù)
?*TCP_SYN_SEND????????????
主動(dòng)打開(kāi)
?*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
連接建立
,
在此狀態(tài)下就可以決定是否對(duì)此
TCP
連接進(jìn)行數(shù)據(jù)分析
,
可以決定是否捕獲
TCP
客戶端接收的數(shù)據(jù)
,TCP
服務(wù)端接收的數(shù)據(jù)
,TCP
客戶端接收的緊急數(shù)據(jù)或者
TCP
客戶端接收的緊急數(shù)據(jù)
*/
#define NIDS_DATA 2????????????????? /*
表示接收數(shù)據(jù)的狀態(tài)
,
在這個(gè)狀態(tài)可以判斷是否有新的數(shù)據(jù)到達(dá)
,
如果有就可以把數(shù)據(jù)存儲(chǔ)起來(lái)
,
可以在這個(gè)狀態(tài)之中來(lái)分析
TCP
傳輸?shù)臄?shù)據(jù)
,
此數(shù)據(jù)就存儲(chǔ)在
half_stream
數(shù)據(jù)接口的緩存之中
*/
#define NIDS_CLOSE 3???????????????? /*
表示
TCP
連接正常關(guān)閉
*/
#define NIDS_RESET 4???????????????? /*
表是
TCP
連接被重置關(guān)閉
*/
#define NIDS_TIMED_OUT 5???? /*
表示由于超時(shí)
TCP
連接被關(guān)閉
*/
#define NIDS_EXITING?? 6?????? /*
表示
Libnids
正在退出
,
在這個(gè)狀態(tài)下可以最后一次使用存儲(chǔ)在
half_stream
數(shù)據(jù)結(jié)構(gòu)中的緩存數(shù)據(jù)
*/
?
/*
校驗(yàn)和
*/
#define NIDS_DO_CHKSUM? 0????????? /*
表示告訴
Libnids
要計(jì)算校驗(yàn)和
*/
#define NIDS_DONT_CHKSUM 1?????? /*
表示告訴
Libnids
不要計(jì)算校驗(yàn)和
*/
?
struct tuple4???????????????? /*
描述一個(gè)地址端口對(duì)
,
它表示發(fā)送發(fā)
IP
和端口以及接收方
IP
和端口
,
適用
TCP,UDP*/
{
? u_short source;???????? /*
源
IP
地址的端口號(hào)
*/
? u_short dest;??????????? /*
目的
IP
地址的端口號(hào)
*/
? u_int saddr;????????????? /*
源
IP
地址
*/
? u_int daddr;????????????? /*
目的
IP
地址
*/
};
?
struct half_stream??????? /*
描述在
TCP
連接中一端的所有信息
,
可以是客戶端
,
也可以是服務(wù)端
*/
{
? char state;???????????????? /*
表示套接字的狀態(tài)
,
也就是
TCP
的狀態(tài)
*/
? char collect;????????????? /*
可以表示有數(shù)據(jù)到達(dá)
,
此數(shù)據(jù)存放在
data
成員中
,
也可以表示不存儲(chǔ)此數(shù)據(jù)到
data
中
,
此數(shù)據(jù)忽略
.
如果大于
0
就存儲(chǔ)
,
否則就忽略
*/
? char collect_urg;?????? /*
可以表示有緊急數(shù)據(jù)到達(dá)
,
此數(shù)據(jù)就存放在
urgdata
中
,
也可以表示不存儲(chǔ)此數(shù)據(jù)到
urgdata
中
,
此速數(shù)據(jù)忽略
.
如果大于
0
就存儲(chǔ)
,
否則就忽略
*/
?
? char *data;??????????????? /*
用戶存儲(chǔ)正常接受到的數(shù)據(jù)
*/
? int offset;????????????????? /*
表示存儲(chǔ)在
data
中數(shù)據(jù)的第一個(gè)字節(jié)的偏移量
*/
? int count;????????????????? /*
表示從
TCP
連接開(kāi)始已經(jīng)存儲(chǔ)到
data
中的數(shù)據(jù)的字節(jié)數(shù)
*/
? int count_new;???????? /*
有多少新的數(shù)據(jù)存儲(chǔ)到
data
中
,
如果為
0,
則表示沒(méi)有新的數(shù)據(jù)到達(dá)
*/
? int bufsize;
? int rmem_alloc;
?
? int urg_count;? /*
用來(lái)存儲(chǔ)緊急數(shù)據(jù)
*/
? u_int acked;????
? u_int seq;
? u_int ack_seq;
? u_int first_data_seq;
? u_char urgdata;
? u_char count_new_urg;???? /*
表示有新的緊急數(shù)據(jù)到達(dá)
,
如果為
0
表示沒(méi)有新的緊急數(shù)據(jù)
*/
? 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???????? /*
描述一個(gè)
TCP
連接的所有信息
*/
{
? struct tuple4 addr;
? char nids_state;
? struct lurker_node *listeners;
? struct half_stream client;?? /*
表示客戶端信息
*/
? struct half_stream server;? /*
表示服務(wù)端信息
*/
? 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
的一些全局參數(shù)信息
*/
{
? int n_tcp_streams;?? /*
表示哈西表大小
,
此哈西表用來(lái)存放
tcp_stream
數(shù)據(jù)結(jié)構(gòu)
,
默認(rèn)值
1040.
在同一時(shí)刻
Libnids
捕獲的
TCP
數(shù)據(jù)包的最大個(gè)數(shù)必須是此參數(shù)值的
3/4*/
? int n_hosts;????????????? /*
表示哈西表的大小
,
此哈西表用來(lái)存儲(chǔ)
IP
碎片信息的
,
默認(rèn)值為
256*/
? char *device;?? /*
表示網(wǎng)絡(luò)接口
,Libnids
將在此網(wǎng)絡(luò)接口上捕獲數(shù)據(jù)
,
默認(rèn)值為
NULL.
這樣
Libnids
將使用
pcap_lookupdev
來(lái)查找可以用的網(wǎng)絡(luò)接口
.
如果其值為
all,
表示捕獲所有網(wǎng)絡(luò)接口的數(shù)據(jù)
*/
? char *filename;???????? /*
表示用來(lái)存儲(chǔ)網(wǎng)絡(luò)數(shù)據(jù)的捕獲文件
,
此文件的類型必須與
Libpcap
類型一致
,
如果設(shè)置了文件
,
與此同時(shí)就應(yīng)該設(shè)置
device
為
NULL,
默認(rèn)值為
NULL*/
? int sk_buff_size;????? /*
表示的是數(shù)據(jù)接口
sk_buff
的大小
.sk_buff
是
Linux
內(nèi)核中一個(gè)重要的數(shù)據(jù)結(jié)構(gòu)
,
是用來(lái)進(jìn)行數(shù)據(jù)包排隊(duì)操作的
,
默認(rèn)值為
168*/
? int dev_addon;????????? /*
表示在數(shù)據(jù)結(jié)構(gòu)
sk_buff
中用于網(wǎng)絡(luò)接口上信息的字節(jié)數(shù)
.
如果是
-1(
默認(rèn)值
),
那么
Libnids
會(huì)根據(jù)不同的網(wǎng)絡(luò)接口進(jìn)行修正
*/
? void (*syslog) ();????? /*
是一個(gè)函數(shù)指針
,
默認(rèn)值為
nids_syslog()
函數(shù)
.
在
syslog
函數(shù)中可以檢測(cè)入侵攻擊
,
如網(wǎng)絡(luò)掃描攻擊
,
也可以檢測(cè)一些異常情況
,
如無(wú)效
TCP
標(biāo)記
*/
? int syslog_level;?????? /*
表示日志等級(jí)
,
默認(rèn)值是
LOG_ALERT*/
? int scan_num_hosts;????????? /*
表示一個(gè)哈西表的大小
,(
此哈西表用來(lái)存儲(chǔ)端口掃描信息
)
表示
Libnids
將要檢測(cè)的同時(shí)掃描的端口數(shù)據(jù)
.
如果其值為
0,Libnids
將不提供端口掃描功能
.
默認(rèn)值
256*/
? int scan_delay;???????? /*
表示在掃描檢測(cè)中
,
倆端口掃描的間隔時(shí)間
,
以毫秒來(lái)計(jì)算
,
缺省值為
3000*/
? int scan_num_ports;????????? /*
表示相同源地址必須掃描的
TCP
端口數(shù)目
,
默認(rèn)值為
10*/
? void (*no_mem) (char *);? /*
是一個(gè)函數(shù)指針
,
當(dāng)
Libnids
發(fā)生內(nèi)存溢出時(shí)被調(diào)用
*/
? int (*ip_filter) ();????? /*
是一個(gè)函數(shù)指針
,
此函數(shù)可以用來(lái)分析
IP
數(shù)據(jù)包
,
當(dāng)有
IP
數(shù)據(jù)包到達(dá)時(shí)
,
此函數(shù)就被調(diào)用
.
如果此函數(shù)返回非零值
,
此數(shù)據(jù)包就被處理
;
如果返回零
,
此
IP
數(shù)據(jù)包就被丟棄
.
默認(rèn)值為
nids_ip_filter
函數(shù)
,
總是返回
1.*/
? char *pcap_filter;???? /*
表示過(guò)濾規(guī)則
,
即
Libpcap
的過(guò)濾規(guī)則
,
默認(rèn)值為
NULL,
表示捕獲所有數(shù)據(jù)包
.
可以在此設(shè)置過(guò)濾規(guī)則
,
只捕獲感興趣的開(kāi)發(fā)包
*/
? int promisc;????????????? /*
表示網(wǎng)卡模式
,
如果是非零
,
就把此網(wǎng)卡設(shè)置為混雜模式
;
否則
,
設(shè)為非混雜模式
.
默認(rèn)值為
1*/
? int one_loop_less;??? /*
初始值為
0*/
? int pcap_timeout;???? /*
表示捕獲數(shù)據(jù)返回的時(shí)間
,
以毫秒計(jì)算
.
實(shí)際上它表示的就是
Libpcap
函數(shù)中的
pcap_open_live
函數(shù)的
timeout
參數(shù)
,
默認(rèn)值
1024*/
};
?
/*
?*
返回值
:
調(diào)用成功返回
1,
失敗返回
0
?*
參
?
數(shù)
:
無(wú)
?*
功
?
能
:
對(duì)
Libnids
初始化
,
這是所有設(shè)計(jì)基于
Libnids
的程序最開(kāi)始調(diào)用的函數(shù)
.
它的主要內(nèi)容包括打開(kāi)網(wǎng)絡(luò)接口
,
打開(kāi)文件
,
編譯過(guò)濾規(guī)則
,
?*????
判斷網(wǎng)絡(luò)鏈路層類型
,
進(jìn)行必要的初始化工作
?*/
int nids_init (void);
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
回調(diào)函數(shù)名字
?*
功
?
能
:
注冊(cè)一個(gè)能夠檢測(cè)所有
IP
數(shù)據(jù)包的回調(diào)函數(shù)
,
包括
IP
碎片
.e.g
?
?????? nids_register_ip_frag(ip_frag_function);
?
?????? void ip_frag_function(struct ip * a_packet,int len)
?
?????? a_packet
表示接收的
IP
數(shù)據(jù)包
len
表示接收的數(shù)據(jù)包長(zhǎng)度
?
??????
此回調(diào)函數(shù)可以檢測(cè)所有的
IP
數(shù)據(jù)包
,
包括
IP
碎片
?*/
void nids_register_ip_frag (void (*));????? /**/
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
回調(diào)函數(shù)名字
?*
功
?
能
:
注冊(cè)一個(gè)回調(diào)函數(shù)
,
此回調(diào)函數(shù)可以接收正常的
IP
數(shù)據(jù)包
.e.g
?
?????? nids_register_ip_frag(ip_frag_function);
?
?????? void ip_frag_function(struct ip * a_packet)
?
?????? a_packet
表示接收的
IP
數(shù)據(jù)包
?
??????
此回調(diào)函數(shù)可以接收正常的
IP
數(shù)據(jù)包
,
并在此函數(shù)中對(duì)捕獲數(shù)到的
IP
數(shù)據(jù)包進(jìn)行分析
.
?*/
void nids_register_ip (void (*));???? /**/
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
回調(diào)函數(shù)
?*
功
?
能
:
注冊(cè)一個(gè)
TCP
連接的回調(diào)函數(shù)
.
回調(diào)函數(shù)的類型定義如下
:
?
??????
?void tcp_callback(struct tcp_stream * ns,void ** param)
?
??????
?ns
表示一個(gè)
TCP
連接的所有信息
, param
表示要傳遞的參數(shù)信息
,
可以指向一個(gè)
TCP
連接的私有數(shù)據(jù)
?
??????
?
此回調(diào)函數(shù)接收的
TCP
數(shù)據(jù)存放在
half_stream
的緩存中
,
應(yīng)該馬上取出來(lái)
,
一旦此回調(diào)函數(shù)返回
,
此數(shù)據(jù)緩存中存儲(chǔ)的數(shù)據(jù)就不存在
?
??????
?
了
.half_stream
成員
offset
描述了被丟棄的數(shù)據(jù)字節(jié)數(shù)
.
如果不想馬上取出來(lái)
,
而是等到存儲(chǔ)一定數(shù)量的數(shù)據(jù)之后再取出來(lái)
,
那么可
?
??????
?
以使用函數(shù)
nids_discard(struct tcp_stream * ns, int num_bytes)
來(lái)處理
.
這樣回調(diào)函數(shù)返回時(shí)
,Libnids
將丟棄緩存數(shù)據(jù)之前
?
??????
?
的
num_bytes
字節(jié)的數(shù)據(jù)
.
如果不調(diào)用
nids_discard()
函數(shù)
,
那么緩存數(shù)據(jù)的字節(jié)應(yīng)該為
count_new
字節(jié)
.
一般情況下
,
緩存中的數(shù)據(jù)
?
??????
?
應(yīng)該是
count-offset
字節(jié)
?*/
void nids_register_tcp (void (*));
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
回調(diào)函數(shù)
?*
功
?
能
:
注冊(cè)一個(gè)分析
UDP
協(xié)議的回調(diào)函數(shù)
,
回調(diào)函數(shù)的類型定義如下
:
?
??????
?void udp_callback(struct tuple4 * addr,char *buf,int len,struct ip *iph)
?
??????
?addr
表示地址端口信息
buf
表示
UDP
協(xié)議負(fù)載的數(shù)據(jù)內(nèi)容
len
表是
UDP
負(fù)載數(shù)據(jù)的長(zhǎng)度
iph
表示一個(gè)
IP
數(shù)據(jù)包
,
包括
IP
首部
,UDP
首部以及
UDP
負(fù)載內(nèi)容
?*/
void nids_register_udp (void (*));
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
表示一個(gè)
TCP
連接
?*
功
?
能
:
終止
TCP
連接
.
它實(shí)際上是調(diào)用
Libnet
的函數(shù)進(jìn)行構(gòu)造數(shù)據(jù)包
,
然后發(fā)送出去
?*/
void nids_killtcp (struct tcp_stream *);
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
參數(shù)
1
一個(gè)
TCP
連接
參數(shù)
2
個(gè)數(shù)
?*
功
?
能
:
丟棄參數(shù)
2
字節(jié)
TCP
數(shù)據(jù)
,
用于存儲(chǔ)更多的數(shù)據(jù)
?*/
void nids_discard (struct tcp_stream *, int);
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
無(wú)
?*
功
?
能
:
運(yùn)行
Libnids,
進(jìn)入循環(huán)捕獲數(shù)據(jù)包狀態(tài)
.
它實(shí)際上是調(diào)用
Libpcap
函數(shù)
pcap_loop()
來(lái)循環(huán)捕獲數(shù)據(jù)包
?*/
void nids_run (void);
/*
?*
返回值
:
調(diào)用成功返回文件描述符
,
失敗返回
-1
?*
參
?
數(shù)
:
無(wú)
?*
功
?
能
:
獲得文件描述符號(hào)
?*/
int nids_getfd (void);
/*
?*
返回值
:
調(diào)用成功返回個(gè)數(shù)
,
失敗返回負(fù)數(shù)
?*
參
?
數(shù)
:
表示捕獲數(shù)據(jù)包的個(gè)數(shù)
?*
功
?
能
:
調(diào)用
Libpcap
中的捕獲數(shù)據(jù)包函數(shù)
pcap_dispatch()
?*/
int nids_dispatch (int);
/*
?*
返回值
:
調(diào)用成功返回
1,
失敗返回
0
?*
參
?
數(shù)
:
無(wú)
?*
功
?
能
:
調(diào)用
Libpcap
中的捕獲數(shù)據(jù)包函數(shù)
pcap_next()
?*/
int nids_next (void);
?
extern struct nids_prm nids_params;?????? /*libnids.c
定以了一個(gè)全部變量
,
其定義和初始值在
nids_params*/
extern char *nids_warnings[];????????
extern char nids_errbuf[];
extern struct pcap_pkthdr *nids_last_pcap_header;
?
struct nids_chksum_ctl {????? /*
描述的是計(jì)算校驗(yàn)和
,
用于決定是否計(jì)算校驗(yàn)和
*/
???????? u_int netaddr;?????????????? /*
表示地址
*/
???????? u_int mask;?????????????????? /*
表示掩碼
*/
???????? u_int action;???????????????? /*
表示動(dòng)作
,
如果是
NIDS_DO_CHKSUM,
表示計(jì)算校驗(yàn)和
;
如果是
NIDS_DONT_CHKSUM,
表示不計(jì)算校驗(yàn)和
*/
???????? u_int reserved;????????????? /*
保留未用
*/
};
/*
?*
返回值
:
無(wú)
?*
參
?
數(shù)
:
參數(shù)
1
表示
nids_chksum_ctl
列表
參數(shù)
2
表示列表中的個(gè)數(shù)
?*
功
?
能
:
決定是否計(jì)算校驗(yàn)和
.
它是根據(jù)數(shù)據(jù)結(jié)構(gòu)
nids_chksum_ctl
中的
action
進(jìn)行決定的
,
如果所要計(jì)算的對(duì)象不在列表中
,
則必須都要計(jì)算校驗(yàn)和
?*/
extern void nids_register_chksum_ctl(struct nids_chksum_ctl *, int);
?
#endif /* _NIDS_NIDS_H */