免费注册 查看新帖 |

Chinaunix

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

[原创]Netfilter源码分析-我来抛砖,望能引玉 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-01-09 11:25 |显示全部楼层
原帖由 guotie 于 2006-1-8 18:39 发表
我认为,一个数据报在netfilter处理的过程中,一直是在softirq中进行的,因此,不可能被其他softirq打断,

如果在一个netfilter的动作,也即target中,直接调用dev_queue_xmit()来发送自己构造的数据报,会出现 ...


Why?不太同意你的说法
netfilter和softirq有关系吗???最多是受影响而已吧?
softirq更多的是和网卡收发数据有关系,而这个处理,从2.4.20有了较大的改变……使用了一个类似poll的动作……

论坛徽章:
0
22 [报告]
发表于 2006-02-22 12:24 |显示全部楼层
原帖由 wwwspirit 于 2006-2-22 10:13 发表
我有一处不明白。还望各位多指点:
规则的组织方式是struct ipt_ip + struct ipt_entry_match + struct ipt_entry_match + ... + struct ipt_entry_target;

而规则在初始化的时候(建立的时候),需要分 ...


想法是对了的……只是想得太过简单了……

我们以规则的添加为例来描述规则的构造,
看先iptables的源码的do_command()函数:
其中,分析一些标准的规则参数,如地址等等,存储于struct ipt_entry fw这个结构中,这个略去不表,重点在match和target.

每添加一个mathc,都对应一个-m,我们来看选项分析的case 'm':
                case 'm': {
……
                        m->m = fw_calloc(1, size);
……
                }
这样,就为每个match动态分析了一段地址!!target类似,略去不表。然后是调用每个match的parse函数分析,填充相应的值。

好,最后来看规则的整合了:
e = generate_entry(&fw, iptables_matches, target->t);

有是你所说的规则,fw是标准规则部份,每二个是match的全局结构变量,过会会遍历它,后一个是target:
只需看这个函数的前面开头部份就可以回答你的问题了:

static struct ipt_entry *
generate_entry(const struct ipt_entry *fw,
               struct iptables_match *matches,
               struct ipt_entry_target *target)
{
        unsigned int size;
        struct iptables_match *m;
        struct ipt_entry *e;

        size = sizeof(struct ipt_entry);
        for (m = matches; m; m = m->next) {
                if (!m->used)
                        continue;

                size += m->m->u.match_size;
        }

        e = fw_malloc(size + target->u.target_size);
……
其中size用来计算规是空间,其实就是分别计算三个部份的长度,然后一起分配,所以即不会浪费,也不会有溢出等等……

而到了内核中,只需把用户空间的内容直接拷贝到对应地址空间即可!!!

论坛徽章:
0
23 [报告]
发表于 2006-02-22 13:09 |显示全部楼层
原帖由 wwwspirit 于 2006-2-22 13:00 发表
那我修改要修改ipt_entry,或者修改ipt_entry_match怎么办呢?
如果我只需要添加一条match,那是不是就必须添加一条规则,而无法在已有的规则中添加match?


根据match名,查到到对应的空间,替换之……不过iptables的相应动作是如何的,好久不看代码了,记不清了,你可以看看代码就一目了然了……

[ 本帖最后由 独孤九贱 于 2006-2-22 13:10 编辑 ]

论坛徽章:
0
24 [报告]
发表于 2006-02-22 13:14 |显示全部楼层
原帖由 wwwspirit 于 2006-2-22 13:11 发表
如果我需要增加一条match呢?
是不是就要增加一条新的规则??


当然……

论坛徽章:
0
25 [报告]
发表于 2006-02-22 13:31 |显示全部楼层
原帖由 wwwspirit 于 2006-2-22 13:24 发表
谢谢独孤大侠指点。
我最近比较忙,过几天再认真拜读一下netfilter代码。到时候如有问题再请教


呵呵,九贱非大侠也,大家一起讨论,共同进步而已!
我也想抽个时间,将Netfilter和iptables的源码分析更正、补充完整,无奈时间太少,每天早出晚归的,没有时间啊没有时间!

论坛徽章:
0
26 [报告]
发表于 2006-02-23 09:28 |显示全部楼层
原帖由 wwwspirit 于 2006-2-23 09:01 发表
在问一个问题:
用户用iptables添加规则,用户命令的解析由iptables完成,iptables是把用户的命令组织为规则,然后通过socket传递给netfilter的吗?如果是这样的话,那iptables是不是也必须知道每一条match如何构 ...


目前这种架构, Netfilter与iptables的模块结构是一致的,拿添加规则来讲,上面已经讲了它的全部流程,它是在用户态进行解析、分配空间,初始化,然后再得到这条规则的空间总得,再分配一块内存给这条规则,然后将这个内存地址传递给核心态,内核得到这个地址后,调用copy_from_user将用户态的该地址内容拷贝至内核来(从这个解度上讲,内核在添加规则的时候,如果不进行必要的检查的话,它根本不知道这块内存中是什么东西,也就是说是透明的)。

如果你想自己重写iptables,事实上,在数据结构上,当然得参照一下iptables 的实现了。你想直接写,而不遵循其结构的定义,无疑是不可能的!

论坛徽章:
0
27 [报告]
发表于 2006-02-23 10:55 |显示全部楼层
原帖由 wwwspirit 于 2006-2-23 09:51 发表
如果要在用户态就把规则/match封装好,必然要在内核和用户两个模块维护两份关键数据结构,这样影响模块化,且也不易于日后扩展和维护。


所以,现在比如你升级了新的模块,你就得使用与之对应的iptables管理工具……一起维护,一起升级,它们就像是一个整体,一个程序的两个部份,没有问题的呀!

论坛徽章:
0
28 [报告]
发表于 2006-03-29 09:14 |显示全部楼层
原帖由 tomorrow0530 于 2006-3-28 21:44 发表
我看了你的iptables的分析
然后接着看netfilter的分析
写得好详细,这是强啊~~~~
限于水平,这个地方不懂
unsigned int hook_entry[NF_IP_NUMHOOKS]={ [NF_IP_LOCAL_IN] 0,
        [NF_IP_FORWARD] sizeof( ...


不好意思,iptables/netfilter源码分析,只是第一遍看的时候,边看边写的笔记,现在回想其来,其中错误连连,一直想找个时间修正后再发再CU上面来,只是近来很忙,没有时间,很久不搞了,包括你说的这段代码,我也完全没有印像了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP