日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

            歡迎訪問 生活随笔!

            生活随笔

            當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

            编程问答

            Libnids库-网络入侵检测的基础框架

            發布時間:2025/4/16 编程问答 19 豆豆
            生活随笔 收集整理的這篇文章主要介紹了 Libnids库-网络入侵检测的基础框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

            1.Libnids介紹:

            ?? Libnids(library? network intrusion detection system)是網絡入侵檢測開發的專業編程接口,實現了網絡入侵檢測系統的基本框架,提供了一些基本功能。Libnids是基于libpcap和libnet而開發的,其主要功能包括捕獲網絡數據包、IP碎片重組、TCP數據流重組以及端口掃描攻擊檢測和異常數據包檢測等。

            ?

            2.Libnids安裝:基于庫libpcap和libnet

            ? 1)安裝libpcap開發包:

            ???? tar xzvf? libpcap-x.x.x.tar.gz

            ???? ./configure

            ?????make

            ???? make install

            ??2)安裝libnet開發包:

            ???? tar zxvf libnet-x.x.x.tar.gz

            ???? ./configure

            ???? make

            ??? make install

            ? 3)安裝libnids開發包:

            ???? tar zxvf? libnids-x.x.x.tar.gz

            ???? ./configure

            ??? make

            ??? make install

            ?

            ?

            3.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不需要計算校驗和

            ?

            4.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;?????

            }

            5.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()進入循環捕獲數據包的狀態。

            ??

            總結

            以上是生活随笔為你收集整理的Libnids库-网络入侵检测的基础框架的全部內容,希望文章能夠幫你解決所遇到的問題。

            如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。