请参阅此netfilter标题:http://lxr.free-electrons.com/source/include/uapi/linux/netfilter.h 我们有:
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再次调用钩子函数。
但我不知道有关discarding
和forgetting
的{{1}}和NF_DROP
个数据包之间的区别是什么?
答案 0 :(得分:1)
This document详细介绍了netfilter的工作原理和原因。
我的理解是返回NF_DROP
告诉netfilter丢弃数据包,而返回NF_STOLEN
基本上意味着你从现在开始承担数据包的责任:内核仍然有数据包在其中内部表,现在你负责告诉内核在你完成其他任何你正在使用的数据包之后清理它。
对于大多数应用,您需要使用NF_DROP
而不是NF_STOLEN
。
答案 1 :(得分:1)
在NF_DROP
的情况下,你的netfilter钩子必须不释放sk_buff,因为网络堆栈将负责释放那个“资源”。
在NF_STOLEN
的情况下,你的netfilter钩子现在“拥有”了sk_buff“资源”。因此,当您使用完sk_buff后,需要在sk_buff上调用kfree_skb
。
答案 2 :(得分:0)
我认为NF_STOLEN意味着netfilter永远不会调用下一个注册的钩子点函数,也不会将它传递到上层,这个sk_buff现在是你的...典型情况是我们为自己过滤一些数据包,或者拦截它,或者做一些保密的沟通......