新用户注册入口 老用户登录入口

[转载]libnids分析(9)---nids.h注释

文章作者:转载 更新时间:2023-02-08 17:36:31 阅读数量:305
文章标签:LibnidsTCP连接状态描述数据包异常IP数据包TCP首部
本文摘要:本文详细介绍了网络入侵检测系统Libnids的核心功能与数据结构。通过对TCP连接状态的精细描述,Libnids能够有效管理并处理IP数据包及其中的TCP首部信息,及时发现如数据包异常、IP超长等问题。在处理过程中,它采用half_stream结构体存储单端TCP连接信息,并支持对TCP连接中正常数据和紧急数据的收集与分析。此外,Libnids还具备端口扫描检测能力,并提供了灵活的校验和计算选项以确保数据完整性。通过调用关键函数nids_init进行初始化配置,用户可以定制化过滤规则、注册数据包处理回调函数,实现对网络流量的实时监控与安全分析。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/xieqb/article/details/7681968。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

#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;      //新的urg数据,不是以前重复的数据

  u_int urg_ptr;/*指向urg在流中的位置*/

  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 */

本篇文章为转载内容。原文链接:https://blog.csdn.net/xieqb/article/details/7681968。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
LibnidsLibnids是一个开源的网络入侵检测系统(NIDS)库,主要用于处理网络数据包,实现TCP流重组以及分析网络流量中的异常行为。在本文中,Libnids提供了对IP数据包、TCP首部及连接状态的精细管理功能,并通过定义的数据结构如tuple4和half_stream来存储和跟踪网络连接信息。用户可以通过调用其提供的API函数(如nids_init)进行初始化配置,设置过滤规则、注册回调函数等操作,以实现实时的网络监控和安全分析。
half_stream结构体在Libnids库中,half_stream是用于描述TCP连接中单个方向(客户端或服务端)所有相关信息的核心数据结构。它包含了该方向的状态(如TCP连接建立、接收数据或关闭等)、数据收集标志、正常数据缓冲区及其偏移量与字节数统计、紧急数据缓冲区及其相关控制变量等。通过half_stream结构体,Libnids能够有效地管理和分析TCP连接中的数据传输情况。
端口扫描端口扫描是一种网络安全检测技术,也是攻击者探测目标主机开放服务、寻找潜在漏洞的重要手段。在本文上下文中,Libnids库具备检测端口扫描攻击的能力,通过设定参数scan_num_hosts和scan_delay等,可以监控同时扫描的端口数量和两次扫描之间的间隔时间,当发现有超出阈值的端口扫描活动时,会触发相应的警告或防御机制,帮助管理员识别并抵御可能的网络攻击。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在深入理解了Libnids这一网络入侵检测系统的核心功能与数据结构后,我们可以进一步探索当前网络安全领域中关于数据包分析、TCP/IP协议栈安全以及实时入侵检测的最新动态和研究成果。
近期,美国国家标准技术研究院(NIST)发布了一份关于提升网络流量分析准确性和效率的研究报告。该报告强调了对IP数据包异常检测算法的优化,以及利用机器学习改进TCP连接状态预测的重要性。研究人员正致力于研发新一代的网络入侵检测系统,这些系统不仅能处理常规的数据包重组和校验和计算,还能够通过深度学习模型识别潜在的未知攻击模式。
与此同时,开源社区也在积极推动类似Libnids的项目发展。例如,Suricata是一款集成了高性能多线程引擎、支持多种入侵检测规则集,并具备实时流量分析能力的下一代IDS/IPS系统。它不仅实现了对网络数据包的精细解析,还在处理海量数据时保证了高效能,同时提供了丰富的API接口以供用户自定义插件和扩展功能。
此外,针对网络扫描攻击等行为,业界也提出了新的防御策略和技术。例如,基于人工智能的动态防火墙策略,可以根据网络流量特征自动调整规则,有效应对端口扫描等攻击行为,极大地提升了网络安全防护水平。
综上所述,在持续演进的网络安全领域,Libnids所涉及的数据包处理机制、TCP连接管理等功能是构建现代网络防御体系的基础,而结合最新的研究进展和技术应用,则有助于我们更好地理解和应对日趋复杂且变化多端的网络威胁环境。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
env | grep VAR_NAME - 查找环境变量及其值。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
样式问题与自定义样式:解决React中ListItemButton点击反馈异常 12-23 SeaTunnel对接SFTP:应对连接不稳定与认证失败问题的配置参数优化及密钥验证实践 12-13 侧边栏个人图文简历HTML模板 12-09 [转载]@CrossOrigin Enabling CORS 11-11 Redis分布式锁:SETNX与RedLock实现机制及并发请求处理中的超时时间优化 10-15 jBooklet-jQuery简单的翻书特效插件 10-04 绿色好看房地产官网HTML框架网站模板 08-22 docker怎么搭建团队(基于Docker的私有云搭建) 08-21 基于Bootstrap的超酷jQuery开关按钮插件 07-27 本次刷新还10个文章未展示,点击 更多查看。
Struts2过滤器在Web应用程序中的配置与请求参数处理:从struts.xml配置到doFilter方法实现详解 07-17 个人简历网页html代码 07-11 甜品奶茶店铺官网网站模板展示 06-23 docker无法下载镜像(群晖docker无法下载镜像) 04-18 [转载]MULTI PROVIDERS IN ANGULAR 2 03-31 绿色简洁医疗保健服务商城网页html模板 02-05 精美的花甲美食网站模板下载 01-22 Logstash配置文件加载失败:Pipeline启动问题与路径、语法错误详解及解决方案 01-22 Apache Lucene初始化时避免NoSuchDirectoryException:确保文件目录存在的实践方法 01-08 带视觉差特效的jquery鼠标hover图片放大插件 01-08 Bootstrap博客后台管理系统网站模板 01-08
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"