热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

LINUX内核2.4.x的网络安全框架

文章标题:LINUX内核2.4.x的网络安全框架。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  1.概述
  在分析LINUX2.4.x网络安全的实现之前先简单介绍一下它里面包含的几个重要概念:netfilter、iptables、match、target、nf_sockopt_ops、网络安全功能点的实现。详细解释会在后面的分析中讲到。
  
  首先是netfilter,它定义了协议栈中的检查点和在检查点上引用的数据结构,以及在检查点上对这些结构引用的过程。iptables定义了实现网络安全功能的规则的组织以及对规则的操作。一个规则中包含零个或多个match和一个target,规则组织沿用了LINUX2.2.x中的chain,rule的概念,但是增加了table的概念,这三者的关系是:table是实现某项功能所有规则的总和,chain是在某个检查点上所引用规则的集合,rule是一个单独的规则。match在规则中用于匹配数据包中的各项参数,每个match匹配特定的参数,所以一个规则中可以有多个match,这包括系统已定义的match,也包括通过内核模块另外添加的match。target在规则中决定如何处理匹配到的数据包,因此在target中实现了具体的网络安全功能。nf_sockopt_ops是在系统调用get/setssockopt中引用的数据结构,实现用户空间对规则的添加、删除、修改、查询等动作。以上的结构在使用之前必须先注册到系统中才能被引用。
  
  LINUX2.4.x网络安全实现了包过滤,地址转换(包含了LINUX2.2.x中的地址伪装和透明代理功能并有其他扩展功能),连接跟踪(这是实现地址转换的基础,在它里面实现了对连接状态的记录和监控,与状态检测类似),Mangle(这是LINUX2.4.x新增的一个功能,它对数据包进行检查但不做禁止、丢弃或允许的判断)。实现这些功能点需要分别注册netfilter,iptables,match,target,nf_sockopt_ops的数据结构。如果实现其他新的功能,只需定义相应的结构并将它注册到系统中,并且通过用户空间的配置工具(这个配置工具也须支持新的结构)把它加入到规则中就可以了。这些结构在规则中自动被引用。
  
  2.netfilter
  netfilter定义了协议栈中的检查点和检查点上引用的数据结构以及对这些数据结构引用的过程。首先看看在检查点上引用的数据结构,如图所示:
  
 

  
图2.1 nf_hoo_ops数据结构的组织

  
  图中ns_hook_ops就是在检查点上引用的结构。每个协议栈预先定义的8个链表数组用于保存这些结构,这些链表与协议栈中的检查点一一对应。在实际的应用中,这8个链表并不一定都被使用,比如在IPV4中,只定义了5个检查点,分别对应前5个链表。nf_hook_ops结构如下:
  
  struct nf_hook_ops
  
  {
  
      struct list_head list;
  
      nf_hookfn hook;     /* 函数指针 */
  
      int pf;         /* 结构对应的协议栈号 */
  
      int hooknum;      /* 结构对应的检查点号*/
  
      int priority;     /* 结构的优先值 */
  
  };
  
  nf_register_hook函数将ns_hook_ops结构注册到这些链表上,链表的索引由结构中hooknum指定。同一链表上的结构按优先值由小到大排列。在检查点上引用这些结构时,以它们在链表上的先后顺序引用。
  
  检查点由宏NF_HOOK定义。在检查点上,函数nf_hook_slow调用函数nf_iterate遍历对应链表并调用链表上的结构ns_hook_ops中定义的函数。如果结构中的函数返回NF_ACCEPT,则继续调用下一个结构中的函数;如果结构中的函数返回NF_DROP或NF_STOLEN或NF_QUEUE,则将这个值返回给nf_hook_slow;如果结构中的函数返回NF_REPEAT,则重复调用此结构上的函数;如果到了链表上的最后一个结构,则把这个结构中函数的返回值返回给ns_hook_slow。在ns_hook_slow中判断nf_iterate的返回值,如果是NF_ACCEPT,则允许数据包通过,并将数据包传递给协议栈中的下一个函数;如果是NF_DROP,则释放数据包,协议栈流程中断;如果是NF_STOLEN,同样中断协议栈的流程,但是没有释放这个数据包;如果是NF_QUEUE,则将这个包发送到用户空间处理,同时中断协议栈的流程。
  
  检查点分布在协议栈的流程中,下图是IPV4中的检查点:
  
 

  
图2.2 IPV4中的检查点

  
  图中检查点的名称如下:
  
  检查点编号  检查点名称      检查点所在文件名
  1       NF_IP_PRE_ROUTING  ip_input.c
  2       NF_IP_LOCAL_IN    ip_input.c
  3       NF_IP_FORWARD    ip_forward.c
  4       NF_IP_POST_ROUTING  ip_output.c
  5       NF_IP_LOCAL_OUT   ip_output.c
  
  表2.1 IPV4中检查点的名称
  
  图中,ROUTE(1)处对收到的包做路由查找并判断这个包是需要转发的包还是发往本机上层的包,ROUTE(2)处查找发出包的路由。NF_IP_PRE_ROUTING处对所有传入IP层的数据包进行检查,在这之前,有关数据包的版本、长度、校验和等正确性检查已经完成。NF_IP_LOCAL_IN对发往本机上层的数据包进行检查。请注意这两个检查点与LINUX2.2.x中检查点的区别,在LINUX2.2.x没有区分发往本机上层包和需要转发的包,所以在做完地址解伪装之后又调用了一次路由查找函数,为解伪装之后的包查找路由。NF_IP_FORWARD处检查需要转发的数据包。NF_IP_POST_ROUTING处对所有向链路层传递的数据包进行检查,注意在此处数据包的路由已经确定。NF_IP_LOCAL_OUT对本机发出的包进行检查,此处的路由还没有确定,所以可以做目的地址转换。实现某个网络安全功能可能需要在多个检查点上注册相应的结构,在后面的分析中我们可以看到具体的例子。
  
  3. iptables
  iptables实现对规则的管理和访问。它里面有几个重要的数据结构ipt_entry,ipt_match,ipt_target,ipt_table,用于构造规则表。还有一个重要的函数ipt_do_table,用于遍历规则表并处理规则表上的结构。
  
  ipt_entry是规则的数据结构,如下:
  
  struct ipt_entry
  {
      struct ipt_ip ip;
      unsigned int nfcache;
      u_int16_t target_offset;  /* target在规则中的偏移 */
      u_int16_t next_offset;   /* 下一条规则的偏移 */
      unsigned int comefrom;
      struct ipt_counters counters;  /* 匹配规则的数据包的统计计数 */
      unsigned char elems[0];
  };
  
  在ipt_entry中ipt_ip是一个基本的match,它是固定的,用于匹配数据包的源地址/源端口、目的地址/目的端口、协议等。其他的match按需要添加,个数并不固定,所以在ipt_entry有一个变长的字符数组保存规则中match的指针,这些指针指向系统中注册的match。每个规则有一个target,决定数据包完全匹配规则后怎样处理这个数据包,它也是一个指向系统注册的target的指针,并且也放在前面提到的变长字符数组中。ipt_entry中的target_offset是target在规则中的偏移,偏移是从规则的起始地址到target所在位置的长度,还有一个变量next_offset指示下一条规则偏移,它其实就是本条规则的长度。
  
  前面提到在iptables中沿用了LINUX2.2.x中的chain和rule的概念,那么在ipt_entry中如何区分chain和rule的哪?
  
  我们知道chain是某个检查点上检查的规则的集合。除了默认的chain外,还可以创建新的chain。在iptables中,同一个chain里的规则是连续存放的。默认的chain的最后一条规则的target是chain的policy。用户创建的chain的最后一条规则的target的调用返回值是NF_RETURN,遍历过程将返回原来的chain。规则中的target也可以指定跳转到某个用户创建的chain上,这时它的target是ipt_stardard_target,并且这个target的verdict值大于0。如果在用户创建的chain上没有找到匹配的规则,遍历过程将返回到原来chain的下一条规则上。
  
  ipt_match用于匹配数据包的参数,如TCP数据包中的标志位,ICMP协议中的类型等,每个match所感兴趣的参数都不一样,所以一条规则可能有多个match。ipt_target决定在数据包完全匹配规则后应做什么样的处理。这两个在使用之间都必须先注册到系统的链表中才能被规则引用。对这两个数据结构不做过多分析,读者可以自行参考源代码。
  
  ipt_table是规则表的数据结构,如下:
  
  struct ipt_table
  {
      struct list_head list;
      char name[IPT_TABLE_MAXNAMELEN];
      struct ipt_replace table;      /* 用户空间传递的规则表 */
      unsigned int valid_hooks;     /* 有效的检查点置位*/
      rwlock_t lock;
      struct ipt_table_info private;   /* 规则表在内核中的存储结构 */
      struct module *me;
  };
  
  在ipt_table中,ipt_replace是用户空间配置程序传递给内核的规则表,这个规则表不能直接使用,必须先根据它里面包含的match和target的名称将match和target转换成在内核注册的match和target的指针,还有一项重要的工作是检查规则表中是否有循环,如果有循环,要给用户空间的配置程序报告错误。转换之后的规则表存储在ipt_table_info中。valid_hooks指示与这个表相关的检查点,并把相应的位置为1。一个table中可以有多个chain,chain分为系统默认的chain(与table注册的检查点对应)和用户创建的
推荐阅读
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 优化版Windows 10 LTSC 21H2企业版:适用于低内存设备
    此版本为经过优化的Windows 10 LTSC 21H2企业版,特别适合低内存配置的计算机。它基于官方版本进行了精简和性能优化,确保在资源有限的情况下依然能够稳定运行。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了如何在发布 XenApp 应用时,通过命令行参数实现启动时的参数传递。特别介绍了静态和动态参数传递的方法,并详细解释了 ICA 文件中两种参数传递方式的区别及安全检查机制。 ... [详细]
author-avatar
我不是咸鱼仔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有