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

Linux防火墙扩展技术与入侵检测实现

按照防火墙对内外来往的数据的处理方法,防火墙可以分为包过滤防火墙和应用层防火墙,包过滤防火墙工作在网络层,它只是检测包的协议头对数据包进行裁决,它运行速度快但无法对高层的协议内容进行检查,应用层防火墙则可以对高层数据进行

按照防火墙对内外来往的数据的处理方法,防火墙可以分为包过滤防火墙和应用层防火墙,包过滤防火墙工作在网络层,它只是检测包的协议头对数据包进行裁决,它运行速度快但无法对高层的协议内容进行检查,应用层防火墙则可以对高层数据进行转发和过滤并强制身份验证,但对不同的服务需要提供代理应用程序并且建立了网络瓶颈;并且将包过滤技术和多种应用技术融合到一起,构成复合型防火墙是目前国内防火墙产品的一个特点,也是防火墙今后发展的主流技术。

鉴于在防火墙中整合数据包检测功能是一种良好的解决方法,它可以弥补现有防火墙的缺点并且具有像入侵检测系统一样的检测功能,本文将介绍基于Linux netfilter/iptables架构实现机制和扩展技术,在此基础上提出了扩展匹配选项实现防火墙的入侵检测功能,扩充后的防火墙可以像Snort一样具有入侵检测功能,并且可将Snort规则转化为防火墙规则实现规则集的扩充。

1 Linux防火墙的扩展netfilter/iptables的技术

Linux中防火墙Netfilter/Iptables系统主要包括两个基本组件 :定义在内核空间中的通用框架Net filter和数据包选择系统(Packet Selection).其中后者又由两部分构成:在Net filter框架上定义的数据结构“IP表”(IP Tables)和在用户空间实现的应用程序iptables.具体防火墙工作流程见[1][2]。

由于Net filter架构的加入,可以通过简单的内核模块化来实现新功能的扩展,在现有的Netfilter/Iptables中可以通过两种方式对现有的防火墙进行扩充,一种是扩展Net filter通过编写相关内核模块调用nf_register_hook()直接在相关的钩子上注册从而获得新特性,一种是扩展IP表通过编写相关的匹配标准和目标来实现新特性;扩展IP表方式是对现有表的匹配规则的扩充与具体表无关。扩展IP表需要编写内核和用户两方的代码,内核模块提供了实际的数据包匹配规则代码,用户方代码提供了IPTABLE 新的命令行选项的共享库。

2 Linux防火墙入侵检测扩展匹配设计

目前入侵检测系统普遍采用精确的模式匹配算法,如Snort采用基于规则的方式对数据包进行规则匹配来检测多种不同的入侵行为和探测活动,这种方式简单而有效,因此可以借鉴这种思想在防火墙的匹配选项中加入匹配选项来检测数据包中的内容,由于扩展IP表具有很好地灵活性,为此可以选用这种方式扩充匹配标准来实现入侵检测模块。

这种方式需要编写内核和用户空间代码,Netfilter/Iptables的标准化提供了两方使用的重要数据结构,在实现这两部分代码时主要是填充相应的数据结构内容然后将它们注册从而扩展功能。

2.1 内核模块数据结构

新的MATCH功能可作为一个独立的模块,为了能使新模块能被别的模块使用,可以使用iptable提供的ipt-register-match()将该模块进行注册,新的MATCH模块的核心是ipt-match结构,它将作为ipt-register-match()的参数注册到MATCH链表中备用从而增加新的规则匹配选项。

Struct ipt_match
{struct list_head list;一般设定为{NULL,NULL},由核心使用
const char name[];MTACH功能的名称,该名称必须与模块名相匹配
int (*match)();一个指向MTACH功能函数的指针,返回非0表示匹配
int (*check entry)();一个指向检查规则规范的指针,如果返回0,规则不会加入iptables
void (*destroy)(); 当一个使用该MATCH的入口被删除时,该函数调用以释放所占资源
struct module me 是否是模块的定义,是模块设置为THIS_MODULE 否则NULL}

在该数据结构中重要的是match ,check entry 函数,MATCH函数将实现接收从底层传来的数据包,检查数据包实现匹配功能,如果数据包与所定义的规则相同那么返回TRUE,如果不成功返回FALSE并且可以设置参数表示数据包可以被立即被丢弃。Check entry函数指向一个检查规则规范的指针,如果返回0表明这条规则不能从用户空间接受。

2.2用户空间数据结构

在内核中加入相关的内核模块选项后,为了在用户空间使用iptables软件提供相关的规则必须为该软件提供相关的命令行选项,为了使各个扩展模块使用一个版本的iptables软件而不必编写相关扩展的特定软件版本,采用共享库可以解决该问题,共享库应该具有-init()功能,它的功能和内核模块功能相似,在装载时被自动调用,该功能根据添加的新MATCH和新TARGET不同分别调用register-match()或register-target(),共享库可以提供初始化数据结构和提供相关选项的功能。

编写共享库中使用的重要数据结构是iptables_match,它作为参数传递给register-match()注册相关的命令行匹配选项让iptables识别该新匹配。

Struct iptables_match
{struct iptables_match *next;用于形成一个MATCH列表的指针,初始化为NULL
ipt_chainlabel name; MATCH功能的名字,
必须与库函数名相同便于主程序根据MATCH名加载相应的动态连接库
const char *version;版本信息通常被设置IPTABLES_version宏
size_t size;该MATCH的数据大小
size_t userspacesize;由于内核可能修改某些域,
在这里填写被改变数据区大小,它一般和size大小同
void (*help)(void);打印帮助选项大纲
void (*init)();初始化ipt-entry-match结构
int (*parse)();扫描并接收本MATCH的命令行参数,正确接受返回非0
void (*final_check)();检查是否强制选项(如--ids)被描述,如果不正确退出
void (*print)();查询当前表中的规则时,显示使用了当前match规则的额外信息
void (*save)();PARSE的反转,被iptable-save调用再生match的命令行参数
const struct option *extra_opts;NULL结尾的参数列表,提供命令行其余选项
/*以下参数由iptables内部使用,用户不必填写*/
Unsigned int option_offset;
Struct ipt_entry_match *m;
Unsigned int mflags;
Unsigned int used;
}

2.3 入侵检测模块的实现

本文介绍的功能扩展主要是通过IPTABLE命令向防火墙“IP表”添加字符串匹配规则和数据包内容相匹配从而实现对数据包的检测,在内核中需要添加一个ids检测匹配模块,在用户空间命令行上需要提供一个 “iptables -m ids ?ids “匹配内容””的选项。

在内核模块中主要是实现MATCH指针函数,在该函数中使用了字符串的模式匹配算法用于检测数据包的内容。模式匹配是指在文本Text= tlt2t3...tn中检索子串Pat=P1 P2...pn(模式)的所有出现,著名的匹配算法有BF算法、KMP算法、BM算法及一些改进算法,基于BM算法的BMH算法 被证明是一种快速、高效的算法,于是在设计时采用该算法。

BMH算法于1980年Horspool提出的,该算法在匹配的过程中模式从左向右进行,但字符的比较从右向左进行,在发现不匹配时,算法根据预先计算好的skip数组将模式右移,BMH算法在最坏的情况下复杂度为O(NM),在一般情况下比BM有更好的性能,它只使用一个数组,简化了初始化过程.以下是在match函数中使用的BMH算法:

Char *ids_match
(char *pattern, char *text, int pattern_len, int text_len)
{
int k, right_end,j, i,*skip; 
K = right_end = pattern _len-1;
for (i = 0; i <1024; i++) skip[i] = pattern_len;//初始化skip数组 
for (i = 0; pattern [i]; i++) skip[pattern [i]] = k - i; //对skip数组进行修正
While (right_end For (i = 0; i If (i == pattern _len) {
return text+(right_end - k);//返回text匹配的开始处
}
right_end = right_end + skip[text [right_end]];
//模式向右移skip[text [right_end]]位
}
Return NULL;
}

检测功能主要由match(const struct sk_buff *skb,const struct net_device *in, const struct net_device *out, const void *match info, int offset, const void *hdr,u_int16_t datalen,int *hotdrop)函数实现,该函数从缓冲区skb读取网络数据包,使用match info接受来自用户空间的匹配内容,从skb中计算出数据包的大小tlen,从match info中获取匹配内容的大小mlen,如果数据包内容为空或mlen>tlen则返回0不能进行比较;否则将网络数据包内容和大小tlen、match info中数据及大小mlen作为参数调用ids_match进行匹配,然后返回匹配结果。

填充用户空间的数据结构时,要保证name与核心对应的Match名相同,并且为了提供命令行附加选项需要填充extra_opts数据结构为{"ids",1,0,1},它表示ids带参数值,如果出现“—ids “匹配值””就会返回’1’用于parse()的参数来对附加信息进行处理如检查附加选项中是否有非(!)号存在,从命令行解析得到匹配内容并将其填充到传入到内核模块的数据结构中。

2.4 IPTABLE补丁的机制

在将用户空间和内核空间代码编写完成后,可以直接修改源码并编译安装,为了标准化和方便,NETFILTER/IPTABLES提供了扩展内核和用户空间的补丁程序:用于内核补丁的patch-o-iptables和在iptables源码下的extensions目录用于iptables程序本身补丁。

在patch-o-iptables中提供了一个“runme”脚本来为核心打补丁,按功能需要的文件有五部分 :主程序文件、内核配置文件补丁、内核配置文件帮助补丁、runme脚本显示帮助信息、内核make file文件补丁。iptables本身的扩展稍微简单一些,那就是在extensions目录下增加一个libipt_ids.c的文件,然后在本子目录的Make file的PF_EXT_SLIB宏中附加一个ids字符串。

通过补丁或将代码添加进内核后需重新编译内核添加相应的功能模块,在用户空间也必须重新编译iptables以便提供新的功能选项。

2.5 Snort规则转为IPTABLES规则

添加好字符匹配模块后,就可以通过IPTABLES定义相应的字符匹配规则从而实现

推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
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社区 版权所有