3-8 Linux系统中防火墙的框架简单分析_网络冲浪

    Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。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中找到相应的位置并插入到此表中。struct list_head nf_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

时间: 2024-08-24 09:08:02

3-8 Linux系统中防火墙的框架简单分析_网络冲浪的相关文章

Linux系统中防火墙的框架分析_unix linux

Netfilter提供了一个抽象.通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统.Netfilter框架包含以下五部分: 1. 为每种网络协议(IPv4.IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数), 这些钩子函数在数据报流过协议栈的几个关键点被调用.在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架. 2. 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何

Linux系统中防火墙的框架及简单分析

Netfilter提供了一个抽象.通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统框架包含以下五部分: 1. 为每种网络协议(IPv4.IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数), 这些钩子函数在数据报流过协议栈的几个关键点被调用.在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用Netfilter框架. 2. 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给Netfilter框架时,内核能检测是否有任何模块对该协议和钩子函

如何鉴别防火墙的实际功能差异_网络冲浪

有一些问题常令用户困惑:在产品的功能上,各个厂商的描述十分雷同,一些"后起之秀"与知名品牌极其相似.面对这种情况,该如何鉴别? 描述得十分类似的产品,即使是同一个功能,在具体实现上.在可用性和易用性上,个体差异地十分明显. 一.网络层的访问控制 所有防火墙都必须具备此项功能,否则就不能称其为防火墙.当然,大多数的路由器也可以通过自身的ACL来实现此功能. 1.规则编辑 对网络层的访问控制主要表现在防火墙的规则编辑上,我们一定要考察:对网络层的访问控制是否可以通过规则表现出来?访问控制的

原生防火墙 网络安全防御新趋势_网络冲浪

作者: 淮河水手 出处: 电脑报 面对不断"更新"的病毒和攻击技术,你难道不想了解新的安全技术,装备新的安全产品,以保护自己的爱机.绝密的资料吗?不要担心,"安全新秀"将会为你介绍最新的安全技术.资讯,最新的安全产品,让你永远走在安全的前沿. 对于个人用户来说,主要是依靠基于操作系统的软件网络防火墙(如天网.瑞星等)来保护自己的系统安全,免受黑客和病毒的攻击.但这种传统的安全防御方式有很多令人不满意的地方(如占用过多的系统资源.系统速度变慢.效果不理想等).最近,N

系统安全:谈Windows 服务备份_网络冲浪

    在局域网环境中,网管往往非常重视对Windows服务器硬盘中的用户数据文件的备份,而忽视了对Windows系统本身提供的各种服务的状态信息和服务数据的备份,如IIS服务.DHCP服务.DNS服务等,这些Windows服务在局域网中往往起着非常重要的作用,如使用IIS架设企业内部网站,使用DHCP服务为局域网用户统一分配TCP/IP配置信息等,一旦这些服务出现问题,就会严重影响用户的正常办公.因此网管也要重视对Windows服务的备份,一旦某些Windows服务出现问题,可以立即使用备份的

世界顶级防火墙Look n Stop中文版_网络冲浪

Look n Stop 被誉为世界顶级防火墙!与同类产品相比具有最为突出的强劲功能以及与众不同的特点,不仅功能评测在知名防火墙中是最强的!而且软件大小只有区区600多k十分小巧, 占内存非常小,可以监控dll,更具强大的御防黑客攻击能力!! 安装时几点需要注意到的事情: 1.提示没有经过微软的安全监测,这一点容易理解,微软当然希望所有的人使用它自己开发的软件产品,对于出现的提示,我想经常安装非微软软件产品的朋友都会遇上这种情况. 2.重新启动电脑进入桌面时,没有弹出一个询问你是否需要下载多国语言

窃取QQ中社会工程学的应用实例_网络冲浪

当我们用尽口令攻击.溢出攻击.脚本攻击等手段还是一无所获时,你是否想到还可以利用社会工程学的知识进行渗透呢?关于社会工程学的定义,我的理解是:社会工程学是关于建立理论通过自然的,社会的和制度上的途径并特别强调根据现实的双向计划和设计经验来一步接一步的解决各种社会问题.说的通俗点就利用人性的弱点.结合心理学知识来获得目标系统的敏感信息.我们可以伪装成工作人员来接近目标系统,通过收集一些个人信息来判断系统密码的大概内容.这种方法和传统方法还是有一些区别的,但是它的作用绝对不比传统方法的效率低.这里我

深入解析Linux系统中的SELinux访问控制功能

  SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件.SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到. SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制

在 Linux 系统中安装Load Generator ,并在windows 调用

原文地址:http://www.blogjava.net/qileilove/archive/2012/03/14/371861.html 由于公司需要测试系统的最大用户承受能力,所以需要学习使用loadrunner.在安装的时候碰到了不少问题,所以写下此文章总结遇到的问题以及解决方案,希望能帮到大家.也希望大家转载注明出处. Winsows 的Loadrunner 安装就不多讲了,这个太容易了. 以下是Linux 中安装 Load Generator 说明: Linux 系统版本:CentOS