zoukankan      html  css  js  c++  java
  • iptables 深入分析

    Linux kernel version: 3.18.14    file:  net/ipv4/netfilter/iptables_filter.c

    先贴出重要的全局变量struct xt_table  packet_filter:

    #define FILTER_VALID_HOOKS ((1 << NF_INET_LOCAL_IN) |  (1 << NF_INET_FORWARD) | (1 << NF_INET_LOCAL_OUT))
    
    static const struct xt_table packet_filter = {
        .name          = "filter",
        .valid_hooks    = FILTER_VALID_HOOKS,
        .me        = THIS_MODULE,
        .af        = NFPROTO_IPV4,
        .priority    = NF_IP_PRI_FILTER,
    };

    看代码:

    1. 最开始的 module_init(iptables_filter_init)

    2. iptables_filter_init  -->  register_pernet_subsys(&iptable_filter_net_ops)

                 -->  xt_hook_link(&packet_filter, iptable_filter_hook)     /* iptable_filter_hook 也存在于当前这个文件iptables_filter.c 中  */

    看看 iptable_filter_net_ops: 

    static struct pernet_operations iptable_filter_net_ops = {
        .init = iptable_filter_net_init,
        .exit = iptable_filter_net_exit,
    };

    3. 看看这个网络subsystem的初始化函数:iptable_filter_net_init

    --> struct ipt_replace *repl = ipt_alloc_initial_table(&packet_filter)    /* 分配一个初始化的table  */

    --> net->ipv4.ipvtable_filter = ipt_register_table(net, &packet_filter, repl)  /* 注册一个table, 并且把它挂在当前这个ipv4命名空间中(Control Groups相关的东东)*/

    好! ipt_alloc_initial_table 后的相关存储结构如下图所示:

    注意 柔性数组的使用,结构设计的巧妙之处!

    a. 这个结构的分配时由xt_alloc_initial_table宏(net/netfilter/xt_repldata.h文件中)完成的

    b. tbl->repl.size = nhooks * sizeof(struct ipt_standard) + sizeof(struct ipt_error)

    c. 看起来这个initial table中完全没有 ipt_entry_match的存在,这是因为是initial table只是一个初始化的存储结构,在用户调用iptables命令配置规则后,match就会存在了。存在于哪里呢,注意struct  ipt_entry最后一个柔性数组。相信你可以猜到了,哈哈(还记得ip_tables.c中的do_replace吗...)

    故事发展到这里,内核已经初始化了一个initial table,接下来就把它register到当前的namespace

    调用 net->ipv4.iptables_filter = ipt_register_table(net, &packet_filter, repl)  /* 这个 repl就是指向了initial table  */

    来看注册的table的存储结构

    其中每个entries指向的内存空间是这样赋值的

    memcpy(entry, repl->entries, repl->size)

    就是把initial table的entries指向的内存空间内容copy过来(上一幅图虚线方框的部分)

    table注册完后,初始化的initial table被kfree了

    当然,这些都是没有一条规则的空的filter表,加几条规则后,表长啥样呢?后续再说吧。。。。

    表注册好了,接下来执行的是最要的一步:往INET_PROTO的HOOK点上挂载钩子函数:

    xt_hook_link(&packet_filter, iptable_filter_hook),xt_hook_link最后调用的就是nf_register_hooks

    未完待续... 

  • 相关阅读:
    ios swift模仿qq登陆界面,xml布局
    类和结构体的区别
    获取或者设置时,无后缀和A后缀和W后缀的区别
    mfc控件学习
    MFC之简单计算器
    双冒号、点操作、箭头的区别
    MFC使用MsComm做串口通信
    保存结构体到本地(二进制)
    文件管理函数
    文件定位的几个函数
  • 原文地址:https://www.cnblogs.com/xiaokuang/p/4661180.html
Copyright © 2011-2022 走看看