#ifndef _NIDS_NIDS_H
#define _NIDS_NIDS_H
#define NIDS_MAJOR 1???? /*
主版本號
*/
#define NIDS_MINOR 20??? /*
次版本號
*/
#include <sys/types.h>
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);
?
#endif /* _NIDS_NIDS_H */