- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux 2.4中netfilter框架实现
ideal (linux中文支持站点)
Netfilter是linux2.4内核实现数据包过滤/数据包处理/NAT等的功能框架。该文讨论了linux 2.4内核的netfilter功能框架,还对基于netfilter框架上的包过滤,NAT和数据包处理(packet mangling)进行了讨论。阅读本文需要了解2.2内核中ipchains的原理和使用方法作为预备知识,若你没有这方面的知识,请阅读IPCHAINS-HOWTO。
第一部分:Netfilter基础和概念
一、什么是Netfilter
Netfilter比以前任何一版Linux内核的防火墙子系统都要完善强大。Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。因此不要在2.4中期望讨论诸如如何在2.4中架设一个防火墙或者伪装网关这样的话题,这些只是Netfilter功能的一部分。Netfilter框架包含以下三部分:
1 为每种网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。
2 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。
3 那些排队的数据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。
所有的包过滤/NAT等等都基于该框架。内核网络代码中不再有到处都是的、混乱的修改数据包的代码了。当前netfilter框架在IPv4、IPv6及Decnet网络栈中被实现。
二、为什么需要Netfilter?
其实这个问题也可以变为ipchains有什么缺点导致被抛弃?下面只是其中的几个原因:
因为基于2.2内核的ipchains没有提供传递数据包到用户空间的框架,所以任何需要对数据包进行处理的代码都必须运行在内核空间,而内核编程却非常复杂,而且只能用C语言实现,并且容易出现错误并对内核稳定性造成威胁。
透明代理实现非常复杂,必须查看每个数据包来判断是否有专门处理该地址的socket。网络栈代码中在11个文件中共出现了34个#ifdef条件编译。
创建一个不依赖于接口地址的数据报过滤规则是不可能实现的。我们必须利用本地接口地址来判断数据报是本地发出、还是发给本地的或是转发的。转发链只有输出接口的信息,因此管理员必需考虑数据报的源。
伪装和数据包过滤都在同一个模块内实现,导致防火墙代码过于复杂。
IPchains代码即不模块化又不易于扩展(例如对mac地址的过滤)
三、Netfilter的作者
Netfilter框架的概念的提出及主要实现是由Rusty Russell完成的,他是ipchains的合作完成者及当前linux内核IP防火墙的维护者。还有Marc Boucher、James Morris、Harald Welte等都参与了Netfilter项目。
四、Netfilter在IPv4中的结构
一个数据包按照如下图所示的过程通过Netfilter系统:
---[1]---[ROUTE]---[3]---[4]---
| ^
local| |
| [ROUTE]
v |
[2] [5]
| ^
| |
v |
从图中可以看到IPv4一共有5个钩子函数,分别为:
1 NF_IP_PRE_ROUTING
2 NF_IP_LOCAL_IN
3 NF_IP_FORWARD
4 NF_IP_POST_ROUTING
5 NF_IP_LOCAL_OUT
数据报从左边进入系统,进行IP校验以后,数据报经过第一个钩子函数NF_IP_PRE_ROUTING[1]进行处理;然后就进入路由代码,其决定该数据包是需要转发还是发给本机的;若该数据包是发被本机的,则该数据经过钩子函数NF_IP_LOCAL_IN[2]处理以后然后传递给上层协议;若该数据包应该被转发则它被NF_IP_FORWARD[3]处理;经过转发的数据报经过最后一个钩子函数NF_IP_POST_ROUTING[4]处理以后,再传输到网络上。
本地产生的数据经过钩子函数NF_IP_LOCAL_OUT [5]处理可以后,进行路由选择处理,然后经过NF
文档评论(0)