万一这一个regex的光阴复杂度过高,基于regex的WAF仍然主流

  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/7609137.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com
  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/7609137.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

tcpdump和ethereal都是大名鼎鼎的开源网络数据包捕获和剖析软件,我们对自然都已经用过,其中Ethereal是经过capture

  WAF(Web Application Firewall,
Web防火墙)的落实有多种一手,基于regex(Regular
Expression,正则表达式),然后编译成一个大状态机是时下主流的法子。当然,阿拉云安全的主架构师讲了个ppt,直接说regex来做防火墙有不创立的地点,理由是应用regex做防火墙,其总计复杂度最高的这一个regex是百分之百连串的短板,倘若这些regex的年华复杂度过高,攻击者完全可以采用那点攻击WAF达到DDOS的职能。从而,他认为regex迟早应该剥离WAF的天地,而用人工智能白名单的新一代WAF才是将来WAF的主流。这位仁兄说的是有道理的,正则表达式做的WAF异常复杂,运算强度高,这么些瓶颈业内早就熟知,将来应当属于人工智能。接下去的极度一段时间,我也真正需要思想思考下一代的WAF是现实性怎么更好的三结合人工智能。话说回来,毕竟在可预见的年华里,基于regex的WAF依旧主流。吐槽一下,正则表明式真的是一个自家不了解该说是天赋如故该说是垃圾的翻译,让自己每当写到三遍就想吐槽五遍。

  WAF(Web Application Firewall,
Web防火墙)的兑现有多种手腕,基于regex(Regular
Expression,正则表明式),然后编译成一个大状态机是当下主流的办法。当然,阿拉云安全的主架构师讲了个ppt,直接说regex来做防火墙有不成立的地点,理由是采纳regex做防火墙,其统计复杂度最高的那么些regex是全部体系的短板,假若这多少个regex的大运复杂度过高,攻击者完全可以运用这点攻击WAF达到DDOS的功效。从而,他以为regex迟早应该退出WAF的小圈子,而用人工智能白名单的新一代WAF才是前景WAF的主流。这位仁兄说的是有道理的,正则表明式做的WAF卓殊复杂,运算强度高,那么些瓶颈业内早就熟悉,将来理应属于人工智能。接下去的异常一段时间,我也的确需要思想思考下一代的WAF是有血有肉哪些更好的咬合人工智能。话说回来,毕竟在可预见的年华里,基于regex的WAF仍旧主流。吐槽一下,正则表明式真的是一个自己不知底该说是天才仍然该说是废品的翻译,让自家每当写到三遍就想吐槽五遍。

filter设置捕获规则,display

  话题有些扯远了,越是明日音信如此膨胀,WAF越是会偏向于用微机来缓解而非嵌入式设备,但和自身要涉及的话题牵涉到的都是包过滤。在音讯膨胀的前几日,百M甚至千M已经不可能满足大家的急需,主干网上万M交流机用来满意大数据量的交换。速度太快,我们其实没辙完全选用CPU来处理这一体,CPU只可以够用作终点配置等效用,而对此万M网络本身的支配应利用ASIC(Application
Specific Integrated
Circuit,专用集成电路),也就是为此拔取特别计划一个芯片,而非用于多种场子的通用芯片。可是ASIC不可以升级,若要升级只好替换。FPGA能够取代这么些,同时满意ASIC的需要和擢升的需要,最近高端的FPGA的主时钟可以高速,但当然也挺昂贵。

  话题有些扯远了,越是明日新闻如此膨胀,WAF越是会偏向于用统计机来化解而非嵌入式设备,但和我要涉及的话题牵涉到的都是包过滤。在音信膨胀的前日,百M甚至千M已经不可以满意我们的需要,主干网上万M交流机用来知足大数据量的置换。速度太快,我们实际无法完全使用CPU来拍卖这总体,CPU只能视作终点配置等效用,而对于万M网络本身的决定应利用ASIC(Application
Specific Integrated
Circuit,专用集成电路),也就是为此拔取特别规划一个芯片,而非用于多种场所的通用芯片。不过ASIC不能升级,若要升级只好替换。FPGA可以代表这多少个,同时知足ASIC的要求和升级的要求,目前高端的FPGA的主时钟可以急忙,但当然也挺昂贵。

filter设置呈现规则,捕获规则和出示规则的语法是例外的,其中抓获规则语法类似tcpdump的规律规则语法。这里关键通过例子简要表明下咋样设置

  想起大约十年从前,我们运用FPGA处理NGN信令,涉及到网络包的过滤、总结等。当时,我们对于包的过滤是半定死的,比如UDP依然TCP、端口需要不需要过滤、即使急需端口过滤端口多少、IP需要补需要过滤、如需要IP过滤IP怎么样过滤,如此设计是因为对此当下的利用来说也曾经够用。

  想起大约十年往日,大家接纳FPGA处理NGN信令,涉及到网络包的过滤、总结等。当时,我们对此包的过滤是半定死的,比如UDP仍旧TCP、端口需要不需要过滤、倘使急需端口过滤端口多少、IP需要补需要过滤、如需要IP过滤IP怎么样过滤,如此设计是因为对此当下的运用来说也早已够用。

其tcpdump和ethereal中的过滤器,对IPv6数据包举行捕获。

  假若熟知抓包工具,比如tcpdump,会想到日常的时候大家对于2~4层的抓包的确不会想WAF这样动辄regex作为判断标准,而是一堆基于固定地点(比如对于UDP包,其端口号、IP地址等在包中的偏移都是定点的)的数值等式或不等式作为bool值连成的bool表达式。大家就以tcpdump命令的参数来注解,比如tcpdump
tcp and dst host 192.168.218.1 and src port 22,其中tcp、 dst host
192.168.1.1、src port
23就是多少个例外的bool值。倘使熟谙tcpdump和TCP/IP,对照资料,我们得以另行修改上述规则,把tcp、dst
host、src
port解析为偏移,从而整个规则写作偏移的形式。在大部分的运用下,一条过滤里面这么独立的bool值不超过8个。

  假诺精晓抓包工具,比如tcpdump,会想到经常的时候大家对此2~4层的抓包的确不会想WAF这样动辄regex作为判断标准,而是一堆基于固定地方(比如对于UDP包,其端口号、IP地址等在包中的偏移都是原则性的)的数值等式或不等式作为bool值连成的bool表达式。我们就以tcpdump命令的参数来表明,比如tcpdump
tcp and dst host 192.168.218.1 and src port 22,其中tcp、 dst host
192.168.1.1、src port
23就是三个例外的bool值。假如熟稔tcpdump和TCP/IP,对照资料,我们能够重复修改上述规则,把tcp、dst
host、src
port解析为偏移,从而整个规则写作偏移的款型。在多数的运用下,一条过滤里面这么独立的bool值不超越8个。

  1. 遵照主机的破获

  硬件的裨益是全速、直接,软件的补益是高扩张性,我们一齐可以构成双方。用上位机(可能是控制的微机,也恐怕只是里面的一个嵌入式CPU)把tcp
and dst host 192.168.218.1 and src port
22如此便于阅读的东西翻译为偏移量、bool值这样的事物,并且付诸各类bool值统计中偏移量从小到大排列,假设基础的bool值统计只有最多8条这样的气象,那么实际上只需要FPGA内部做一个8位地址1位输出的RAM(能够安装,所以采取RAM而非ROM)即256bits的蕴藏的RAM,上位机把RAM里面储存的具备值算出来并传给FPGA。

  硬件的好处是快速、直接,软件的利益是高增添性,我们全然可以组合双方。用上位机(可能是控制的微机,也说不定只是里面的一个嵌入式CPU)把tcp
and dst host 192.168.218.1 and src port
22这样便于阅读的东西翻译为偏移量、bool值这样的事物,并且付诸各种bool值总计中偏移量从小到大排列,如若基础的bool值统计只有最多8条那样的情况,那么实际上只需要FPGA内部做一个8位地址1位输出的RAM(可以安装,所以采纳RAM而非ROM)即256bits的存储的RAM,上位机把RAM里面储存的所有值算出来并传给FPGA。

host host        #host可以是主机名或IP地址

  比如前边,tcp and dst host
192.168.218.1 and src port
22,3个bool值映射到1个布尔值,其实只需要2^3=8bits仓储,8个bits分别为0,0,0,0,0,0,0,1,这就是RAM存储的内容。

  比如事先,tcp and dst host
192.168.218.1 and src port
22,3个bool值映射到1个布尔值,其实只需要2^3=8bits囤积,8个bits分别为0,0,0,0,0,0,0,1,那就是RAM存储的情节。

src host host        #host作为数据包的源地址

  甚至于,软件仍是可以够比那么些越发强有力,能够考虑合并多条规则,切割多条规则,其实多条规则的五个bool表明式最终也由此and或者or来连接的,末了可能还有一个not,从总体来看究竟仍然一条规则。

  甚至于,软件仍是可以比那些越发有力,可以考虑合并多条规则,切割多条规则,其实多条规则的多少个bool表明式最后也经过and或者or来连续的,最终可能还有一个not,从总体来看究竟仍旧一条规则。

dst host host        #host作为数据包的目的地址

  用RAM来统计bool表明式虽说不可以通用,因为其储存伴随着bool表明式的长短是乘方级的扩大,但概括、快。设计此类电路,简单就是美,对于电路的概括来说是必不可缺的。并且,可以可以如此设置多条规则,但每条规则基本是单身工作。

  用RAM来测算bool表明式虽说无法通用,因为其储存伴随着bool表明式的尺寸是乘方级的恢宏,但简单、快。设计此类电路,简单就是美,对于电路的归咎来说是非同小可的。并且,可以可以这么设置多条规则,但每条规则基本是独立工作。

$tcpdump -t -vv -n -i eth0 -s 512 host 1337::1

  随着FPGA收包的过程,依次匹配规则中的偏移量,总括出每个bool值,从而最后拼出查RAM的地方,从而查出该包是通过或者拦截。

  随着FPGA收包的进程,依次匹配规则中的偏移量,统计出每个bool值,从而最终拼出查RAM的地方,从而查出该包是透过或者拦截。

  1. 依照端口号

  我早就考虑过用逆波兰式去总计,但对于这种场馆似乎有广大的不便宜,倒是RAM简单暴力直接。那也许会问,怎样过滤规则过于复杂了如何做,那就间接考虑不协理,任何产品都有一个企划原则,不能无条件的满意所有人的要求。

  我已经考虑过用逆波兰式去总括,但对于这种场地似乎有许多的不便利,倒是RAM简单暴力直接。这可能会问,怎么着过滤规则过于复杂了咋办,这就一贯考虑不辅助,任何产品都有一个计划标准,不容许无条件的知足所有人的需求。

port port        #抓获端口号为80的数据包,不管源或目标

src port port        #源端口80

dst port port        #目标端口80

  1. 基于网段

net 192.168

src net 192.168

dst net 192.168

  1. 据悉协议

ether proto

ip proto tcp

tcp

udp

ip proto udp

  1. 依照字节偏移

语法: proto[offset]

ip[8] : TTL字段

ip[9]: IP头中的协议字段

所以,要捕获IPv6的数据包,可以设置以下简单的过滤规则:

1) proto ipv6

$tcpdump -t -vv -n -i eth0 -s 512 proto ipv6

2) ether proto 0x86dd

抓获封装在IPv4中的IPv6隧道数据包,则:

ip[9]=41

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1501641

相关文章