0

看到这个netfilter的标题:http://lxr.free-electrons.com/source/include/uapi/linux/netfilter.h 我们:Netfilter钩子中的NF_DROP和NF_STOLEN有什么区别?

9 /* Responses from hook functions. */ 
    10 #define NF_DROP 0 
    11 #define NF_ACCEPT 1 
    12 #define NF_STOLEN 2 
    13 #define NF_QUEUE 3 
    14 #define NF_REPEAT 4 
    15 #define NF_STOP 5 
    16 #define NF_MAX_VERDICT NF_STOP 

here我发现这一段:

的NF_DROP返回代码意味着这个包应该完全消失了,它应该分配的任何资源被发布。 NF_ACCEPT告诉Netfilter到目前为止数据包仍然可以接受,并且它应该移动到网络堆栈的下一个阶段。 NF_STOLEN很有趣,因为它告诉Netfilter“忘记”数据包。 这告诉Netfilter,钩子函数将从这里处理这个数据包,并且Netfilter应该放弃它的所有处理。然而,这并不意味着数据包的资源被释放。数据包和它的相应sk_buff结构仍然有效,只是钩子函数已经从Netfilter中取走了数据包的所有权。 NF_REPEAT请求Netfilter再次调用挂钩函数。

但我不知道什么是关于向NF_DROPNF_STOLEdiscardingforgetting包之间的区别吗?

回答

1

This document详细介绍了netfilter的工作原理和原因。

我的理解是,返回NF_DROP告诉netfilter的丢弃数据包,而返回NF_STOLEN基本上意味着你从现在开始承担包责任:内核仍然在其内部表的数据包,而你现在负责告诉内核在完成对数据包的其他操作之后清理它。

对于大多数应用程序,您需要使用NF_DROP而不是NF_STOLEN

+0

那么“NF_DROP”和“NF_STOLEN + kfree_skb”之间的区别是什么? – ernest

1

NF_DROP的情况下,您的netfilter钩子不能释放sk_buff,因为网络堆栈将负责释放该“资源”。

NF_STOLEN的情况下,您的netfilter挂钩现在“拥有”sk_buff“resource”。因此,当您完成使用时,您需要在sk_buff上调用kfree_skb

0

我认为NF_STOLEN意味着netfilter永远不会调用下一个注册的挂钩点函数,也不会将其拖放到上层,这个sk_buff现在就是你的了...典型的情况是我们为自己过滤一些数据包,或者拦截它,或做一些保密的通信......