什么是Netfilter/iptable

Netfilter/iptables是Linux内核内置的报文过滤框架,程序可以通过该框架完成报文过滤、地址转换(NAT)以及连接跟踪等功能。

Netfilter/iptables由两部分组成,一部分是Netfilter的"钩子(hook)",这些"钩子"由Linux内核协议栈提供,内核模块可以通过注册"钩子"来完成各种各样的功能。 另一部分是iptables的规则,这些规则规定了"钩子"如何工作。

下图很直观的说明了用户空间的iptables和内核空间的ip_tables模块、Netfilter之间的关系。

Netfilter

Netfilter是嵌入Linux内核协议栈的,设置在报文处理路径上的一系列调用入口。 Netfilter一共有5个"钩子"设置在IP协议栈的报文处理路径上,这5个"钩子"就是内嵌在内核协议栈的检查点。 我们可以把处理函数注册到各个检查点,当报文经过各个检查点时,就可以通过"钩子"函数对报文进行处理完成相应功能。

下图说明了5个"钩子"在内核协议栈的位置。

"钩子"的存储及管理机制

在内核中,"钩子"函数由一个全局二维数组nf_hooks按照协议族归类存储,在每个协议族中,根据钩子点顺序排列,在钩子点内则根据钩子函数的优先级排列。 例如ipv4和ipv6就是两个协议族,每个协议族都包含5个"钩子",每个"钩子"下面保存了注册在这个"钩子"上的函数地址。

这个二维数组的每一项代表了一个钩子被调用的点,NF_PROTO代表协议栈,NF_HOOK代表协议栈中某个路径点。

所有模块都可以通过nf_register_hook()函数将一个钩子函数挂入想要被调用点的链表中(通过Protocol和hook指定一个点)。 这样,该钩子函数就能够处理从指定Protocol和指定hook点流过的数据包。

Netfilter在不同协议栈的不同点上放置钩子函数,当数据包经过某个协议栈(NF_PROTO)的某个点(NF_HOOK)时,该协议栈会通过NF_HOOK()函数调用对应钩子链表(nf_hooks[NF_PROTO][NF_HOOK])中注册的每一个钩子项来处理该数据包。

Netfilter定义了每个钩子函数的返回值,每个钩子函数只能返回下面的返回值,而不能自定义返回值。

NF_DROP(0):数据包被丢弃,即不被下一个钩子函数处理,同时也不再被协议栈处理,并释放数据包。

NF_ACCEPT(1):数据包被接受,即交给下一个钩子或协议栈继续处理。

NF_STOLEN(2):数据包被停止处理,即不被下一个钩子函数处理,同时也不再被协议栈处理,但不释放数据包。

NF_QUEUE(3):将数据包交给nf_queue子系统处理,即不被下一个钩子函数处理,同时也不再被协议栈处理,也不释放数据包。

NF_REPEAT(4):数据包将被该返回值的钩子函数再次处理一遍。

NF_STOP(5): 数据包停止被该HOOK点的后续钩子函数处理,交给协议栈继续处理。

"钩子"的使用方法

"钩子"的使用首先实例化一个nf_hook_ops对象,然后对其进行必要的初始化设置,最后通过nf_register_hook()函数将其注册到二维数组nf_hooks中。 我们首先初始化nf_hook_ops中的常用字段:

static struct nf_hook_ops nf_hook_test_ops =

{

.hook = test_hook_func;

.hooknum = NF_INET_PRE_ROUTING;

.pf = PF_INET;

.owner = THIS_MODULE;

.priority = NF_IP_PRI_FIRST;

}

其中:

hook是钩子函数

hooknum是钩子点

pf是协议栈

priority是钩子函数的优先级

然后在模块加载和退出函数中注册和移除钩子函数:

int init_module(void)

{

nf_register_hook(&nf_hook_test_ops);

}

void cleanup_module()

{

nf_unregister_hook(&nf_hook_test_ops);

}

下面是回调函数的声明:

static unsigned int test_hook(unsigned int hooknum, struct sk_buff *skb,

const struct net_device *in, const struct net_device *out,

int (*okfn)(struct sk_buff*)

从上述过程可以看出,钩子函数的使用与iptables没有任何关系,也就是说如果某个模块需要对协议栈的报文进行处理,但不需要用户空间的参数,那么完全可以只注册钩子函数,而不需要编写iptables的模块。

即使需要用户空间的参数,也可以通过proc或者netlink等其他用户态和内核态通信方式来传递参数,这样就可以更灵活的使用Netfilter了。

参考资料:

linux netfilter 过滤数据包,Netfilter-iptabes报文过滤框架(一)相关推荐

  1. 基于linux的netfilter处理数据包的过程分析,基于Linux的Netfilter处理数据包的过程分析...

    基于Linux的Netfilter处理数据包的过程分析 防火墙技术在保护网络安全方面的作用越来越明显.相比较window,Linux有更好的网络性能,因此基于Linux的Netfilter技术 (本文 ...

  2. linux过滤数据包,用Tcpdump过滤数据包

    对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过嗅探器来分析原因,找出造成网络阻塞的根源.Tcpdump就是Linux平台下一个以命令行方式运行的网络流量 ...

  3. Linux内核网络数据包发送(三)——IP协议层分析

    Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...

  4. linux如何查看丢弃数据包,导致Linux服务器丢弃数据包?

    我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...

  5. Linux系统捕获数据包流程

    Linux系统捕获数据包流程 为了提高数据包的捕获效率,瓶颈问题是一个需要非常关注的焦点.减少在捕获数据包过程中的瓶颈,就能够提高数据包捕获的整体性能.下面本文将以Linux操作系统为平台,分析捕获数 ...

  6. Linux内核网络数据包发送(四)——Linux netdevice 子系统

    Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...

  7. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  8. Linux内核网络数据包发送(一)

    Linux内核网络数据包发送(一) 1. 前言 2. 数据包发送宏观视角 3. 协议层注册 4. 通过 socket 发送网络数据 4.1 `sock_sendmsg`, `__sock_sendms ...

  9. linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记

    关于  SKB序列号的小笔记 为了修改TCP协议,现在遇到了要改动tcp分组的序列号,但是只是在tcp_sendmsg函数中找到了SKB的end_seq  一直没有找到seq 不清楚在那里初始化了,就 ...

  10. 在Wireshark中过滤数据包

    介绍 数据包过滤可让你专注于你感兴趣的确定数据集.如你所见,Wireshark 默认会抓取所有数据包.这可能会妨碍你寻找具体的数据. Wireshark 提供了两个功能强大的过滤工具,让你简单而无痛地 ...

最新文章

  1. 基于点云强度的3D激光雷达与相机的外参标定
  2. 《大道至简》一书第三版,与编辑就本书写作风格的讨论
  3. [YTU]_2803( 判断字符串是否为回文)
  4. python能解密java的_实现Java加密,Python解密的RSA非对称加密算法功能
  5. python中函数和方法的区别
  6. 膜拜大佬!不同层级的Android开发者的不同行为,社招面试心得
  7. 阿里云、腾讯云和华为云618活动细节对比
  8. 【Python】学习笔记2-数据类型:数组、数组循环切片
  9. 固定再计算机主机箱,一种计算机主机放置箱架的制作方法
  10. pioneer软件VoLTE测试步骤,世纪鼎利Pioneer连接移动平台进行VoLTE测试操作说明综述...
  11. houdini大神自诉:为什么我要放弃maya I
  12. ubuntu设置变暗时间
  13. 如何优雅地使用 Sublime Text
  14. C#比较两字符串是否相等,忽略大小写
  15. 2020湖南省技能竞赛获奖名单_雄安新区网络安全技能竞赛举办!9人获奖!
  16. 技术创业者必读:从验证想法到技术产品商业化的全方位解析
  17. 调用对象 “ha-datastoresystem”的“HostDatastoreSystem.QueryVmfsDatastoreCreateOptions” 失败。...
  18. [原创]FineUI秘密花园(六) — 表单控件
  19. Avaya交换机呼叫中心解决方案
  20. U盘重新量产,PE与ubuntu共存

热门文章

  1. vagrant 环境配置
  2. 吉哥系列故事——恨7不成妻(数位 DP)
  3. Georgia and Bob(Poj 1704)Nim 博弈
  4. #530. 「LibreOJ β Round #5」最小倍数 二分 + 数论
  5. D - Counting Stars HDU - 7059
  6. Code Names
  7. 牛客题霸 [数组中未出现的最小正整数] C++题解/答案
  8. 合成小丹(dp+二进制按位或+结论)
  9. 2021牛客OI赛前集训营-提高组(第五场)C-第K排列【dp】
  10. YbtOJ#463-序列划分【二分答案,线段树,dp】