安全基础:简单解析Linux系统防火墙框架


Linux系统中的Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统,框架包含以下五部分:

1. 为每种网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数), 这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用Netfilter框架。

2. 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给Netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示Netfilter将该数据包传入用户空间的队列。

3 .那些排队的数据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。

4. 任何在IP层要被抛弃的IP数据包在真正抛弃之前都要进行检查。例如允许模块检查IP-Spoofed包(被路由抛弃)。

5.IP层的五个HOOK点的位置如下所示:

(1)NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验 和等检测),源地址转换在此点进行;IP_Input.c中IP_Rcv调用;

(2)NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行,IP_local_deliver中调用;

(3)NF_IP_FORWARD:要转发的包通过此检测点,FORWORD包过滤在此点进行;

(4)NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的目的地址转换功能(包括地址伪装)在此点进行;

(5)NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。

这些点是已经在内核中定义好的,内核模块能够注册在这些HOOK点进行的处理,可使用nf_register_hook函数指定。在数据报经过这些钩子函数时被调用,从而模块可以修改这些数据报,并向Netfilter返回如下值:

NF_ACCEPT 继续正常传输数据报
NF_DROP 丢弃该数据报,不再传输
NF_STOLEN 模块接管该数据报,不要继续传输该数据报
NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
NF_REPEAT 再次调用该钩子函数

一个基于Netfilter框架的、称为IPtables的数据报选择系统在Linux2.4内核中被应用,其实它就是IPchains的后继工具,但却有更强的可扩展性。内核模块可以注册一个新的规则表(table),并要求数据报流经指定的规则表。这种数据报选择用于实现数据报过滤(filter表),网络地址转换(Nat表)及数据报处理(Mangle表)。 Linux2.4内核提供的这三种数据报处理功能都基于Netfilter的钩子函数和IP表。它们是独立的模块,相互之间是独立的。它们都完美的集成到由Netfileter提供的框架中。

包过滤

Filter表格不会对数据报进行修改,而只对数据报进行过滤。IPtables优于IPchains的一个方面就是它更为小巧和快速。它是通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入Netfilter框架的。因此对于任何一个数 报只有一个地方对其进行过滤。这相对IPchains来说是一个巨大的改进,因为在IPchains中一个被转发的数据报会遍历三条链。

NAT

NAT表格监听三个Netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。 NF_IP_PRE_ROUTING实现对需要转发的数据报的源地址进行地址转换而NF_IP_POST_ROUTING则对需要转发的数据包的目的地址进行地址转换。对于本地数据报的目的地址的转换则由NF_IP_LOCAL_OUT来实现。NAT表格不同于filter表格,因为只有新连接的第一个数据报将遍历表格,而随后的数据报将根据第一个数据报的结果进行同样的转换处理。NAT表格被用在源NAT、目的NAT,伪装(其是源NAT的一个特例)及透明代理(其是目的NAT的一个特例)。

数据报处理(Packet Mangling)

Mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用 mangle表,可以实现对数据报的修改或给数据报附上一些带外数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。

源码分析

如果我们想加入自己的代码,便要用nf_register_hook函数,其函数原型为:

int nf_register_hook(struct nf_hook_ops *reg) 
struct nf_hook_ops 
{ 
struct list_head list; 
/* User fills in from here down. */ 
nf_hookfn *hook; 
int pf; 
int hooknum; 
/* Hooks are ordered in ascending priority. */ 
int priority; 
};

我们的工作便是生成一个struct nf_hook_ops结构的实例,并用nf_register_hook将其HOOK上。其中list项我们总要初始化为{NULL,NULL};由于一般在IP层工作,pf总是PF_INET;hooknum就是我们选择的HOOK点;一个HOOK点可能挂多个处理函数,谁先谁后,便要看优先级,即priority的指定了。Netfilter_IPv4.h中用一个枚举类型指定了内置的处理函数的优先级:

enum nf_IP_hook_priorities { 
NF_IP_PRI_FIRST = INT_MIN, 
NF_IP_PRI_CONNTRACK = -200, 
NF_IP_PRI_MANGLE = -150, 
NF_IP_PRI_NAT_DST = -100, 
NF_IP_PRI_FILTER = 0, 
NF_IP_PRI_NAT_SRC = 100, 
NF_IP_PRI_LAST = INT_MAX, 
};

Hook是提供的处理函数,也就是我们的主要工作,其原型为:

unsigned int nf_hookfn(unsigned int hooknum, 
struct sk_buff **skb, 
const struct net_device *in, 
const struct net_device *out, 
int (*okfn)(struct sk_buff *));

它的五个参数将由NFHOOK宏传进去。nf_register_hook根据reg中注册的协议簇类型和优先级在nf_hooks中找到相应的位置并插入到此表中。_hooks[NPROTO][NF_MAX_HOOKS]在Netfilter初始化时(Netfilter_init/Netfilter.c,而它在sock_init时调用)已经初始为一个空表。

例如IPtable在初始化时(init/IPtable_filter.c)调用nf_register_hook注册他的hook函数。

static struct nf_hook_ops IPt_ops[] 
= { { { NULL, NULL }, IPt_hook, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_FILTER }, 
{ { NULL, NULL }, IPt_hook, PF_INET, NF_IP_FORWARD, NF_IP_PRI_FILTER }, 
{ { NULL, NULL }, IPt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT, 
NF_IP_PRI_FILTER } 
};

 
mangle在init/IPtable_mangle.c中注册它自己的hook函数。 

static struct nf_hook_ops IPt_ops[] 
= { { { NULL, NULL }, IPt_hook, PF_INET, NF_IP_PRE_ROUTING, NF_IP_PRI_MANGLE }, 
{ { NULL, NULL }, IPt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT, 
{NF_IP_PRI_MANGLE } 
};

NAT在init/IP_nat_standalone.c中注册它自己的hook函数

/*包过滤前,更改目的地址*/
static struct nf_hook_ops IP_nat_in_ops

本文作者:



相关阅读:
搜索引擎核心技术(PHP编程思路) --[1]
SQL 提权 常用命令
巧用Recent模块加固Linux安全
xp_cmdshell开启与关闭
IE8 css overflow:hidden不起作用
JSP application(return String)用法详例
概述Oracle中的数据库名
XHTML教程一
初学者接触HTML了解一些HTML标记(3)
如何使用SQL 事件探查器?
初探SQL Server 2008综合数据可编程性
系统终止操作该如何解决?
认识并使用PHP超级全局变量
用CSS来控制网页背景
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 一杯清水 小学五年级作文600字:花儿的闺房 中秋美文欣赏 杨柳清明 母亲生日短信 就这样被你感动作文700字 劝我—— 真可惜350字 2016地震局争创服务品牌活动方案 描写记忆的段落 2015农村年春节文艺联欢会主持词 走近了才知道 外表与内在 我的家在苏州作文700字 难忘的奥运暑假 小猪变形记 冬之未央 我和椰子的故事 2015综治办主任竞职演讲稿 初二学生写景作文600字 小学四年级作文350字:我班的小混混 诸葛亮扇子背后的故事,羽扇背后隐藏的大智慧 市供电公司职业道德建设先进集体事迹材料 银行业务员工作总结2013 2012电视台年终总结 高二英语寒假作业答案 夕阳下 法医学鉴定书 有关过小年作文250字 魔鬼与友谊(2)作文200字 2015年12 相爱不容易 小学六年级作文550字:叶之韵 小学六年级作文550字:谁是瓜王 竹林幽梦 支玉恒教学实录——《天游峰的扫路人》 周立波爱情经典语录 于分手一周年纪念日致心中最爱的你... 移民开发局创先争优活动实施方案 保护环境你我他作文550字 所得税财政体制促进地方税收发展论文 庆祝“六·一”儿童节致辞 转变思维方能创造辉煌 幼儿园大班优秀评语 穿越时空的少女(4)作文1800字 桂林阳朔记 “真情体验”课本剧专场演出主持词 女孩为什么要努力 前方作文100字 被爱荒芜的角落【小小说】

Copyright © 2016 phpStudy |