Nids.h详细注释

#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 */
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值