当前位置:   article > 正文

Linux 网络协议栈开发(七)—— Netfilter 概述及其hook点_linux 内核通过钩子函数,让tcp send 函数返回-1

linux 内核通过钩子函数,让tcp send 函数返回-1

Netfilter概述
         Netfilter/IPTablesLinux2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性。其重要工具模块IPTables从用户态的iptables连接到内核态的Netfilter架构,Netfilter与IP协议栈是无缝契合的,并允许使用者对数据报进行过滤、地址转换、处理等操作。

主要源代码文件

Linux内核版本:2.4.x以上

Netfilter主文件:net/core/netfilter.c

 Netfilter主头文件:include/linux/netfilter.h

IPv4相关:

                       c文件:net/ipv4/netfilter/*.c

                     头文件:include/linux/netfilter_ipv4.h

                                     include/linux/netfilter_ipv4/*.h

IPv4协议栈主体的部分c文件,特别是与数据报传送过程有关的部分:

                       ip_input.cip_forward.cip_output.cip_fragment.c

具体功能模块

  1. 数据报过滤模块
    1. 连接跟踪模块(Conntrack

    2. 网络地址转换模块(NAT

    3. 数据报修改模块(mangle

    4. 其它高级功能模块

Netfilter实现
        Netfilter主要通过表、链实现规则,可以这么说,Netfilter是表的容器,表是链的容器,链是规则的容器,最终形成对数据报处理规则的实现。

数据在协议栈里的发送过程中,从上至下依次是“加头”的过程,每到达一层数据就被会加上该层的头部;与此同时,接受数据方就是个“剥头”的过程,从网卡收上包来之后,在往协议栈的上层传递过程中依次剥去每层的头部,最终到达用户那儿的就是裸数据了。
 
        对于收到的每个数据包,都从“A”点进来,经过路由判决,如果是发送给本机的就经过“B”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地是不本机,那么就经过“C”点,然后顺着“E”点将该包转发出去。
       对于发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然后经过“D”点,最后也是顺着“E”点将该包发送出去。
       协议栈那五个关键点A,B,C,D和E就是我们Netfilter大展拳脚的地方了。
       Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。Netfilter在内核中位置如下图所示:
 
         这幅图很直观的反应了用户空间的iptables和内核空间的基于Netfilter的ip_tables模块之间的关系和其通讯方式,以及Netfilter在这其中所扮演的角色。
Netfilter在netfilter_ipv4.h中将这个五个点重新命了个名,如下图所示:
 
        在每个关键点上,有很多已经按照优先级预先注册了的回调函数(称为“钩子函数”)埋伏在这些关键点,形成了一条链。对于每个到来的数据包会依次被那些回调函数“调戏”一番再视情况是将其放行,丢弃还是怎么滴。但是无论如何,这

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/160446
推荐阅读
相关标签
  

闽ICP备14008679号