Libnids開發包介紹

來源:互聯網
上載者:User

 

Libnids開發包介紹
 

Libnids是一個用於網路入侵檢測開發的專業編程介面,它使用了Libpcap所以它具有捕獲資料包的功能。同時,Libnids提供了TCP資料流重組功能,所以對於分析基於TCP協議的各種協議Libnids都能勝任.Libnids還提供了對IP分區進行重組的功能,以及連接埠掃描檢測和異常資料包檢測功能。
Libnids資料結構

一.基本常量

1.警示類型

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_BIGAQUEUE,//表示TCP接收的隊列資料過多

NIDS_WARN_TCP_BADFLAGS//表示錯誤標記

}

2.Libnids狀態

在對TCP資料流進行重組時,必須考慮到TCP的串連狀態,在Libnids中為了方便開發而定義了6種Libnids狀態(描述的是串連的邏輯狀態)

#define NIDS_JUST_EST 1//表示tcp串連建立

#define NIDS_DATA 2  //表示接受資料的狀態

#define NIDS_CLOSE 3 //表示tcp串連正常關閉

#define NIDS_RESET 4 //表示tcp串連被重設關閉

#define NIDS_TIMED_OUT 5 //表示由於逾時tcp串連被關閉

#define NIDS_EXITING 6  //表示libnids正在退出

真正的TCP串連狀態有11種

enum

{

TCP_ESTABLISHED=1, //表示ESTABLISH狀態,TCP串連建立,開始傳輸資料

TCP_SYN_SENT,//表示syn_sent狀態,主動開啟

TCP_SYN_RECV,//表示syn_recv狀態,接收SYN

TCP_FIN_WAIT1,//表示FIN_WAIT_1狀態

TCP_FIN_WAIT2,//表示FIN_WAIT2狀態

TCP_TIME_WAIT//表示TIME_WAIT狀態

TCP_ClOSE,//表示Closed狀態

TCP_CLOSE_WAIT,//表示CLose_WAIT狀態

TCP_LAST_ACK,//表示LAST_ACK狀態

TCP_LISTEN,//表示LISTEN狀態

TCP_CLOSING//表示CLOSING 狀態

}

3.校正和,與此相關的常量定義如下:

#define NIDS_DO_CHKSUM 0  //表示告訴Libnids要計算校正和

#define NIDS_DONT_CHKSUM 1//表示告訴LIbnids不需要計算校正和

二。資料結構

1.tuple4:此資料結構是Libnids中最基本的一種資料結構

struct tuple4

{

u_short source;//源連接埠

u_short dest;//目標連接埠

u_int saddr; //源IP

u_int daddr;//目的IP

};//用於描述一個地址連接埠對,它表示發送方IP和連接埠以及接收方IP和連接埠

2.half_stream:此資料結構用來描述在tcp串連中一端的所有資訊,可以使用戶端也可以是服務端。

struct half_stream

{

char state;//表示通訊端的狀態,也就是tcp串連狀態

char collect;//表示是否儲存資料到data中,如果大於0就儲存,否則忽略

char collect_urg;//是否儲存緊急資料到urgdata中,如果大於0就儲存,否則忽略

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_seg;

u_char urgdata;//用來儲存緊急資料

u_char count_new_urg;//表示是否有新的緊急資料到達

u_char urg_seen;

u_int urg_ptr;

u_short window;

u_char ts_on;

u_int curr_ts;

struct skbuff *list;

struct skbuff *listtail;

}

3.tcp_stream:描述的是一個TCP串連的所有資訊

struct tcp_stream

{

struct tuple4 addr;//是一個tuple4類型的成員,它表示一個tcp串連的四個重要訊息

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;

};//描述了一個TCP串連的完整資訊

4.nids_prm:描述libnids的一些全域參數資訊

struct nids_prm

{

int n_tcp_streams;//表示哈西表大小,此哈西表用來存放tcp_stream資料結構,

int n_hosts;//表示存放ip片段資訊的哈西表的大小

char *device;

char *filename;//用來儲存網路資料擷取檔案.如果設定了檔案,與此同時就應該設定成員device為null,預設值為NULL

int sk_buff_size;//表示資料結構sk_buff的大小.資料結構sk_buff是linux核心中一個重要的資料結構,是用來進行資料包隊列操作的

int dev_addon;//表示在資料結構sk_buff中用於網路介面上資訊的位元組數,如果是-1(預設值),那麼libnids會根據不同的網路介面進行修正

void (*syslog)();//函數指標,預設值為nids_syslog()函數.在syslog中可以檢測入侵攻擊,如:網路掃描攻擊

函數定義類型為nids_syslog(int type,int errnum,struct ip_header * iph,void *data)

int syslog_level;//表示日誌等級,預設值為LOG_ALERT.

int scan_num_hosts;//表示儲存連接埠掃描資訊的哈西表的大小

int scan_delay;//表示在掃描檢測中,兩連接埠掃描的間隔時間

int scan_num_ports;//表示相同源地址必須掃描的tcp連接埠數目

void (*no_mem)(char *);//當libnids發生記憶體溢出時被調用

int (*ip_filter)();//函數指標,此函數可以用來分析ip資料包,當有ip資料包到達時,此函數被調用.預設值為nids_ip_filter,該函數的定義如下:

static int nids_ip_filter(struct ip * x,int len)

char *pcap_filter;//表示過濾規則

int promisc;//表示網卡模式,非0為混雜模式,否則為非混雜模式,預設值為1

int one_loop_less;//表示捕獲資料返回的時間,以豪秒計算.預設值為1024

int pcap_timeout;

};

在Libnids中用nids_prm資料結構定義了一個全域變數nids_params,其定義和初始值如下:

struct nids_prm nids_params={

1040,//n_tcp_streams

256,//n_hosts

NULL,//device

NULL,//filename

168,//sk_buff_size

-1,//dev_addon

nids_syslog,//syslog()

LOG_ALERT,//syslog_level

256,//scan_num_hosts

3000,//scan_delay

10,//scan_num_prots

nids_no_mem,//no_mem()

nids_ip_filter,//ip_filter

NULL,//pcap_filter

1,//promisc

0,//one_loop_less

1024//pcap_timeout

}在使用Libnids開發程式時,可以首先對nids_params全域變數的值進行修改,這樣對整個Libnids就全部有效

5.nids_chksum_ctl:描述的是計算校正和

struct nids_chksum_ctl

{

u_int netaddr;

u_int mask;

u_int action;//表示動作,如果是NIDS_DO_CHKSUM,表示要計算校正和;如果是NIDS_DONT_CHKSUM表示不計算校正和

u_int reserved;     

}

三.Libnids函數

1.基本函數

(1)int  nids_init(void);//對libnids進行初始化

(2)void nids_run(void);//運行Libnids,進入迴圈捕獲資料包狀態.

(3)int nids_getfd(void);//獲得檔案描述號

(4)int nids_dispatch(int cnt)//功能是調用Libpcap中的捕獲資料包函數pcap_dispatch().

(5)int nids_next(void)//調用Libpcap中的捕獲資料包函數pcap_next()

(6)void nids_register_chksum_ctl(struct nids_chksum_ctl *ptr,int nr)//決定是否計算校正和,它是根據資料結構nids_chksum_ctl中的action進行決定的

2.IP片段函數

(1)void nids_register_ip_frag(void(*))//此函數的功能是註冊一個能夠檢測所有IP資料包的回呼函數,包括IP片段

eg:nids_register_ip_frag(ip_frag_function);

這樣就定義了一個回呼函數ip_frag_function的定義類型如下:

void ip_frag_function(struct ip *a_packet,int len)

(2)void nids_register_ip(void(*))//此函數定義一個回呼函數,此回呼函數可以接受正常的IP資料包,eg:

nids_register_ip(ip_function);

此回呼函數的定義類型如下:

void ip_function(struct ip * a_packet)

3.TCP資料流重組函數

(1)void nids_register_tcp(void(*))

回呼函數的功能是註冊一個TCP串連的回呼函數,回呼函數的類型定義如下:

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

其中參數ns表示一個tcp串連的所有資訊,它的類型是tcp_stream資料結構;參數param表示要傳遞的串連參數資訊,可以指向一個TCP串連的私人資料

(2)void nids_killtcp(struct tcp_stream * a_tcp)//此函數功能是終止TCP串連

(3)void nids_discard(struct tcp_stream *a_tcp,int num)//丟棄num位元組TCP資料,用於儲存更多的資料

4.UDP註冊函數

(1)void nids_register_udp(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負載內容

利用Libnids開發的流程

用函數nids_init()進行初始化。

然後註冊相應的回呼函數。不同的回呼函數實現不同的功能

最後利用函數nids_run()進入迴圈捕獲資料包的狀態。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.