免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1970 | 回复: 8
打印 上一主题 下一主题

关于iptables源码中解析长参数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-10 10:14 |只看该作者 |倒序浏览
各位看帖的前辈好 小弟有一事请教 帖子有点长 请见谅

关于iptables中长参数的解析 有一些混乱 希望达人能帮忙整理分析解答下我的疑惑

目前我知道的是 长参数的解析(例如指定参数 --sport --dport之类)需要进入do_command中的default中解析

就拿iptables -A INPUT -s 1.1.1.1 -p tcp --sport 300为例

进入default:

  1. if (!target
  2.     || !(target->parse(c - target->option_offset,
  3.     argv, invert,
  4.     &target->tflags,
  5.     &fw, &target->t))) ……
复制代码
此处调用了target结构中的parse指针函数 但是我用source insight查看parse发现有很多

文件中都有定义各自的parse函数
比方说 --sport参数 应该用到的是libipt_dccp.c中的函数


  1. static int
  2. parse(int c, char **argv, int invert, unsigned int *flags,
  3.       const struct ipt_entry *entry,
  4.       unsigned int *nfcache,
  5.       struct ipt_entry_match **match)
  6. {
  7.         struct ipt_dccp_info *einfo
  8.                 = (struct ipt_dccp_info *)(*match)->data;

  9.         switch (c) {
  10.         case '1':
  11.                 if (*flags & IPT_DCCP_SRC_PORTS)
  12.                         exit_error(PARAMETER_PROBLEM,
  13.                                    "Only one `--source-port' allowed");
  14.                 einfo->flags |= IPT_DCCP_SRC_PORTS;
  15.                 check_inverse(optarg, &invert, &optind, 0);
  16.                 parse_dccp_ports(argv[optind-1], einfo->spts);
  17.                 if (invert)
  18.                         einfo->invflags |= IPT_DCCP_SRC_PORTS;
  19.                 *flags |= IPT_DCCP_SRC_PORTS;
  20.                 break;
  21. ………………
复制代码
此处有
疑惑一 : 在 default 中 调用target->parse()的时候
                是如何确定调用的是libipt_dccp.c中的parse 而不是调用libipt_DNAT.c中的parse的?

疑惑二 : 在进入相应的parse函数中以后 传入的第四个参数flag 是什么时候被赋值的?(眼拙没看出来do_command中哪里设置了target->tflags的值) 当然 也不知道第一个参数传入的参数(c-target->option_offset)中target->option_offset是在哪里赋值的?

疑惑三 : 我想知道 如果想自己填充iptables中的数据结构 最终能正确添加该条规则 那么针对长参数 我都该填充哪些数据结构?

论坛徽章:
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
2 [报告]
发表于 2010-06-10 10:19 |只看该作者
疑惑一 : 在 default 中 调用target->parse()的时候
                是如何确定调用的是libipt_dccp.c中的parse 而不是调用libipt_DNAT.c中的parse的?

各个扩展target都会注册自己的解析函数的。根据target的名称,可以找到对应的解析函数

论坛徽章:
0
3 [报告]
发表于 2010-06-10 10:23 |只看该作者
各个扩展target都会注册自己的解析函数的。根据target的名称,可以找到对应的解析函数
Godbach 发表于 2010-06-10 10:19


再次请教:target的注册 发生在代码中的哪段呢?因为程序从主程序中就直接跳转到了do_command中的switch里 没有发现哪里有注册不同的target的痕迹啊?

论坛徽章:
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
4 [报告]
发表于 2010-06-10 10:32 |只看该作者
应该在解析命令函数执行之前。搜一下源代码中的register_target函数,看看有多少模块在调用他。

论坛徽章:
0
5 [报告]
发表于 2010-06-10 10:34 |只看该作者
其实当前我的首要任务是搞清楚

整个长参数的解析过程以及细节

这样我就可以自己填充数据结构

而不依赖iptables接口就可以自己解析长参数了

希望啰嗦麻烦的地方 大家见谅 初读源码 笨拙之处见谅

论坛徽章:
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
6 [报告]
发表于 2010-06-10 10:36 |只看该作者
嗯。内核版精华贴中也总结的有iptables的源码分析,你也可以参考一下。

论坛徽章:
0
7 [报告]
发表于 2010-06-10 10:46 |只看该作者
嗯。内核版精华贴中也总结的有iptables的源码分析,你也可以参考一下。
Godbach 发表于 2010-06-10 10:36



    恩 在从switch出去之后进行了target的注册!
  1. if (target->init != NULL)
  2.         target->init(target->t, &fw.nfcache);
复制代码
恩 已经在看了 就是细节方面跟不上文章的思路 呵呵

有点思路了 我再去看看源码 不会的地方还希望前辈多多指教~

论坛徽章:
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
8 [报告]
发表于 2010-06-10 10:58 |只看该作者
回复 7# sakiola

不用客气。多多交流

论坛徽章:
0
9 [报告]
发表于 2010-06-11 10:24 |只看该作者
本帖最后由 sakiola 于 2010-06-11 10:25 编辑

  1. if ( m == NULL
  2.      && protocol
  3.      && ( !find_proto(protocol, DONT_LOAD,options&OPT_NUMERIC, NULL)
  4.              || (find_proto(protocol, DONT_LOAD,options&OPT_NUMERIC, NULL)
  5.                   && (proto_used == 0))
  6.           )
  7.      && (m = find_proto(protocol, TRY_LOAD, options&OPT_NUMERIC, &matches))
  8.    )
复制代码
最近脑袋乱乱的 什么都看不懂 再次求教

通过阅读http://linux.chinaunix.net/bbs/thread-1022438-1-8.html中关于default部分的解释 发现以前的理解确实有很多的错误

先感谢前人伟业

在此 如果要进入这个if的话 分别是四个&&条件 请教 第三个&&条件 是在干什么?

判断条件推测如下,请指正:

match链表为空
协议已指定
那么在match链表中查找该协议的match项 如果(未找到)
(加载)
或者 (找到了但是未被加载使用) 则 (加载)

但是 我个人觉得不会出现 m为空 但是还能找到的情况啊?既然m都空了 那么怎么可能 这个要查询协议已经在match链表中了呢 但是还未被使用呢?、

请帮忙分析下 给点意见
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP