安全基础:简单解析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 交通频道 作文范文 装饰材料买卖合同 交通安全演讲稿作文700字 2015入团申请书600字最新范文 点亮心灵的句子 关于感恩节英语作文300字:Thanksgiving Day 你我之间是一片海 忧伤的景泰蓝 未来学校作文900字 学会了笑着哭 你情我愿才是爱情? 拔河比赛方案 项羽作文200字 单身打工者:找对象难,我请辞 陆晓微正传【第四集】续写 秋寂--致东北军营好友 国家节日 让我印象最深的一本书作文 精灵小妹(1)作文800字 幼儿园2014元旦晚会主持稿 生活不简单,尽量简单过!人生不完美,尽量快乐活 给我个夜晚 留给昨天的明天 自信与成功作文400字 有一种无用叫有用 那一年的天使 梦游姑苏 大学生党课思想汇报600字 等待也是一种意境——读《边城》有感1000字 三木木作文450字 王蒙极富幽默感 【穿越】纵横鬼谷---栗子 最爱夜的寂寞 孰爱 念念难忘的通宵上网作文1300字 2016师德反思范文多篇 我要克隆小树800字 企业标准化项目负责人就职发言 两个月的假期 memorize 奥斯卡王尔德名言 流星般划过的梦 加工装配合同的主要内容 我印象中最深的一个人----舅舅350字 领导班子严以用权心得体会 种仙灵毗(《本草》:淫羊蕾,即仙灵毗也) 核测井室科研工作总结 不愿放下作文250字 时尚男装广告词大全 特别的年夜 你失去的,不会再回来了

Copyright © 2016 phpStudy |