ip6table_filter.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This is the 1999 rewrite of IP Firewalling, aiming for kernel 2.3.x.
  3.  *
  4.  * Copyright (C) 1999 Paul `Rusty' Russell & Michael J. Neuling
  5.  */
  6. #include <linux/module.h>
  7. #include <linux/netfilter_ipv6/ip6_tables.h>
  8. #define FILTER_VALID_HOOKS ((1 << NF_IP6_LOCAL_IN) | (1 << NF_IP6_FORWARD) | (1 << NF_IP6_LOCAL_OUT))
  9. /* Standard entry. */
  10. struct ip6t_standard
  11. {
  12. struct ip6t_entry entry;
  13. struct ip6t_standard_target target;
  14. };
  15. struct ip6t_error_target
  16. {
  17. struct ip6t_entry_target target;
  18. char errorname[IP6T_FUNCTION_MAXNAMELEN];
  19. };
  20. struct ip6t_error
  21. {
  22. struct ip6t_entry entry;
  23. struct ip6t_error_target target;
  24. };
  25. static struct
  26. {
  27. struct ip6t_replace repl;
  28. struct ip6t_standard entries[3];
  29. struct ip6t_error term;
  30. } initial_table __initdata
  31. = { { "filter", FILTER_VALID_HOOKS, 4,
  32.       sizeof(struct ip6t_standard) * 3 + sizeof(struct ip6t_error),
  33.       { [NF_IP6_LOCAL_IN] 0,
  34. [NF_IP6_FORWARD] sizeof(struct ip6t_standard),
  35. [NF_IP6_LOCAL_OUT] sizeof(struct ip6t_standard) * 2 },
  36.       { [NF_IP6_LOCAL_IN] 0,
  37. [NF_IP6_FORWARD] sizeof(struct ip6t_standard),
  38. [NF_IP6_LOCAL_OUT] sizeof(struct ip6t_standard) * 2 },
  39.       0, NULL, { } },
  40.     {
  41.     /* LOCAL_IN */
  42.     { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
  43. 0,
  44. sizeof(struct ip6t_entry),
  45. sizeof(struct ip6t_standard),
  46. 0, { 0, 0 }, { } },
  47.       { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
  48. -NF_ACCEPT - 1 } },
  49.     /* FORWARD */
  50.     { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
  51. 0,
  52. sizeof(struct ip6t_entry),
  53. sizeof(struct ip6t_standard),
  54. 0, { 0, 0 }, { } },
  55.       { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
  56. -NF_ACCEPT - 1 } },
  57.     /* LOCAL_OUT */
  58.     { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
  59. 0,
  60. sizeof(struct ip6t_entry),
  61. sizeof(struct ip6t_standard),
  62. 0, { 0, 0 }, { } },
  63.       { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
  64. -NF_ACCEPT - 1 } }
  65.     },
  66.     /* ERROR */
  67.     { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
  68. 0,
  69. sizeof(struct ip6t_entry),
  70. sizeof(struct ip6t_error),
  71. 0, { 0, 0 }, { } },
  72.       { { { { IP6T_ALIGN(sizeof(struct ip6t_error_target)), IP6T_ERROR_TARGET } },
  73.   { } },
  74. "ERROR"
  75.       }
  76.     }
  77. };
  78. static struct ip6t_table packet_filter
  79. = { { NULL, NULL }, "filter", &initial_table.repl,
  80.     FILTER_VALID_HOOKS, RW_LOCK_UNLOCKED, NULL, THIS_MODULE };
  81. /* The work comes in here from netfilter.c. */
  82. static unsigned int
  83. ip6t_hook(unsigned int hook,
  84.  struct sk_buff **pskb,
  85.  const struct net_device *in,
  86.  const struct net_device *out,
  87.  int (*okfn)(struct sk_buff *))
  88. {
  89. return ip6t_do_table(pskb, hook, in, out, &packet_filter, NULL);
  90. }
  91. static unsigned int
  92. ip6t_local_out_hook(unsigned int hook,
  93.    struct sk_buff **pskb,
  94.    const struct net_device *in,
  95.    const struct net_device *out,
  96.    int (*okfn)(struct sk_buff *))
  97. {
  98. #if 0
  99. /* root is playing with raw sockets. */
  100. if ((*pskb)->len < sizeof(struct iphdr)
  101.     || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
  102. if (net_ratelimit())
  103. printk("ip6t_hook: happy cracking.n");
  104. return NF_ACCEPT;
  105. }
  106. #endif
  107. return ip6t_do_table(pskb, hook, in, out, &packet_filter, NULL);
  108. }
  109. static struct nf_hook_ops ip6t_ops[]
  110. = { { { NULL, NULL }, ip6t_hook, PF_INET6, NF_IP6_LOCAL_IN, NF_IP6_PRI_FILTER },
  111.     { { NULL, NULL }, ip6t_hook, PF_INET6, NF_IP6_FORWARD, NF_IP6_PRI_FILTER },
  112.     { { NULL, NULL }, ip6t_local_out_hook, PF_INET6, NF_IP6_LOCAL_OUT,
  113. NF_IP6_PRI_FILTER }
  114. };
  115. /* Default to forward because I got too much mail already. */
  116. static int forward = NF_ACCEPT;
  117. MODULE_PARM(forward, "i");
  118. static int __init init(void)
  119. {
  120. int ret;
  121. if (forward < 0 || forward > NF_MAX_VERDICT) {
  122. printk("iptables forward must be 0 or 1n");
  123. return -EINVAL;
  124. }
  125. /* Entry 1 is the FORWARD hook */
  126. initial_table.entries[1].target.verdict = -forward - 1;
  127. /* Register table */
  128. ret = ip6t_register_table(&packet_filter);
  129. if (ret < 0)
  130. return ret;
  131. /* Register hooks */
  132. ret = nf_register_hook(&ip6t_ops[0]);
  133. if (ret < 0)
  134. goto cleanup_table;
  135. ret = nf_register_hook(&ip6t_ops[1]);
  136. if (ret < 0)
  137. goto cleanup_hook0;
  138. ret = nf_register_hook(&ip6t_ops[2]);
  139. if (ret < 0)
  140. goto cleanup_hook1;
  141. return ret;
  142.  cleanup_hook1:
  143. nf_unregister_hook(&ip6t_ops[1]);
  144.  cleanup_hook0:
  145. nf_unregister_hook(&ip6t_ops[0]);
  146.  cleanup_table:
  147. ip6t_unregister_table(&packet_filter);
  148. return ret;
  149. }
  150. static void __exit fini(void)
  151. {
  152. unsigned int i;
  153. for (i = 0; i < sizeof(ip6t_ops)/sizeof(struct nf_hook_ops); i++)
  154. nf_unregister_hook(&ip6t_ops[i]);
  155. ip6t_unregister_table(&packet_filter);
  156. }
  157. module_init(init);
  158. module_exit(fini);
  159. MODULE_LICENSE("GPL");