- 浏览: 1474664 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
getelephantbyid:
make 无法通过.....
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
getelephantbyid:
patch -p1 ../php-5.4.7_thttpd-2 ...
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
zander:
zander 写道c 语言是静态类型语言还是动态类型语言阅读理 ...
什么是动态语言和静态语言? -
zander:
c 语言是静态类型语言还是动态类型语言
什么是动态语言和静态语言? -
lunajiayou:
很有道理,赞一个
跟着苍蝇会找到厕所,跟着蜜蜂会找到花朵
1. 前言
Netfilter作为目前进行包过滤,连接跟踪,地址转换等的主要实现框架,了解其内部机制对于我们更好的利用Netfilter进行设
计至关重要,因此本文通过阅读内核源码2.6.21.2,根据自身的分析总结出Netfilter的大致实现机制,由于自身水平有限,且相关的参考资料较
少,因此其中的结论不能保证完全正确,如果在阅读本文的过程中发现了问题欢迎及时与作者联系。
2. 规则的存储与遍历机制
规则的存储机制
在Netfilter中规则是顺序存储的,一条规则主要包括三个部分:ipt_entry、ipt_entry_matches、
ipt_entry_target。ipt_entry_matches由多个ipt_entry_match组成,ipt_entry结构主要保存标准
匹配的内容,ipt_entry_match结构主要保存扩展匹配的内容,ipt_entry_target结构主要保存规则的动作。在
ipt_entry中还保存有与遍历规则相关的变量target_offset与next_offset,通过target_offset可以找到规则中
动作部分ipt_entry_target的位置,通过next_offset可以找到下一条规则的位置。规则的存储如下图2-1所示。
图2-1 规则的存储
ipt_entry结构如下图2-2所示,其成员ip指向结构ipt_ip,该结构主要保存规则中标准匹配的内容(IP、mask、interface、
proto等),target_offset的值等于ipt_entry的长度与ipt_entry_matches的长度之和,next_offset
的值等于规则中三个部分的长度之和。通过target_offset与next_offset可以实现规则的遍历。
图2-2 ipt_entry结构
ipt_entry_match主要保存规则中扩展匹配内容(tos、ttl、time等),其是Netfilter中内核与用户态交互的关键数据结构,
在其内核部分由一个函数指针指向一个ipt_match结构,该结构体中包含了对包做匹配的函数,是真正对包做匹配的地方。
ipt_entry_target结构与ipt_entry_match结构很类似。
图2-3 ipt_entry_match结构
图2-4 ipt_entry_target结构
规则的遍历机制
在Netfilter中,函数ipt_do_table()实现了规则的遍历,该函数根据传入的参数table和hook找到相应的规则起点,即第一个ipt_entry的位置,主要通过函数get_entry()实现。
private
=
table-
>
private
;
table_base = ( void * ) private - > entries[ smp_processor_id( ) ] ; e = get_entry( table_base, private - > hook_entry[ hook] ) ; |
标准匹配是通过函数ip_packet_match()实现的,该函数主要对包的五元组信息进行匹配,扩展匹配则通过宏IPT_MATCH_ITERATE实现,该宏的定义为:
#
define
IPT_MATCH_ITERATE(
e,
fn,
args.
.
.
)
\ ( { \ unsigned int __i; \ int __ret = 0; \ struct ipt_entry_match * __match; \ \ for ( __i = sizeof ( struct ipt_entry) ; \ __i < ( e) - > target_offset; \ __i + = __match- > u. match_size) { \ __match = ( void * ) ( e) + __i; \ \ __ret = fn( __match , # # args) ; \ if ( __ret ! = 0) \ break ; \ } \ __ret; \ } ) |
宏IPT_MATCH_ITERATE依次调用各个ipt_entry_match所指向的ipt_match中match()处理数据包,在for循环中使用了terget_offset位置变量查找match的位置。
在对数据包进行了匹配后,接着需要进行相应的动作处理,通过函数ipt_get_target()获取规则动作ipt_entry_target的位置:
static
__inline__
struct
ipt_entry_target *
ipt_get_target( struct ipt_entry * e) { return ( void * ) e + e- > target_offset; } |
如果还需要继续遍历下一条规则,则继续执行以下语句以找到下一条规则的开始位置:
e = ( void * ) e + e- > next_offset; |
3. 表、匹配、动作存储及管理机制
表、匹配、动作的存储机制
规则中所使用到的match、target、table使用全局变量xt_af所指向的相应链表保存,这些链表是在对Netfilter进行初始化或匹配
模块扩展时进行更新的,在初始化时,默认的表及动作则添加到相应的链表中。Netfilter实现了很好的扩展性,如需要对数据包的时间进行匹配,则在
match的链表中需要首先增加time扩展匹配模块,在相应的规则中则通过指向该time模块所对应的函数match()以进行时间的匹配。xt_af
是个一维数组,其按照协议族的不同分别存储,目前我们常用的协议族主要是AF_INET。
图3-1 match,target,table的全局存储
match、target、table的全局存储如上图3-1所示,以下为各部分的详细的结构表示。当扩展一个匹配模块时,其会注册一个
ipt_match结构到match链表中,该结构的主要变量值如下图所示,name表示扩展模块的名字,match()是该模块最主要的函数,其主要对
数据包进行相应的比较,checkentry()主要对包进行相应的完整性检验,destroy()在对模块进行撤销时调用。如果需要自己新加一个扩展模
块,则需要构造一个ipt_match结构并注册到相应的链表中。ipt_target的结构与ipt_match相似,其最主要的函数是
target()。
图3-2 ipt_match结构的存储
图3-3 ipt_target结构的存储
table主要是用来对规则进行管理,通过table中的相应参数可以找到相应的规则所处的入口位置。
图3-4 ipt_table结构的存储
表、匹配、动作的管理机制
match、target、table的注册分别调用xt_register_match()、
xt_register_target()、xt_register_table()实现,前两个注册函数很相
似,xt_register_table()则稍微复杂些。撤销时则分别调用相应的unregister函数实现。
xt_register_match()函数的定义如下(xt_match与ipt_match是一样的):
int
xt_register_match( struct xt_match * match) { int ret, af = match- > family; ret = mutex_lock_interruptible( & xt[ af] . mutex) ; if ( ret ! = 0) return ret; list_add( & match- > list , & xt[ af] . match) ; mutex_unlock( & xt[ af] . mutex) ; return ret; } |
xt_register_table()函数的定义如下(xt_table与ipt_table是一样的),因为一个xt_table结构中还指向另一结构xt_table_info,该结构主要描述表的相关信息,所以对表注册时需要对这两类结构体进行定义。
int
xt_register_table(
struct
xt_table *
table,
struct xt_table_info * bootstrap, struct xt_table_info * newinfo) { int ret; struct xt_table_info * private ; struct xt_table * t; ret = mutex_lock_interruptible( & xt[ table- > af] . mutex) ; if ( ret ! = 0) return ret; /* Don't autoload: we'd eat our tail... */ list_for_each_entry( t, & xt[ table- > af] . tables, list ) { if ( strcmp ( t- > name, table- > name) = = 0) { ret = - EEXIST; goto unlock; } } /* Simplifies replace_table code. */ table- > private = bootstrap; rwlock_init( & table- > lock) ; if ( ! xt_replace_table( table, 0, newinfo, & ret) ) goto unlock; private = table- > private ; duprintf( "table->private->number = %u\n" , private - > number) ; /* save number of initial entries */ private - > initial_entries = private - > number; list_add( & table- > list , & xt[ table- > af] . tables) ; ret = 0; unlock: mutex_unlock( & xt[ table- > af] . mutex) ; return ret; } |
4. 钩子函数的存储及管理机制
钩子函数的存储机制
钩子函数由一个全局二维链表nf_hooks保存,其按照协议族归类存储,在每个协议族中,根据钩子点顺序排列,在钩子点内则根据钩子函数的优先级依次排
列。钩子函数的存储图如下图4-1所示,链表中的每个元素都是指向结构体nf_hook_ops中的hook()函数的指针,nf_hook_ops实际
存储了钩子函数的内容,其结构如图4-2所示。在相应的钩子点调用钩子函数时,则根据协议族和钩子点找到相应的链表入口,然后依次调用该链中的每一个钩子
函数对数据包进行操作。
图4-1 钩子函数的全局存储
图4-2 钩子函数的链表
钩子函数的管理机制
如果需要在相应的钩子点挂载钩子函数,则需要首先定义一个nf_hook_ops结构,在其中实现实际的钩子函数,再调用函数nf_register_hook()将该钩子函数注册到图4-1所示的二维链表中,nf_register_hook()函数的定义如下:
5. Netfilter的流程框架
在Netfilter中的不同钩子点调用了不同的钩子函数,这些钩子函数的调用如图4-1所示,其调用的流程框架如下图5-1所示。
图5-1 Netfilter中hook函数的调用流程
Netfilter中默认表filter在建立时则在NF_IP_LOCAL_IN,NF_IP_FORWARD钩子点注册了钩子函数
ipt_hook(),在NF_IP_LOCAL_OUT这个点注册了钩子函数ipt_local_out_hook(),两个钩子函数都会调用
ipt_do_table()对相对应的表和钩子点的规则进行遍历。调用的流程如下图5-2所示。
图5-2 Netfilter中规则的调用流程
6.总结
以上只是简单分析了Netfilter的整体框架,主要描述了其中的实现机制。在这个机制上已经实现了很多功能,除了对基本的功能进行完善和改进外,还出
现了很多新的扩展功能。如在此架构上实现的连接跟踪机制和NAT机制,以及结合连接跟踪机制与Netfilter框架实现的Layer7扩展匹配模块等。
对此框架的了解,有助于我们更好的利用Netfilter框架实现我们的设计,鉴于自身水平有限,因此以上的分析不能保证全部正确。希望各位批评指正。
由于主要是为了描绘出整个Netfilter的框架,故对其中较细节的的内容有所忽略而未深入分析,如规则的另外一个动作
ipt_standard_target,table表注册时的初始化等,但这并不影响对整个框架的了解。至于Netfilter在链路层的实现机制此处
也并未分析,因为其实现较简单,且我们大部分是在网络层利用Netfilter架构。分析中也未涉及到用户态规则与内核态规则之间的关系,对于
iptables如何操作内核中的规则并未介绍,以后有机会再做详细分析。
发表评论
-
使用strongswan建立基于ikev2 eap-mschapv2的ipsec服务器
2017-04-17 23:14 3229sudo apt-get install strongsw ... -
使用strongswan/xl2tpd建立ipsec/l2tp服务器
2017-04-17 22:32 6185sudo apt-get install strongsw ... -
SecureFX中文件名乱码的解决
2014-08-28 03:23 3360原始贴子:https://forums.vandyke.c ... -
为Linux编译atheros ar1111(设备ID:168c:0037,AW-NB100H – AR5B225 Atheros half size)网卡驱动
2012-07-15 22:57 4629买了个zotac h61itx-a-e wifi主板,从zot ... -
PHY管理接口(MDIO)
2012-01-17 17:01 4226对吉比特以太网而言,串行通信总线称为管理数据输入输出 (MDI ... -
理解ipsec身份标识和认证选项
2012-01-11 15:42 6890This article is part of the Ide ... -
netfiletr和iptables的状态和连接跟踪机制
2012-01-11 15:38 3351Como se lleva a cabo el rastreo ... -
编译安装iw
2011-11-09 13:31 2386ubuntu安装build-essentials libnl- ... -
从ip addr add和ifconfig的区别看linux网卡ip地址的结构
2011-09-24 13:06 1696转至:http://blog.csdn.net/dog25 ... -
DLNA中的UPnP技术浅析
2011-09-22 18:39 5111说到DLNA,UPn ... -
Linux 用户态与内核态的交互——netlink 篇
2011-09-19 01:39 3540转至:http://bbs.chinaunix.net/thr ... -
netlink与rtnetlink(二)
2011-09-19 01:36 16023转至:http://blogold.chinaunix.net ... -
netlink和rtnetlink(一)
2011-09-19 01:35 5240转到:http://blogold.chinaunix.net ... -
Linux——Netlink
2011-09-19 01:24 9693转载:http://blog.csdn.net/firo_ba ... -
linux notification chains
2011-08-13 00:26 1061linux内核由各个不同的子系统构成,比如网络子系统、存储 ... -
内核中的notification chain浅析
2011-08-13 00:25 1383内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些 ... -
Linux Notification chains
2011-08-13 00:24 2859Notifier是Linux 中提供一种在内核子系统 中共 ... -
printk 使用方法
2011-08-12 22:28 9895内核通过 printk() 输出的信息具有日志级别,日志级 ... -
WEXT/mac80211/nl80211/cfg80211
2011-07-29 02:32 11271Wireless-Extensions--旧的无 ... -
fedora上wpa_supplicant上网配置
2011-07-29 01:28 35461,vi /etc/sysconfig/wpa_supplic ...
相关推荐
Netfilter_实现机制分析Netfilter_实现机制分析Netfilter_实现机制分析Netfilter_实现机制分析Netfilter_实现机制分析Netfilter_实现机制分析Netfilter_实现机制分析
Netfilter源代码分析详解 一、Netfilter/IPTables 框架简介 Netfilter/IPTables 是 Linux 防火墙机制的新一代解决方案,继承了 IPfwadm 和 IPchains 的优点,并具有良好的可扩充性。Netfilter 采用模块化设计,...
这一过程不仅实现了对数据包的过滤和修改,还允许用户和第三方软件通过Netfilter接口定制自己的网络策略。 综上所述,Netfilter机制通过精细的钩子函数管理和规则表设计,为Linux系统提供了强大的网络数据包处理...
### Linux-Netfilter & iptables 实现机制的分析及应用 #### 1. 引言 本文档旨在深入探讨Linux下的Netfilter与iptables实现机制,重点关注用户态与内核态规则之间的交互方式及其管理方法。此外,文档还讨论了如何...
在2.6.19版本的内核中,Netfilter框架的设计和实现具有代表性,本文将重点分析该版本内核中的Netfilter架构及其转发路径。 #### 二、Netfilter框架的关键组件 ##### 2.1 整体结构 Netfilter框架作用于IP层,这是...
通过以上分析,我们可以看出Linux-netfilter-conntrack机制是通过一系列复杂而精巧的设计实现高效的数据包跟踪和管理的。它不仅支持标准的TCP/UDP协议,还能通过扩展支持更多协议和服务。深入了解这些细节将有助于...
### netfilter:获取并分析底层数据包 #### 1. 简介 Netfilter是Linux内核中的一个重要子系统,它提供了强大的网络处理能力,包括数据包过滤、网络地址转换(NAT)以及连接跟踪等功能。Netfilter的核心机制是通过...
这些表的实现都是基于Netfilter的HOOK函数和表、链的机制。 ##### 3. 具体功能模块 - **数据报过滤模块**:根据预设的规则对数据报进行过滤。 - **连接跟踪模块**(Conntrack):用于跟踪TCP连接的状态。 - **网络...
论文首先分析了 Linux 2.4 内核的 Netfilter 结构在 IP 协议栈中的位置和结构,然后介绍了应用 Patch-o-matic 结构扩展 Netfilter-iptables 目标(target)选项的机制和方法。 Netfilter 是 Linux 防火墙的底层机构...
Netfilter框架的引入极大地提升了Linux内核在网络层面的安全性和灵活性,它通过精巧的设计实现了高效的数据包处理机制,同时也为开发者提供了丰富的扩展能力。无论是对于网络安全专家还是网络编程爱好者,理解...
这一步骤是通过Netfilter的钩子机制实现的,使得开发者可以在数据包到达路由器或转发到更高层协议之前对其进行操作。 ##### 1.2 `NF_HOOK`宏 `NF_HOOK`宏定义于`include/linux/netfilter.h`文件中,它是Netfilter...
面对日益复杂的网络攻击手段,netfilter作为一种灵活的安全机制,在入侵响应中扮演着重要的角色。传统的被动防御措施已经无法满足现代网络安全的需求,因此主动响应模型成为了研究的热点。 ##### 3.2 主动响应模型 ...
而ja-netfilter-all.zip文件则是一个专门针对JetBrains全家桶的增强工具,它利用了Java的javaagent机制,提供了更高级的功能定制与扩展。本文将详细介绍ja-netfilter-all的使用方法和核心知识点。 一、javaagent...
这个框架允许程序员在不修改原代码的情况下,通过插件化的机制来实现网络数据包的过滤和处理。ja-netfilter-2022.2.0.zip文件是该框架的最新版本,包含了所有必要的组件和文档,以供用户下载和使用。 在ja-...
- **网络过滤**: `ja-netfilter` 的核心在于其网络过滤机制,它可以拦截并处理Java应用程序发出的网络请求,允许或阻止特定的连接,提供了一种灵活的方式来控制网络流量。 - **动态代理**: 应用基于Java动态代理...
同时,我们也会分析文件中所涉及的关键部分及其功能。 ### Netfilter 概述 Netfilter 是 Linux 内核中的一个框架,用于处理 IP 数据包过滤、网络地址转换(NAT)以及其他相关的网络功能。它由一系列“钩子”组成,...
3. **Java代理(Proxy)**:Ja-Netfilter可能使用了Java的代理机制,创建了一个透明的代理服务器,使得应用程序无感知地通过它进行网络通信。 4. **API和库**:Ja-Netfilter可能包含一组API,供开发者在自己的Java...
Netfilter是Linux内核2.4.x版本引入的一个功能强大的网络数据包过滤和处理机制,它在IP协议栈中设置了一系列检查点(HOOKs),允许开发者编写特定的规则来处理经过的数据包。 文章首先介绍了Netfilter的基本原理,...
本文将深入探讨 Linux 内核中 netfilter 框架内的 NAT(网络地址转换)功能,并重点研究应用层网关(ALG)机制,特别是以 FTP ALG 为例进行详细分析。Netfilter 是 Linux 内核中一个强大的包过滤框架,它集成了...