//////////////////////////////////////// ///@file libpag.h /// ///@brief netfirm2.0的pag接口头文件,包括流还原和正则式匹配 /// ///修改记录: /// ///@author mingyr@sugon.com ///@date 2012-11-22 ///将乃军在2.0项目中所作的配置分流比例功能移植到3.0 /// ///@author jinj@sugon.com ///@date 2011-05-16 /// ///修改发包实现原理,为发包函数增加时间戳参数以填充附加包头信息 /// ///@author liuzhh@dawning.com.cn ///@date 2010-05-23 ///增加了避免重复包含的_PAG_STREAM_宏,去掉了pag_delstream的流编号参数 /// ///@author liuzhh@dawning.com.cn ///@date 2010-05-15 ///联调应用中发现应用在新建连接时要给tcp_stream中的应用数据指针malloc分配空间, ///为提高性能,增加app_info_struct结构,避免应用malloc /// ///@author liuzhh@dawning.com.cn ///@date 2009-11-10 /// ///建立文档 //////////////////////////////////////// #ifndef _LIBPAG_H_ #define _LIBPAG_H_ #ifdef __cplusplus extern "C" { #endif //////////// 头文件 /////////// #include #include #include #if 0 ////////// 宏定义 /////////////// ///@name 五元组分类的规则类型 //@{ #define FILTER_TYPE_1 1 #define FILTER_TYPE_2 2 #define FILTER_TYPE_3 3 #define FILTER_TYPE_4 4 #define FILTER_TYPE_5 5 #define FILTER_TYPE_6 6 #define FILTER_TYPE_7 7 #define FILTER_TYPE_8 8 #define FILTER_TYPE_9 9 #define FILTER_TYPE_10 10 #define FILTER_TYPE_11 11 #define FILTER_TYPE_12 12 #define FILTER_TYPE_13 13 #define FILTER_TYPE_14 14 #define FILTER_TYPE_15 15 #define FILTER_TYPE_16 16 //@} ///@name 五元组规则的过滤动作 //@{ #define FILTER_ACTION_PASS 0 ///<放行报文 #define FILTER_ACTION_DROP 1 ///<丢弃报文 #define FILTER_ACTION_SYNPASS 2 ///<丢弃当前连接报文,看到SYN(新连接)删除规则,放行报文 //@} ///@name 对五元组规则的操作 //@{ #define FILTER_RULE_ADD 0 ///<增加规则 #define FILTER_RULE_DEL 1 ///<删除规则 //@} ///@name 发封堵包类型 //@{ enum rule_action_id { OP_NONE = 0, OP_SYN_RST, OP_SYN_FIN, OP_RST, OP_FIN, OP_SYN_RST_ACK, OP_SYN_FIN_ACK, OP_RST_ACK, OP_FIN_ACK, }; //@} ///@name 发日志包类型 //@{ enum rule_log_id { LOG_NONE = 0, ///< 不记日志 LOG_S, ///<记录日志信息 LOG_M, ///<转发报文信息 }; //@} ///@name tcp连接状态 //@{ #define NIDS_HALF_EST 0 #define NIDS_JUST_EST 1 #define NIDS_DATA 2 #define NIDS_CLOSE 3 #define NIDS_RESET 4 #define NIDS_TIME_OUT 5 //@} ///@name tcp连接方向 //@{ #define DIR_C2S 0x1 #define DIR_S2C 0x2 #define DIR_DOUBLE 0x3 //@} ///@name 应用层协议 //@{ #define PME_PROTO_UNKNOWN 0 #define PME_PROTO_HTTP 1 #define PME_PROTO_FTP 2 #define PME_PROTO_TELNET 3 #define PME_PROTO_SMTP 4 #define PME_PROTO_POP3 5 #define PME_PROTO_SOCKS 6 #define PME_PROTO_PD 7 #define PME_PROTO_WEBMAIL 8 #define PME_PROTO_IMAP 12 #define PME_PROTO_ICQ 13 #define PME_PROTO_MSN 14 #define PME_PROTO_YMSG 15 #define PME_PROTO_DNS 16 #define PME_PROTO_NETSEND 17 #define PME_PROTO_MMS 18 #define PME_PROTO_RTSP 19 #define PME_PROTO_EMULE 20 //@} ///@name 增加处理IPV4、IPV6双栈的隐藏结构定义 //@{ struct pkt_header{ char __a[50]; }; typedef struct pkt_header packet_t; //@} ///@name 专用网卡五元组分类相关结构 //@{ ///五元组规则结构体 struct filter_full_rule { __u32 sip; ///<源ip __u32 dip; ///<目的ip __u16 sport; ///<源端口 __u16 dport; ///<目的端口 __u32 ruleid; ///<规则id __u8 optype; ///<操作类型:增加或者删除规则 __u8 ruletype; ///<规则类型 __u8 iaction; ///<对捕获报文的处理动作(pass,drop,synpass) __u8 send_action; ///<发包动作(发送不同的报文 ) __u8 log_action; ///<发日志(发送不同的日志) __u8 protocol; ///<协议类型 __u16 pad; ///<保留 }; ///IPV6五元组规则结构体 struct filter_full_rule_v6 { struct in6_addr sip; ///<源ip struct in6_addr dip; ///<目的ip __u16 sport; ///<源端口 __u16 dport; ///<目的端口 __u32 ruleid; ///<规则id __u8 optype; ///<操作类型:增加或者删除规则 __u8 ruletype; ///<规则类型 __u8 iaction; ///<对捕获报文的处理动作(pass,drop,synpass) __u8 send_action; ///<发包动作(发送不同的报文 ) __u8 log_action; ///<发日志(发送不同的日志) __u8 protocol; ///<协议类型 __u16 pad; ///<保留 }; ///日志包附加头结构体 struct _logrz { __u32 src_ip; //访问者IP __u32 dst_ip; //被访问者IP __u16 src_port; //访问者端口号 __u16 dst_port; //被访问者端口号 __u32 local_ip; //处理机IP,即本机IP __u32 time; //发现时间 __u32 rule_id; //配置ID __u8 rule_type; //配置类型 __u8 proto; //协议( 17:TCP 6:UDP) __u16 pktlen; //负载报文长度 }; //@} #if 0 //#ifndef _PAG_STREAM_ //避免应用多次包含 #define _PAG_STREAM_ ///@name tcp还原相关结构 //@{ ///四元组 struct tuple4 { u_short source; ///<源端口 u_short dest; ///<目的端口 u_int saddr; ///<源ip u_int daddr; ///<目的ip }; struct tuple4_v6 { struct in6_addr sip; ///<源ip struct in6_addr dip; ///<目的ip u_short sport; ///<源端口 u_short dport; ///<目的端口 }; ///半流结构体 struct half_stream { char *data; ///<收到的TCP负载数据 u_int offset; ///