Linux网络防火墙【1】 Linux内核网络netfilter 框架

写在前面的话, 自己看书很多,源码也看了不少, 写在这里 算是个总结吧,偶尔需要查的时候回来看下。 同时哪里不对,还请各位指正。


首先, 先说点铺垫。 在网络中,协议都是用来通信的,这就需要通信的格式,就像大家写信一样,必须按照信封提供的格式写,比如说收件人地址、姓名、邮编等等的,这是硬性规定,看见这个格式,OK 邮局就认为合乎我的规定,可以发送了。 否则, 呵呵。 话说回来,Linux内核网路同样是协议,而在其上呢,就是处理与协议相关的内容,不合乎协议的规定,该怎么处理,就怎么处理了。 所以 这一点大家要清楚, 必须合乎协议的约定或者要求,才能被协议的接收方接受。 同样, 无论你是恶意的还是正常的,只要合乎协议的内容,就会被接受,这也是很多安全漏洞出现的原因。


然后,我贴张图,给大家一个概念性的理解。 至于Linux内核源码,网上也有很多,大家可以自己看。当然 read fucking source code 是开发必须的。 上图。。。。


Linux网络防火墙【1】 Linux内核网络netfilter 框架_第1张图片

net_rx_action是软中断。 当网卡接收到包后,触发硬终端,然后把包链入到cpu的softdata队列,开启软终端 就是net_rx_action. 由软中断去处理数据包后续的工作。这样 硬中断的关闭时间 就不至于太长,而影响了中断的效率。 在经过链路层的处理,然后把收到的网络报文送到第三层,即ip_rcv。这样就转到了linux 的tcp/ip的第三层 网络层,这里可以处理ip报文了。ip_rcv检查是不是合乎ip协议格式,是的话 继续投递。 在ip_rcv_finish函数中,查询路由的信息,由路由决定是投往本地 还是转发(前提是开启了Linux的转发功能)。在ip_local_deliver函数中,把ip数据包重组起来,然后再投递 交给本机的进程了。对于转发的数据包则走了另外一条线路。最后按照图中的流向,最终由网卡把数据包发出去。   另外,还有本机发出去的数据包。ip_queue_xmit查询路由 然后再按照图中的流向 往网卡投递数据,最终把数据发到网络上。 这里只是简单的说明一下数据大概的流向,具体不同的内核版本可能会不一样, 比如ip_queue_xmit2函数有的 版本已经被替代了。


我们可以总结下, 按照数据流方向可以分为: 流向 流经 流出。 这样的话,我们可以在关键的几个点上 挂上hook点,这样就可以按照不同的性质来处理数据包。比如,NF_IP_PREROUTING是所有数据包的起点,这里 可以处理所有网卡收到的数据包。 路由之后,可以 在  NF_IP_LOCAL_IN 处理流向本机的包。 在NF_IP_FORWARD处理流经本机的包,在NF_IP_POSTROUTING处理 所有流出的包, 而在NF_IP_LOCAL_OUT 则是流出本机的包。 这样  在这五个点上,所有的包 都会被监控到。 同样,很多开源的代码,都有类似的架构。  这样处理的好处 就是把hook点留了出来, 比如apache。 这样 处理数据的时候,就可以按照自己的需求 去达到自己的目的。 比如 网络防火墙一般是关注于流经本机的包,OK ,我可以在NF_IP_FORWARD 的hook点上 注册上自己的功能,这样就可以处理 流经本机的包了。


当然,这里先介绍 一下 linux netfilter的框架,大家最好还是看下Linux的内核源码,会理解的透彻一点,可以先看基本的框架,用中理解。。。。我的目标是三个月之内 整理出来网络防火墙的基础, 立此博文为证 。 下半年 再整一个 web appliaction firewall  的个人总结,俗话说,就是waf,应用层防火墙。。。   


最后,发个广告。个人的qq交流群: 254210748 。关注Linux 网络 内核  以及网络安全。欢迎大家加入。


你可能感兴趣的:(网络,安全,开发)