服务器 频道

深入Linux网络核心堆栈之三

  【IT168 服务器学院】----[4.2 - 基于接口进行过滤

  这应该是我们能做的最简单的过滤技术了。还记得我们的hook函数接收的参数中的那些net_device数据结构吗?使用相应的net_device数据结构的name这个成员,你就可以根据数据包的源接口和目的接口来选择是否丢弃它。如果想丢弃所有到达接口eth0的数据包,所有你需要做的仅仅是将in->name的值与"eth0"做比较,如果名字匹配,那么hook函数简单的返回NF_DROP即可,数据包会被自动销毁。就是这么简单!完成该功能的示例代码见如下的示例代码2。注意,Light-Weight FireWall模块将会提供所有的本文提到的过滤方法的简单示例。它还包含了一个IOCTL接口以及用于动态改变其特性的应用程序。

  示例代码2 : 基于源接口的数据包过滤
  /*
  * 安装一个丢弃所有进入我们指定接口的数据包的Netfilter hook函数的示例代码
  */

  #define __KERNEL__
  #define MODULE
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/netdevice.h>
  #include <linux/netfilter.h>
  #include <linux/netfilter_ipv4.h>
  /* 用于注册我们的函数的数据结构 */
  static struct nf_hook_ops nfho;

  /* 我们丢弃的数据包来自的接口的名字 */
  static char *drop_if = "lo";

  /* 注册的hook函数的实现 */
  unsigned int hook_func(unsigned int hooknum,
                     struct sk_buff **skb,
                     const struct net_device *in,
                     const struct net_device *out,
                     int (*okfn)(struct sk_buff *))
  {
  if (strcmp(in->name, drop_if) == 0) {
      printk("Dropped packet on %s...\n", drop_if);
      return NF_DROP;
  } else {
      return NF_ACCEPT;
  }
  }

  /* 初始化程序 */
  int init_module()
  {
  /* 填充我们的hook数据结构 */
  nfho.hook     = hook_func;         /* 处理函数 */
  nfho.hooknum  = NF_IP_PRE_ROUTING; /* 使用IPv4的第一个hook */
  nfho.pf       = PF_INET;
  nfho.priority = NF_IP_PRI_FIRST;   /* 让我们的函数首先执行 */

  nf_register_hook(&nfho);

  return 0;
  }

  /* 清除程序 */
  void cleanup_module()
  {
  nf_unregister_hook(&nfho);
  }

  是不是很简单?接下来,让我们看看基于IP地址的过滤。
  

0
相关文章