Linux内核模块 — NetFilter

一方面自己开始写OS,一方面也开始做一些Linux kernel相关的研究,顺便写一下kernel的module,因为看到一篇论文是基于net-filter做一个P2P的流量监测器

自己也对这个有点兴趣,于是乎就开始准备按图索骥了。

不过自己不做这个P2P测量,而是准备做一个网络监管的小module,一方面是来练手,一方面是熟悉linux kernel module的开发流程。

首先就是设计,因为是基于Net-Filter框架所以main函数一定一个钩子。

目前的一个设计的文件结构是这样:

├── COPYRIGHT
├── Makefile
├── README.md
├── conf
│   └── websites.json
├── configure
├── src
│   ├── Makefile
│   ├── conf
│   │   ├── conf.c
│   │   ├── conf.h
│   │   ├── str.c
│   │   └── str.h
│   ├── install.sh
│   ├── net-filter
│   │   ├── filter.c
│   │   ├── filter.h
│   │   ├── package.c
│   │   ├── package.h
│   │   ├── parser.c
│   │   └── parser.h
│   ├── net-wall.c
│   ├── net-wall.h
│   └── tags
└── tests
    ├── Makefile
        ├── cases
            │   └── websites.json
                └── json-parser-test.c
  • conf 文件夹下面主要是配置文件相关的代码,因为用到了gdsl的数据结构库,所以会有针对特有数据结构的代码,如str.c&&str.h
  • net-filter 文件夹下面则是一些数据流程相关的,当注册的钩子函数被调用的时候,会调用 filter.c 中的过滤函数,然后将数据包中转到 package.c 中进行处理,这边则会调用 parser.c 进行解析,返回的结果提供给 filter.c 进行处理,如丢弃,转发,在处理等等。
  • 至于 install.sh 的作用就是一个环境的初始化,和环境的确认。

现在的一个坑就是,我对C的熟悉程度和我对经济的熟悉程度是一样的。然后就各种坑,特别是解析json和使用gdsl的时候,出现了各种错误,不过都可以慢慢的克服。

开始写C之后,最大的感触就是,圈子明显比之前的php||java小了很多,也许是因为后者比较简单,后者真的会简单一点。不过现在更加喜欢直接点的C。使用GDB调试还在慢慢适应。不得不说,一开始就上手java,对于自己的一个发展确实不是很理想。很多细节的部分都没有进行了解。

相对于Java, C代码要考虑的东西多了很多。简单的说,我是基于3.10内核进行编译的,那么对于常用的2.6内核,需要做一个兼容性的测试。然后,Makefile又是一个坑,很多的东西都要自己手动控制,不过这样确实满足了一下自己的控制欲望。先说到这,项目未动,计划先行。

注意一点:

网上很多的示例代码是有问题的,正确的钩子函数应该是这样的:

static unsigned int net_module (
        unsigned int hooknum,
        struct sk_buff * skb,
        const struct net_device *in,
        const struct net_device *out,
        int (*okfn) (struct sk_buff *)) {
    return 0;
}

很多时候,在第三行会有人写成

struct sk_buff **skb

这边注意下即可

Leave a Reply

Your email address will not be published. Required fields are marked *