0

请参阅此 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

在这里我找到了这一段:

NF_DROP 返回码意味着这个数据包应该被完全丢弃并且分配给它的所有资源应该被释放。NF_ACCEPT 告诉 Netfilter 到目前为止数据包仍然是可接受的,它应该移动到网络堆栈的下一个阶段。NF_STOLEN 是一个有趣的方法,因为它告诉 Netfilter “忘记”这个数据包。这告诉 Netfilter 钩子函数将从这里开始处理这个数据包,并且 Netfilter 应该放弃对它的所有处理。然而,这并不意味着数据包的资源被释放。数据包及其各自的 sk_buff 结构仍然有效,只是钩子函数已将数据包的所有权从 Netfilter 手中夺走。NF_REPEAT 请求 Netfilter 再次调用钩子函数。

discarding但我不知道和之间的forgetting数据包与NF_DROP和有什么区别NF_STOLE

4

3 回答 3

1

本文档全面概述了 netfilter 的工作原理以及原因。

我的理解是返回NF_DROP告诉netfilter丢弃数据包,而返回NF_STOLEN基本上意味着您从现在开始对数据包负责:内核仍然在其内部表中拥有数据包,您现在负责告诉内核在您对数据包执行任何其他操作后清理它。

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

于 2013-10-25T06:55:32.047 回答
1

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

NF_STOLEN您的 netfilter 钩子现在“拥有” sk_buff“资源”的情况下。因此,您需要kfree_skb在使用完 sk_buff 后调用它。

于 2014-03-27T22:03:01.320 回答
0

我认为NF_STOLEN意味着netfilter永远不会调用下一个注册的hook point函数,也不会将它传递给上层,这个sk_buff现在是你的了……典型的场景是我们为我自己过滤一些数据包,或者拦截它,或者做一些机密交流...

于 2015-01-31T03:31:24.850 回答