免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Minit
打印 上一主题 下一主题

[原]Netfilter实现机制分析 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-12-29 16:24 |只看该作者
原帖由 Arthur_ 于 2008-12-29 13:06 发表
lz, 借你的宝地, 想问下一个非流程问题:

在iptable_filter中:

static struct
{
        struct ipt_replace repl;
        struct ipt_standard entries[3];
        struct ipt_error term;
} initial_table __initdata  ...


这个疑问我也不是很明白,刚看了看源码,在注册表时都初始化了这三个结构体,但实际大部分都只使用了结构ipt_replace,将其作为表初始时的模板。但另外两个结构体我也没发现如何使用,只有filter表注册前使用了ipt_standard,主要是对其FORWARD挂载点的动作进行了操作,代码在iptables_filter.c中:
  1. static int __init iptable_filter_init(void)
  2. {
  3. int ret;
  4. if (forward < 0 || forward > NF_MAX_VERDICT) {
  5.   printk("iptables forward must be 0 or 1\n");
  6.   return -EINVAL;
  7. }
  8. /* Entry 1 is the FORWARD hook */
  9. initial_table.entries[1].target.verdict = -forward - 1;
  10. /* Register table */
  11. ret = ipt_register_table(&packet_filter, &initial_table.repl);
  12. if (ret < 0)
  13.   return ret;
  14. /* Register hooks */
  15. ret = nf_register_hooks(ipt_ops, ARRAY_SIZE(ipt_ops));
  16. if (ret < 0)
  17.   goto cleanup_table;
  18. return ret;
  19. cleanup_table:
  20. ipt_unregister_table(&packet_filter);
  21. return ret;
  22. }
复制代码
target中的verdict主要是为了进行内核态与用户态之间规则动作的转换,这在独孤九贱的分析中有提到,http://linux.chinaunix.net/bbs/viewthread.php?tid=670248

我还看了其他表的注册,都未发现对其他两个结构体的使用,如iptable_mangle.c中mangle表的注册:
  1. static int __init iptable_mangle_init(void)
  2. {
  3. int ret;
  4. /* Register table */
  5. ret = ipt_register_table(&packet_mangler, &initial_table.repl);
  6. if (ret < 0)
  7.   return ret;
  8. /* Register hooks */
  9. ret = nf_register_hooks(ipt_ops, ARRAY_SIZE(ipt_ops));
  10. if (ret < 0)
  11.   goto cleanup_table;
  12. return ret;
  13. cleanup_table:
  14. ipt_unregister_table(&packet_mangler);
  15. return ret;
  16. }
复制代码
以及ip_nat_rule.c中NAT表的注册:
  1. int __init ip_nat_rule_init(void)
  2. {
  3. int ret;
  4. ret = ipt_register_table(&nat_table, &nat_initial_table.repl);
  5. if (ret != 0)
  6.   return ret;
  7. ret = xt_register_target(&ipt_snat_reg);
  8. if (ret != 0)
  9.   goto unregister_table;
  10. ret = xt_register_target(&ipt_dnat_reg);
  11. if (ret != 0)
  12.   goto unregister_snat;
  13. return ret;
  14. unregister_snat:
  15. xt_unregister_target(&ipt_snat_reg);
  16. unregister_table:
  17. xt_unregister_table(&nat_table);
  18. return ret;
  19. }
复制代码
这些表都未使用到其他两个结构体,但这两个结构体却都在注册前进行了初始化,我也百思不得其解,估计是为了整个框架设计的完整性,现在的功力还不够破解这个问题。至于其中涉及到的结构体ipt_error在ip_tables.c有以下定义:
  1. struct ipt_error
  2. {
  3. struct ipt_entry entry;
  4. struct ipt_error_target target;
  5. };
复制代码
有关这个结构有何用处,我也不是很清楚,留待大侠指点。

[ 本帖最后由 Minit 于 2008-12-29 16:35 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
32 [报告]
发表于 2008-12-29 16:34 |只看该作者
以下是偶当时分析2.4内核是的这个结构体,中间的注释说明了这个问题
/*该结构初始了四条规则,3个hook点各一条,加上错误处理规则一条*/
static struct
{
        struct ipt_replace repl;
/*3个hook点,各自一条缺省规则,默认为ACCEPT*/
        struct ipt_standard entries[3];
        struct ipt_error term; // 错误处理规则
} initial_table __initdata
= {
        /*struct ipt_replace 结构体,包括表名,hook点,规则数目,大小,以及各hook其实规则的偏移*/
{ "filter", FILTER_VALID_HOOKS, 4,
      sizeof(struct ipt_standard) * 3 + sizeof(struct ipt_error),
      { [NF_IP_LOCAL_IN] 0,
        [NF_IP_FORWARD] sizeof(struct ipt_standard),
        [NF_IP_LOCAL_OUT] sizeof(struct ipt_standard) * 2 },
      { [NF_IP_LOCAL_IN] 0,
        [NF_IP_FORWARD] sizeof(struct ipt_standard),
        [NF_IP_LOCAL_OUT] sizeof(struct ipt_standard) * 2 },
      0, NULL, { } }, //此处为该结构体的struct ipt_entry entries[0]成员,从该成员可以找到以下注册的所有hook点的规则,所指向的有效内容包含以下四条规则
/*以下是四条规则:*/

        /*默认三个hook点的规则,ACCEPT,这里repl.etnryies == entries*/
    {
            /* LOCAL_IN */
            { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ipt_entry),
                sizeof(struct ipt_standard),
                0, { 0, 0 }, { } },
              { { { { IPT_ALIGN(sizeof(struct ipt_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } },
            /* FORWARD */
            { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ipt_entry),
                sizeof(struct ipt_standard),
                0, { 0, 0 }, { } },
              { { { { IPT_ALIGN(sizeof(struct ipt_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } },
            /* LOCAL_OUT */
            { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ipt_entry),
                sizeof(struct ipt_standard),
                0, { 0, 0 }, { } },
              { { { { IPT_ALIGN(sizeof(struct ipt_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } }
},

    /*错误处理的规则 */
    { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
        0,
        sizeof(struct ipt_entry),
        sizeof(struct ipt_error),
        0, { 0, 0 }, { } },
      { { { { IPT_ALIGN(sizeof(struct ipt_error_target)), IPT_ERROR_TARGET } },
          { } },
        "ERROR"
      }
    }
};

[ 本帖最后由 Godbach 于 2008-12-29 16:37 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
33 [报告]
发表于 2008-12-29 16:36 |只看该作者
我在30楼提到了:
看一下这个函数的具体实现,&initial_table.repl和&initial_table其实都是指向该结构体的开始

虽然传的是repl,但是后面的都可以通过repl引用。

论坛徽章:
0
34 [报告]
发表于 2008-12-29 16:45 |只看该作者

回复 #32 Godbach 的帖子

嗯,大致明白了,也就是说后面两类结构体就是对表所对应的各个挂载点的初始化,在用户态所对应的也就是相应链的初始化,可以这样理解不?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
35 [报告]
发表于 2008-12-29 17:02 |只看该作者

回复 #34 Minit 的帖子

相当于filter在三个hook点分别注册了一条默认的规则

论坛徽章:
0
36 [报告]
发表于 2008-12-29 17:09 |只看该作者

回复 #35 Godbach 的帖子

嗯,明白了,谢谢。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
37 [报告]
发表于 2008-12-29 17:11 |只看该作者

回复 #36 Minit 的帖子

LZ作图用的什么工具,是WIN下的VISIO吗,还是其他的?

论坛徽章:
0
38 [报告]
发表于 2008-12-29 17:12 |只看该作者

回复 #37 Godbach 的帖子

VISIO2007

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
39 [报告]
发表于 2008-12-29 17:21 |只看该作者
原帖由 Minit 于 2008-12-29 17:12 发表
VISIO2007


哦,是不是只能在Vista上用?Visio2003中也可以做出相应的效果吗?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
40 [报告]
发表于 2008-12-29 17:28 |只看该作者
查了一下XP SP2上可以用。改天下个用用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP