免费注册 查看新帖 |

Chinaunix

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

netfilter问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-13 15:30 |只看该作者 |倒序浏览
netfilter中那个文件是内核和,用户接口的?(我的意思是说.当用户写一个iptables -t mangle 策略时候,内核中那个文件负责读取用户空间发来的策略设置到表里面去的?)

论坛徽章:
0
2 [报告]
发表于 2006-12-14 10:10 |只看该作者
parse 是最重要的一个函数,因为这里要检查参数的正确性,并写入我们将共享给核心态程序的信息。它在每次参数被发现的时候被调用,也就是说,如果用户输入了两个参数,这个函数就将被以不同的参数代码 c 调用两次。
static int parse(int c, char **argv, int invert, unsigned int *flags,
                 const struct ipt_entry *entry,
                 unsigned int *nfcache,
                 struct ipt_entry_match **match)
{

我们使用特殊结构来保存我们要传递给核心态程序的信息。'match' 指针被传递给多个函数,我们可以每次使用同样的数据结构。一旦规则被加载了,这个指针就被复制到了核心态程序里。通过这个方式,内核模块可以知道用户想要分析什么(这正是问题的关键,不是么?)。
   struct ipt_ipaddr_info *info = (struct ipt_ipaddr_info *)(*match)->data;

每个参数对应着一个单独的值,于是我们能根据进入的参数决定采取何种行动。下文中我们将看到我们如何把参数变成数值。

   switch(c) {

首先,我们检查参数是否被使用了多次。如果使用了多次的话,调用 <iptables/iptables.c> 中定义的 'exit_error()' 函数,这样程序会立刻带着 <iptables/include/iptables_common.h> 中定义的 'PARAMETER_PROBLEM' 的错误状态推出。否则,我们在我们的头文件中定义的 'IPADDR_SRC' 中设置 'flags' 和 'info->flags'。稍后我们将介绍这个头文件。

虽然这两个标志看起来差不多,但是是完全不同的。'flag' 的作用域就是这个函数,而 'info->flags' 是我们用于和核心态程序共享信息的结构的一部分。
      case '1':
         if (*flags & IPADDR_SRC)
            exit_error(PARAMETER_PROBLEM, "ipt_ipaddr: Only use --ipsrc once!");
         *flags |= IPADDR_SRC;
         info->flags |= IPADDR_SRC;

检查如果取反标志 '!' 是否存在,如果有的话,在 'info->flags' 中写相应的值。
之后调用为这个骨架程序所写的内部函数 'parse_ipaddr' 来把 IP 地址从字符串转化为 32 位值。

         if (invert)
            info->flags |= IPADDR_SRC_INV;

         parse_ipaddr(argv[optind-1], &info->ipaddr.src);
         break;

同样考虑,我们检查是否存在多次设置,置恰当的标志。
      case '2':
         if (*flags & IPADDR_DST)
            exit_error(PARAMETER_PROBLEM, "ipt_ipaddr: Only use --ipdst once!");
         *flags |= IPADDR_DST;
         info->flags |= IPADDR_DST;
         if (invert)
            info->flags |= IPADDR_DST_INV;

         parse_ipaddr(argv[optind-1], &info->ipaddr.dst);
         break;

      default:
         return 0;
   }

   return 1;
}

我想这应该是你想的吧,以前看过,这个是同内核打交道的函数。

[ 本帖最后由 zw2002 于 2006-12-14 10:12 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-12-14 12:57 |只看该作者
原帖由 zw2002 于 2006-12-14 10:10 发表
parse 是最重要的一个函数,因为这里要检查参数的正确性,并写入我们将共享给核心态程序的信息。它在每次参数被发现的时候被调用,也就是说,如果用户输入了两个参数,这个函数就将被以不同的参数代码 c 调用两次 ...


楼上的,谬以千里啦!
parse只是iptables插件中,一个简单的参数分析函数,仅此而已,

net/ipv4/netfilter中,
ip_tables.c是主要的源码文件之一,它的初始化模块中:

static int __init init(void)
……
        /* Register setsockopt */
        ret = nf_register_sockopt(&ipt_sockopts);
        if (ret < 0) {
                duprintf("Unable to register sockopts.\n");
                return ret;
        }
这里,注册nf_socket接口,这个接口是老版本的Netfilter内核态/用户态通读的唯一接口,现在又有了libnetlink接口。
这里,注册了一个ipt_socketopts。

static struct nf_sockopt_ops ipt_sockopts = {
        .pf                = PF_INET,
        .set_optmin        = IPT_BASE_CTL,
        .set_optmax        = IPT_SO_SET_MAX+1,
        .set                = do_ipt_set_ctl,
        .get_optmin        = IPT_BASE_CTL,
        .get_optmax        = IPT_SO_GET_MAX+1,
        .get                = do_ipt_get_ctl,
};
其中,do_ipt_set_clt就是设置规则的接口,do_ipt_get_ctl是获取规则的接口。

论坛徽章:
0
4 [报告]
发表于 2006-12-14 20:23 |只看该作者
没细看,我说的是
写一个 iptables/netfilter 匹配模块

论坛徽章:
0
5 [报告]
发表于 2006-12-14 21:07 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2006-12-15 09:42 |只看该作者
对就是我要找的哪个.谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP