免费注册 查看新帖 |

Chinaunix

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

netfilter中hook返回值NF_REPEAT和NF_STOLEN的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-12 15:56 |只看该作者 |倒序浏览
初次接触netfilter源码, 对这两个返回值的理解不大明白.故向各位大虾请教.

1. NF_REPEAT:
netfilter.c中
static unsigned int nf_iterate(struct list_head *head,
                               struct sk_buff **skb,
                               int hook,
                               const struct net_device *indev,
                               const struct net_device *outdev,
                               struct list_head **i,
                               int (*okfn)(struct sk_buff *))
{
        for (*i = (*i)->next; *i != head; *i = (*i)->next) {
                struct nf_hook_ops *elem = (struct nf_hook_ops *)*i;
                switch (elem->hook(hook, skb, indev, outdev, okfn)) {
                case NF_QUEUE:
                        return NF_QUEUE;

                case NF_STOLEN:
                        return NF_STOLEN;          

                case NF_DROP:
                        return NF_DROP;

                case NF_REPEAT:
                        *i = (*i)->prev;
                        break;

#ifdef CONFIG_NETFILTER_DEBUG
                case NF_ACCEPT:
                        break;

                default:
                        NFDEBUG("Evil return from %p(%u).\n",
                                elem->hook, hook);
#endif
                }
        }
        return NF_ACCEPT;
}

问题1:当前结点的hook如果返回NF_REPEAT,则回到上一个结点继续处理,而如果上一个结点的返回值是一个非法值,则不会break,又回到返回NF_REPEAT的结点,死循环?
问题2:体现在用户空间(iptables)中, NF_REPEAT会由哪个target触发?或者由什么条件触发hook返回该值?

2.NF_STOLEN:
在网上搜索时,看到某些解释是: NF_STOLEN 忘掉该数据包   NF_DROP 丢弃该数据包
在内核源码中grep它的使用时, 类似以下代码
if (ret != NF_DROP && ret != NF_STOLEN
            && ((*pskb)->nh.iph->saddr != saddr
                || (*pskb)->nh.iph->daddr != daddr))
                return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP;

我并未看出NF_STOLEN和NF_DROP有何不同, 都是不对数据包进行处理,那么
问题1. 在内核空间中NF_STOLEN和NF_DROP有何区别?
问题2. 在用户空间, NF_STOLEN会由什么条件触发HOOK返回该值?

论坛徽章:
0
2 [报告]
发表于 2008-06-13 09:10 |只看该作者
关键看NF_REPEAT和NF_STOLEN的意图

NF_REPEAT主要用于QUEUE target,QUEUE会把包发送给用户,让用户程序有机会处理,并且用户可以反馈处理的结果,例如可以是DROP,或则用户程序对包进行了修改,并且让内核重新处理该包(从头把该链中的规则走一遍,例如filter的input链),就可以返回REPEAT,该target慎用,很容易造成死循环.

NF_STOLEN目前只见到用户MIRROR,意思是包被镜像了,源地址和目的地址交换,然后被发送出去,即弹回去了,然后告诉内核该包被STOLEN,其实和DROP差不多

http://cache.baidu.com/c?m=9d78d ... 7c7f&user=baidu

论坛徽章:
0
3 [报告]
发表于 2008-06-13 11:11 |只看该作者
NF_STOLEN目前只见到用户MIRROR


MIRROR的作用我明白, 那么, 这一点体现在代码的何处? 请qtdszws再指教一下.

论坛徽章:
0
4 [报告]
发表于 2008-06-13 16:13 |只看该作者
v2.4.0

static unsigned int ipt_mirror_target(struct sk_buff **pskb,
                                      unsigned int hooknum,
                                      const struct net_device *in,
                                      const struct net_device *out,
                                      const void *targinfo,
                                      void *userinfo)
{
        if ((*pskb)->dst != NULL) {
                if (route_mirror(*pskb)) {
                        ip_rewrite(*pskb);
                        /* Don't let conntrack code see this packet:
                           it will think we are starting a new
                           connection! --RR */
                        ip_direct_send(*pskb);
                        return NF_STOLEN;
                }
        }
        return NF_DROP;
}

论坛徽章:
0
5 [报告]
发表于 2008-06-16 11:01 |只看该作者
谢谢! 我再去找一下和用户层iptables的相关set/getopt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP