ip_tables.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:11k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * 25-Jul-1998 Major changes to allow for ip chain table
  3.  *
  4.  * 3-Jan-2000 Named tables to allow packet selection for different uses.
  5.  */
  6. /*
  7.  *  Format of an IP firewall descriptor
  8.  *
  9.  *  src, dst, src_mask, dst_mask are always stored in network byte order.
  10.  *  flags are stored in host byte order (of course).
  11.  *  Port numbers are stored in HOST byte order.
  12.  */
  13. #ifndef _IPTABLES_H
  14. #define _IPTABLES_H
  15. #ifdef __KERNEL__
  16. #include <linux/if.h>
  17. #include <linux/types.h>
  18. #include <linux/in.h>
  19. #include <linux/ip.h>
  20. #include <linux/skbuff.h>
  21. #endif
  22. #include <linux/netfilter_ipv4.h>
  23. #define IPT_FUNCTION_MAXNAMELEN 30
  24. #define IPT_TABLE_MAXNAMELEN 32
  25. /* Yes, Virginia, you have to zero the padding. */
  26. struct ipt_ip {
  27. /* Source and destination IP addr */
  28. struct in_addr src, dst;
  29. /* Mask for src and dest IP addr */
  30. struct in_addr smsk, dmsk;
  31. char iniface[IFNAMSIZ], outiface[IFNAMSIZ];
  32. unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];
  33. /* Protocol, 0 = ANY */
  34. u_int16_t proto;
  35. /* Flags word */
  36. u_int8_t flags;
  37. /* Inverse flags */
  38. u_int8_t invflags;
  39. };
  40. struct ipt_entry_match
  41. {
  42. union {
  43. struct {
  44. u_int16_t match_size;
  45. /* Used by userspace */
  46. char name[IPT_FUNCTION_MAXNAMELEN];
  47. } user;
  48. struct {
  49. u_int16_t match_size;
  50. /* Used inside the kernel */
  51. struct ipt_match *match;
  52. } kernel;
  53. /* Total length */
  54. u_int16_t match_size;
  55. } u;
  56. unsigned char data[0];
  57. };
  58. struct ipt_entry_target
  59. {
  60. union {
  61. struct {
  62. u_int16_t target_size;
  63. /* Used by userspace */
  64. char name[IPT_FUNCTION_MAXNAMELEN];
  65. } user;
  66. struct {
  67. u_int16_t target_size;
  68. /* Used inside the kernel */
  69. struct ipt_target *target;
  70. } kernel;
  71. /* Total length */
  72. u_int16_t target_size;
  73. } u;
  74. unsigned char data[0];
  75. };
  76. struct ipt_standard_target
  77. {
  78. struct ipt_entry_target target;
  79. int verdict;
  80. };
  81. struct ipt_counters
  82. {
  83. u_int64_t pcnt, bcnt; /* Packet and byte counters */
  84. };
  85. /* Values for "flag" field in struct ipt_ip (general ip structure). */
  86. #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */
  87. #define IPT_F_MASK 0x01 /* All possible flag bits mask. */
  88. /* Values for "inv" field in struct ipt_ip. */
  89. #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */
  90. #define IPT_INV_VIA_OUT 0x02 /* Invert the sense of OUT IFACE */
  91. #define IPT_INV_TOS 0x04 /* Invert the sense of TOS. */
  92. #define IPT_INV_SRCIP 0x08 /* Invert the sense of SRC IP. */
  93. #define IPT_INV_DSTIP 0x10 /* Invert the sense of DST OP. */
  94. #define IPT_INV_FRAG 0x20 /* Invert the sense of FRAG. */
  95. #define IPT_INV_PROTO 0x40 /* Invert the sense of PROTO. */
  96. #define IPT_INV_MASK 0x7F /* All possible flag bits mask. */
  97. /* This structure defines each of the firewall rules.  Consists of 3
  98.    parts which are 1) general IP header stuff 2) match specific
  99.    stuff 3) the target to perform if the rule matches */
  100. struct ipt_entry
  101. {
  102. struct ipt_ip ip;
  103. /* Mark with fields that we care about. */
  104. unsigned int nfcache;
  105. /* Size of ipt_entry + matches */
  106. u_int16_t target_offset;
  107. /* Size of ipt_entry + matches + target */
  108. u_int16_t next_offset;
  109. /* Back pointer */
  110. unsigned int comefrom;
  111. /* Packet and byte counters. */
  112. struct ipt_counters counters;
  113. /* The matches (if any), then the target. */
  114. unsigned char elems[0];
  115. };
  116. /*
  117.  * New IP firewall options for [gs]etsockopt at the RAW IP level.
  118.  * Unlike BSD Linux inherits IP options so you don't have to use a raw
  119.  * socket for this. Instead we check rights in the calls. */
  120. #define IPT_BASE_CTL 64 /* base for firewall socket options */
  121. #define IPT_SO_SET_REPLACE (IPT_BASE_CTL)
  122. #define IPT_SO_SET_ADD_COUNTERS (IPT_BASE_CTL + 1)
  123. #define IPT_SO_SET_MAX IPT_SO_SET_ADD_COUNTERS
  124. #define IPT_SO_GET_INFO (IPT_BASE_CTL)
  125. #define IPT_SO_GET_ENTRIES (IPT_BASE_CTL + 1)
  126. #define IPT_SO_GET_MAX IPT_SO_GET_ENTRIES
  127. /* CONTINUE verdict for targets */
  128. #define IPT_CONTINUE 0xFFFFFFFF
  129. /* For standard target */
  130. #define IPT_RETURN (-NF_MAX_VERDICT - 1)
  131. /* TCP matching stuff */
  132. struct ipt_tcp
  133. {
  134. u_int16_t spts[2]; /* Source port range. */
  135. u_int16_t dpts[2]; /* Destination port range. */
  136. u_int8_t option; /* TCP Option iff non-zero*/
  137. u_int8_t flg_mask; /* TCP flags mask byte */
  138. u_int8_t flg_cmp; /* TCP flags compare byte */
  139. u_int8_t invflags; /* Inverse flags */
  140. };
  141. /* Values for "inv" field in struct ipt_tcp. */
  142. #define IPT_TCP_INV_SRCPT 0x01 /* Invert the sense of source ports. */
  143. #define IPT_TCP_INV_DSTPT 0x02 /* Invert the sense of dest ports. */
  144. #define IPT_TCP_INV_FLAGS 0x04 /* Invert the sense of TCP flags. */
  145. #define IPT_TCP_INV_OPTION 0x08 /* Invert the sense of option test. */
  146. #define IPT_TCP_INV_MASK 0x0F /* All possible flags. */
  147. /* UDP matching stuff */
  148. struct ipt_udp
  149. {
  150. u_int16_t spts[2]; /* Source port range. */
  151. u_int16_t dpts[2]; /* Destination port range. */
  152. u_int8_t invflags; /* Inverse flags */
  153. };
  154. /* Values for "invflags" field in struct ipt_udp. */
  155. #define IPT_UDP_INV_SRCPT 0x01 /* Invert the sense of source ports. */
  156. #define IPT_UDP_INV_DSTPT 0x02 /* Invert the sense of dest ports. */
  157. #define IPT_UDP_INV_MASK 0x03 /* All possible flags. */
  158. /* ICMP matching stuff */
  159. struct ipt_icmp
  160. {
  161. u_int8_t type; /* type to match */
  162. u_int8_t code[2]; /* range of code */
  163. u_int8_t invflags; /* Inverse flags */
  164. };
  165. /* Values for "inv" field for struct ipt_icmp. */
  166. #define IPT_ICMP_INV 0x01 /* Invert the sense of type/code test */
  167. /* The argument to IPT_SO_GET_INFO */
  168. struct ipt_getinfo
  169. {
  170. /* Which table: caller fills this in. */
  171. char name[IPT_TABLE_MAXNAMELEN];
  172. /* Kernel fills these in. */
  173. /* Which hook entry points are valid: bitmask */
  174. unsigned int valid_hooks;
  175. /* Hook entry points: one per netfilter hook. */
  176. unsigned int hook_entry[NF_IP_NUMHOOKS];
  177. /* Underflow points. */
  178. unsigned int underflow[NF_IP_NUMHOOKS];
  179. /* Number of entries */
  180. unsigned int num_entries;
  181. /* Size of entries. */
  182. unsigned int size;
  183. };
  184. /* The argument to IPT_SO_SET_REPLACE. */
  185. struct ipt_replace
  186. {
  187. /* Which table. */
  188. char name[IPT_TABLE_MAXNAMELEN];
  189. /* Which hook entry points are valid: bitmask.  You can't
  190.            change this. */
  191. unsigned int valid_hooks;
  192. /* Number of entries */
  193. unsigned int num_entries;
  194. /* Total size of new entries */
  195. unsigned int size;
  196. /* Hook entry points. */
  197. unsigned int hook_entry[NF_IP_NUMHOOKS];
  198. /* Underflow points. */
  199. unsigned int underflow[NF_IP_NUMHOOKS];
  200. /* Information about old entries: */
  201. /* Number of counters (must be equal to current number of entries). */
  202. unsigned int num_counters;
  203. /* The old entries' counters. */
  204. struct ipt_counters *counters;
  205. /* The entries (hang off end: not really an array). */
  206. struct ipt_entry entries[0];
  207. };
  208. /* The argument to IPT_SO_ADD_COUNTERS. */
  209. struct ipt_counters_info
  210. {
  211. /* Which table. */
  212. char name[IPT_TABLE_MAXNAMELEN];
  213. unsigned int num_counters;
  214. /* The counters (actually `number' of these). */
  215. struct ipt_counters counters[0];
  216. };
  217. /* The argument to IPT_SO_GET_ENTRIES. */
  218. struct ipt_get_entries
  219. {
  220. /* Which table: user fills this in. */
  221. char name[IPT_TABLE_MAXNAMELEN];
  222. /* User fills this in: total entry size. */
  223. unsigned int size;
  224. /* The entries. */
  225. struct ipt_entry entrytable[0];
  226. };
  227. /* Standard return verdict, or do jump. */
  228. #define IPT_STANDARD_TARGET ""
  229. /* Error verdict. */
  230. #define IPT_ERROR_TARGET "ERROR"
  231. /* Helper functions */
  232. static __inline__ struct ipt_entry_target *
  233. ipt_get_target(struct ipt_entry *e)
  234. {
  235. return (void *)e + e->target_offset;
  236. }
  237. /* fn returns 0 to continue iteration */
  238. #define IPT_MATCH_ITERATE(e, fn, args...)
  239. ({
  240. unsigned int __i;
  241. int __ret = 0;
  242. struct ipt_entry_match *__match;
  243. for (__i = sizeof(struct ipt_entry);
  244.      __i < (e)->target_offset;
  245.      __i += __match->u.match_size) {
  246. __match = (void *)(e) + __i;
  247. __ret = fn(__match , ## args);
  248. if (__ret != 0)
  249. break;
  250. }
  251. __ret;
  252. })
  253. /* fn returns 0 to continue iteration */
  254. #define IPT_ENTRY_ITERATE(entries, size, fn, args...)
  255. ({
  256. unsigned int __i;
  257. int __ret = 0;
  258. struct ipt_entry *__entry;
  259. for (__i = 0; __i < (size); __i += __entry->next_offset) { 
  260. __entry = (void *)(entries) + __i;
  261. __ret = fn(__entry , ## args);
  262. if (__ret != 0)
  263. break;
  264. }
  265. __ret;
  266. })
  267. /*
  268.  * Main firewall chains definitions and global var's definitions.
  269.  */
  270. #ifdef __KERNEL__
  271. #include <linux/init.h>
  272. extern void ipt_init(void) __init;
  273. struct ipt_match
  274. {
  275. struct list_head list;
  276. const char name[IPT_FUNCTION_MAXNAMELEN];
  277. /* Return true or false: return FALSE and set *hotdrop = 1 to
  278.            force immediate packet drop. */
  279. int (*match)(const struct sk_buff *skb,
  280.      const struct net_device *in,
  281.      const struct net_device *out,
  282.      const void *matchinfo,
  283.      int offset,
  284.      const void *hdr,
  285.      u_int16_t datalen,
  286.      int *hotdrop);
  287. /* Called when user tries to insert an entry of this type. */
  288. /* Should return true or false. */
  289. int (*checkentry)(const char *tablename,
  290.   const struct ipt_ip *ip,
  291.   void *matchinfo,
  292.   unsigned int matchinfosize,
  293.   unsigned int hook_mask);
  294. /* Called when entry of this type deleted. */
  295. void (*destroy)(void *matchinfo, unsigned int matchinfosize);
  296. /* Set this to THIS_MODULE if you are a module, otherwise NULL */
  297. struct module *me;
  298. };
  299. /* Registration hooks for targets. */
  300. struct ipt_target
  301. {
  302. struct list_head list;
  303. const char name[IPT_FUNCTION_MAXNAMELEN];
  304. /* Returns verdict. */
  305. unsigned int (*target)(struct sk_buff **pskb,
  306.        unsigned int hooknum,
  307.        const struct net_device *in,
  308.        const struct net_device *out,
  309.        const void *targinfo,
  310.        void *userdata);
  311. /* Called when user tries to insert an entry of this type:
  312.            hook_mask is a bitmask of hooks from which it can be
  313.            called. */
  314. /* Should return true or false. */
  315. int (*checkentry)(const char *tablename,
  316.   const struct ipt_entry *e,
  317.   void *targinfo,
  318.   unsigned int targinfosize,
  319.   unsigned int hook_mask);
  320. /* Called when entry of this type deleted. */
  321. void (*destroy)(void *targinfo, unsigned int targinfosize);
  322. /* Set this to THIS_MODULE if you are a module, otherwise NULL */
  323. struct module *me;
  324. };
  325. extern int ipt_register_target(struct ipt_target *target);
  326. extern void ipt_unregister_target(struct ipt_target *target);
  327. extern int ipt_register_match(struct ipt_match *match);
  328. extern void ipt_unregister_match(struct ipt_match *match);
  329. /* Furniture shopping... */
  330. struct ipt_table
  331. {
  332. struct list_head list;
  333. /* A unique name... */
  334. char name[IPT_TABLE_MAXNAMELEN];
  335. /* Seed table: copied in register_table */
  336. struct ipt_replace *table;
  337. /* What hooks you will enter on */
  338. unsigned int valid_hooks;
  339. /* Lock for the curtain */
  340. rwlock_t lock;
  341. /* Man behind the curtain... */
  342. struct ipt_table_info *private;
  343. /* Set this to THIS_MODULE if you are a module, otherwise NULL */
  344. struct module *me;
  345. };
  346. extern int ipt_register_table(struct ipt_table *table);
  347. extern void ipt_unregister_table(struct ipt_table *table);
  348. extern unsigned int ipt_do_table(struct sk_buff **pskb,
  349.  unsigned int hook,
  350.  const struct net_device *in,
  351.  const struct net_device *out,
  352.  struct ipt_table *table,
  353.  void *userdata);
  354. #define IPT_ALIGN(s) (((s) + (__alignof__(struct ipt_entry)-1)) & ~(__alignof__(struct ipt_entry)-1))
  355. #endif /*__KERNEL__*/
  356. #endif /* _IPTABLES_H */