Ipfilter.h
上传用户:heseme
上传日期:2009-12-23
资源大小:228k
文件大小:10k
开发平台:

Visual C++

  1. /*ip.h*/
  2. #if !defined(FIREWALLFILTER)
  3. #define FIREWALLFILTER
  4. #if _MSC_VER > 1000
  5. #pragma once
  6. #endif // _MSC_VER > 1000
  7. #include "StdAfx.h"
  8. #include "ip.h"
  9. #include "Struct.h"
  10.  
  11. //常量
  12. enum { NO=0, YES } ;
  13. enum { DISCARD_PKT=0, ALLOW_PKT, DISCARD_AND_ANSWER_PKT };
  14. enum { ACTIVATE_NEW=0, CLEAR_ALL, INIT_NEW, MEM_REPORT };
  15. enum { READ=0, WRITE, MANAGE };
  16. enum { LOG_INFO = 0, LOG_WARNING, LOG_NOTICE };
  17. enum { T_DST_IN=0, T_DST_OUT, T_SRC_IN, T_SRC_OUT,
  18.        U_DST_IN, U_DST_OUT, U_SRC_IN, U_SRC_OUT,
  19.        I_TYP_IN, I_TYP_OUT, T_RST_IN, T_RST_OUT,
  20.        T_ACCTBL, T_REJTBL,T_INDM,T_OUTDM};
  21. enum { DEFAULT_ACCESS=0 };
  22. enum { NORMAL=0, INVERT };
  23. enum { FLAG_MULTICAST=0, FLAG_NONIP, FLAG_OTHERIP, FLAG_SUSPECTOFFSET,
  24.        FLAG_FRAGMENTEDICMP, FLAG_ATTACKICMP, MAX_FLAG };
  25. //最前面的五个不能改变
  26. enum { DB_DROP_PKT=0, DB_INSIDE_IF=1, DB_OUTSIDE_IF=2, DB_BOTH_IF=3,
  27.        DB_PROCESS_PKT=4, DB_FORWARD_PKT, DB_DROP_AND_ANSWER_PKT };
  28. #define LIST_SIZE 32
  29. #define LIST_TABLE_SIZE (LIST_SIZE * sizeof(PortListEntry))
  30. //ip包头偏移掩码
  31. #define SW_IP_OFFMASK 0xFF1F
  32. //系统常量
  33. #define DEFAULT_SYSL_MASK 0 /* 0x1FFFF 全部记入日志*/
  34. //#define DEFAULT_SYSL_FACILITY 0 //LOG_LOCAL//0
  35. enum {IN_INF=0,OUT_INF=1,DM_INF=2};
  36. enum {
  37. SYSL_IN_CLASSD,//multcast addr,srcaddr,protoclno,srcport,dstport
  38. SYSL_OUT_CLASSD,//multcast addr,srcaddr,protoclno,srcport,dstport
  39. SYSL_IN_PORT,// protocolNo, srcAddr and dstAddr,srcport,dstport
  40. SYSL_OUT_PORT, /* protocolNo, srcAddr and dstAddr,srcport,dstport */
  41. SYSL_IN_LENGTH, /* TCP/UDP-Header too short:  protocolNo, srcAddr and dstAddr,srcport,dstport */
  42. SYSL_OUT_LENGTH, /* TCP/UDP-Header too short: protocolNo, srcAddr and dstAddr,srcport,dstport */
  43. SYSL_IN_TYPE, /*  srcAddr, dstAddr, and icmp type */
  44. SYSL_OUT_TYPE, /*  srcAddr, dstAddr, and icmp type */
  45. SYSL_IN_REJECT, /*  protocolNo, srcAddr and dstAddr */
  46. SYSL_OUT_ACCEPT, /*  protocolNo, srcAddr and dstAddr */
  47. SYSL_IN_PROT, /*  nonip: protocolNo, srcAddr and dstAddr */
  48. SYSL_OUT_PROT, /*  nonip: protocolNo, srcAddr and dstAddr */
  49. SYSL_IN_OFFSET, /* suspect fragment offset:protocolNo, srcAddr and dstAddr */
  50. SYSL_OUT_OFFSET, /* suspect fragment offset:protocolNo, srcAddr and dstAddr */
  51. SYSL_IN_FRAG, /* fragmented packet:protocolNo, srcAddr and dstAddr*/
  52. SYSL_OUT_FRAG, /* fragmented packet:protocolNo, srcAddr and dstAddr */
  53. SYSL_IN_DOS, /* denial of service attack packet in:dos类型,srcaddr,dstaddr */
  54. SYSL_OUT_DOS, /* denial of service attack packet out:dos类型,srcaddr,dstaddr */
  55.     SYSL_OUT_ROUT,
  56.     SYSL_IN_ICMP,
  57.     SYSL_OUT_ICMP,
  58.     SYSL_IN_IGMP,
  59.     SYSL_OUT_IGMP,
  60. };
  61. // DOS攻击
  62.  
  63. enum dos_type {
  64. DOS_SMURF=0, DOS_PONG};
  65. //错误信息
  66. enum error_msg{
  67. NOO_ERROR,
  68. ERROR_OUT_OF_RANGE,
  69. ERROR_UNKNOWN_GROUP,
  70. ERROR_INVALID_NETWORK,
  71. ERROR_TABLE_FULL,
  72. ERROR_NET_NOT_FOUND,
  73. ERROR_NO_MEMORY,
  74. ERROR_INVALID_OP, 
  75. ERROR_IF_DOWN,
  76. ERROR_GET_IP,
  77. ERROR_INVALID_IF,
  78. ERROR_SAME_IF,
  79. ERROR_DIFF_IF_TYPE,
  80. ERROR_BAD_IF_TYPE,
  81. ERROR_INSIDE_DOWN, 
  82. ERROR_OUTSIDE_DOWN,
  83. ERROR_TWO_IP,
  84. ERROR_NO_IP,
  85. ERROR_INVALID_MODE,
  86. ERROR_NOT_INITILIZED,
  87. ERROR_RUNNING,
  88. ERROR_NOT_RUNNING,
  89. MAX_ERROR_NUM
  90. };
  91. #define DIOCINIT 1
  92. #define DIOCSTART   2
  93. #define DIOCSTOP 3
  94. #define DIOCGFLAGS 4
  95. #define DIOCSFLAGS 5
  96. #define DIOCGSTATS 6
  97. #define DIOCCSTATS 7
  98. #define DIOCGBRIDGE 8
  99. #define DIOCCBRIDGE 9
  100. #define DIOCGCLASS 10
  101. #define DIOCSCLASS 11
  102. #define  DIOCSGROUP  12
  103. #define DIOCGNETWORK 13 /* 12 no longer used */
  104. #define DIOCSNETWORK 14
  105. #define DIOCMNETWORK 15
  106. #define DIOCGOVERRIDE 16
  107. #define DIOCGREJECT 18
  108. #define DIOCSREJECT 19
  109. #define DIOCGACCEPT 20
  110. #define DIOCSACCEPT 21
  111. #define DIOCGLOGF 22
  112. #define DIOCSLOGF 23
  113. #define DIOCGLOGM 24
  114. #define DIOCSLOGM 25
  115. #define DIOCGVER 26
  116. #define DIOCGTCPRESET 27
  117. #define DIOCSTCPRESET 28
  118. #define DIOCGMGTIF 29
  119. #define DIOCSMGTIF 30
  120. #define DIOCGMMODE 31
  121. #define DIOCSMMODE 32
  122. #define DIOCS_INDM  35
  123. #define DIOCS_OUTDM  36
  124. /*==============================================================*/
  125. /*                           数据结构                           */
  126. /*==============================================================*/
  127. /*
  128. typedef union _in_addr {
  129. // ULONG s_addr;
  130. struct {
  131. BYTE s_b[4];
  132. } s_un_b;
  133. // struct {
  134. // unsigned short s_w[2];
  135. // } s_un_w;
  136. ULONG ss_addr;
  137. #define s_b s_un_b.s_b
  138. //#define s_w s_un_w.s_w
  139. } in_addr_t;
  140. */
  141. typedef struct _FilterConfig {
  142. ULONG   logMask;
  143. //#define CFG_CLR_SIZE (sizeof(FilterConfig) - sizeof(ULONG))
  144. //#define CFG_CLR_START in_number
  145. USHORT    in_number;//adapter num     
  146. USHORT    out_number;//adapter num     
  147. USHORT    dm_number;//adapter num  
  148. USHORT    media_type;//gj
  149. ULONG     in_ip;
  150. ULONG     out_ip;
  151. ULONG     dm_ip;
  152. ULONG     in_mask;
  153. ULONG     out_mask;
  154. ULONG     dm_mask;
  155. BOOL      discardIcmp;
  156. BOOL   discardMulticast;
  157. BOOL discardNonIp;
  158. BOOL discardOtherIp;
  159. BOOL discardSuspectOffset;
  160. BOOL discardFragmentedICMP;
  161. BOOL discardAttackICMP;
  162. BOOL     discardRouteIp;
  163. } FilterConfig;
  164. //流量统计信息
  165. typedef struct _Statistics {
  166. unsigned short running;
  167. SYSTEMTIME   starttime;
  168. ULONG p_insideFiltered;//过滤掉的内网包计数
  169. ULONG  p_dmFiltered;
  170. ULONG p_outsideFiltered;//过滤掉的外网包计数
  171. ULONG p_insideRx;//内网卡接收到的包总数:成功的+过滤掉的;
  172. ULONG  p_dmRx;
  173. ULONG p_outsideRx;
  174. ULONG p_insideTx;//成功的进站包数
  175. ULONG  p_dmTx;
  176. ULONG p_outsideTx;//成功的出站包数
  177. ULONG b_insideFiltered;//过滤掉的内网包总长(bytes)
  178. ULONG   b_dmFiltered;
  179. ULONG b_outsideFiltered;
  180. ULONG b_insideRx;
  181. ULONG  b_dmRx;
  182. ULONG b_outsideRx;
  183. ULONG b_insideTx;
  184. ULONG  b_dmTx;
  185. ULONG b_outsideTx;
  186.     ULONG  f_outsideOtherIp;
  187. ULONG   f_insideOtherIp;
  188. ULONG f_insideMcast;
  189. ULONG f_outsideMcast;
  190. ULONG f_insideTcpPort;
  191. ULONG f_insideUdpPort;
  192. ULONG f_insideIcmpType;
  193. ULONG f_outsideIcmpType;
  194. ULONG f_outsideRejectTable;
  195. ULONG f_outsideSuspectOffset;
  196. ULONG f_outsideIcmpFrag;
  197. ULONG f_outsideSmurfDos;
  198. ULONG f_outsidePongDos;
  199. ULONG f_insideAcceptTable;
  200. ULONG f_insideSuspectOffset;
  201. ULONG f_insideIcmpFrag;
  202. ULONG f_insideSmurfDos;
  203. ULONG f_insidePongDos;
  204. ULONG insideTCPreset;
  205. ULONG outsideTCPreset;
  206. } Statistics;
  207. typedef struct _SyslogMessageEntry {
  208. const char *message;
  209. unsigned char priority;
  210. } SyslogMessageEntry;
  211. //表的结构
  212. typedef struct {
  213.         unsigned short c[256];
  214. } addrTreeLeaf;
  215. typedef struct _addrTreeNode {
  216.         union {
  217.                 addrTreeLeaf *pd;
  218.         } u[256];
  219.         unsigned char flg[256];
  220. } addrTreeNode;
  221. typedef struct _OutaddrTreeNode {
  222.         union {
  223.                 struct _OutaddrTreeNode *p;
  224.                 addrTreeLeaf *pd;
  225.                 unsigned short c;
  226.         } u[256];
  227.         unsigned char flg[256];
  228. } OutaddrTreeNode;
  229. typedef union {
  230.         OutaddrTreeNode *p;
  231.         addrTreeLeaf *pd;
  232.         unsigned short c;
  233. } addrTreePtr;
  234. typedef struct _PortListEntry {
  235. unsigned short begin;
  236. unsigned short end;
  237. } PortListEntry;
  238. typedef struct _RejAccTableEntry {
  239. in_addr_t network;//起始地址
  240. unsigned short bits;//主机数
  241. unsigned short flag;//类号
  242. } RejAccTableEntry;
  243. typedef struct _pointerStruct{
  244.         USHORT num_groups;
  245.         addrTreeNode *addrTree;//对应于主机类的地址
  246.         PortListEntry *t_dst_out;
  247.         PortListEntry *t_src_out;
  248.         PortListEntry *u_dst_out;
  249.         PortListEntry *u_src_out;
  250.         PortListEntry *i_typ_in;
  251.         PortListEntry *i_typ_out;
  252. PortListEntry *t_rst_in;
  253. PortListEntry *t_rst_out;
  254. addrTreeNode *acceptTree;
  255. RejAccTableEntry *acceptTable;
  256.     addrTreeNode        *In_DmTree;
  257.     OutaddrTreeNode     *Out_DmTree;
  258. ULONG accept_bytes;
  259. OutaddrTreeNode *rejectTree;
  260. RejAccTableEntry *rejectTable;
  261. ULONG reject_bytes;
  262. ULONG override_bytes;
  263. ULONG num_override;
  264. } pointerStruct;
  265. //输入输出的数据结构
  266. typedef struct _initReq {
  267. char ifnumber;   //设备编号
  268. ULONG ifIpaddr;    //接口IP地址
  269. ULONG mask;        //子网掩码
  270. char flag;   //表示是内、外、中设备。0:为内部设备;1:为外部设备;2:为DM设备
  271. } initReq;
  272. typedef struct _flagsReq {
  273. ULONG discardMulticast;
  274. ULONG discardNonIp;
  275. ULONG discardOtherIp;
  276. ULONG discardSuspectOffset;
  277. ULONG discardFragmentedICMP;
  278. ULONG discardAttackICMP;
  279. ULONG discardRouteIp;    //源路由攻击
  280. } flagsReq;
  281. typedef struct _portListReq {
  282. unsigned short id;
  283. unsigned short group;
  284. PortListEntry *ptr;
  285. unsigned short bytes;
  286. } portListReq;   
  287. typedef struct _addrTreeReq {
  288. ULONG num;
  289. ULONG newtable;
  290. in_addr_t addr[128];
  291. unsigned short bits[128];
  292. unsigned short group[128];
  293. } addrTreeReq;
  294. typedef struct _manageTablesReq {
  295. ULONG command;
  296. USHORT val;
  297. } manageTablesReq;
  298. typedef struct _TCPresetTableReq {
  299. PortListEntry in[LIST_SIZE];
  300. PortListEntry out[LIST_SIZE];
  301. } TCPresetTableReq;
  302. typedef struct _rejaccTableReq {
  303. USHORT bytes;
  304. RejAccTableEntry *ptr;
  305. ULONG addr;
  306. unsigned long flag;
  307. } rejaccTableReq;
  308. typedef struct _overrideTableReq {
  309. ULONG bytes;
  310. void *ptr;
  311. ULONG addr;
  312. unsigned short index;
  313. } overrideTableReq;
  314. typedef struct _logMaskReq {
  315. ULONG mask;
  316. } logMaskReq;
  317. /*==============================================================*/
  318. /*                         宏定义                        */
  319. /*==============================================================*/
  320. #define IS_BROADCAST(address)  (*((unsigned char *) (address)) & 0x01)
  321. #define MALLOC_LEAF (addrTreeLeaf *)malloc(sizeof(addrTreeLeaf))
  322. #define MALLOC_NODE (addrTreeNode *)malloc(sizeof(addrTreeNode))
  323. #define MALLOC_OUTNODE (OutaddrTreeNode *)malloc(sizeof(OutaddrTreeNode))
  324. #define MALLOC_GROUP(a) (PortListEntry *)malloc((a) * LIST_TABLE_SIZE)
  325. /*==============================================================*/
  326. /*                         函数                                     */
  327. /*==============================================================*/
  328. #define FROMOUT 10
  329. #define FROMIN  11
  330. //主函数
  331. ULONG  ipfilter_test_pkt(USHORT dev_instance, UCHAR direction,ULONG ethlen,BYTE *m);
  332. VOID   ipfilter_pkt(ULONG ethlen,BYTE *m);
  333. void ipfilter_response_pkt(BYTE *rout,ULONG outlen,ULONG inlen,BYTE *min);
  334. //配置命令发生器
  335. ULONG  filter_command( unsigned long cmd, char* addr);
  336. VOID mysearch();
  337. #endif