pflua:用Lua编写的高性能网络包过滤工具箱

发表于2014-09-05 09:283441次阅读| 来源优快云7 条评论| 作者伍昆

allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.youkuaiyun.com%2Farticle%2F2014-09-05%2F2821568-pflua&type=3&count=&appkey=&title=Pflua%E6%98%AF%E4%B8%80%E6%AC%BE%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84%E5%8C%85%E8%BF%87%E6%BB%A4%E5%B7%A5%E5%85%B7%EF%BC%8C%E7%94%A8Lua%E7%BC%96%E5%86%99%EF%BC%8C%E4%B8%8D%E5%90%8C%E4%BA%8E%E5%85%B6%E5%AE%83%E5%8C%85%E8%BF%87%E6%BB%A4%E5%B7%A5%E5%85%B7%EF%BC%8CPflua%E4%BD%BF%E7%94%A8%E4%BA%86libpcap%E5%BA%93%E6%9D%A5%E7%BC%96%E8%AF%91pflang%EF%BC%8C%E7%BC%96%E8%AF%91%E5%90%8E%E7%9A%84%E5%AD%97%E8%8A%82%E7%A0%81%E5%8F%AF%E8%BF%90%E8%A1%8C%E4%BA%8E%E5%86%85%E6%A0%B8%E3%80%82%E8%AF%A5%E9%A1%B9%E7%9B%AE%E6%89%98%E7%AE%A1%E5%9C%A8GitHub%E4%B8%8A%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1410079522204" width="22" height="16"> 摘要:Pflua是一款高性能的包过滤工具,用Lua编写,不同于其它包过滤工具,Pflua使用了libpcap库来编译pflang,编译后的字节码可运行于内核。该项目托管在GitHub上。

Pflua是一款高性能的包过滤工具,用Lua编写;实现了libpcap的包过滤语言,我们简称为pflang。不同于其它包过滤工具,Pflua使用了libpcap库来编译pflang,编译后的字节码可运行于内核。该项目托管在GitHub上。

为什么选择Lua?

1.  以LuaJIT作为编译器。LuaJIT是一款适时制追踪编译器。追踪在包过滤场合是非常恰当的战略,对比其它任何静态的编译技术能获得更好的性能。

2.  使用了Snabb Switch 。SnabbSwith是一个开源的网络软件,主要是为了帮助用户便捷地创建和部署大规模化网络,SnabbSwith也是采用Lua编写的。与SnabbSwith的整合,能构成一个高性能的过滤操作环境。

实现

Pflua把pflang语句编译成Lua源码,在运行时能被优化为本地机器码。在Pflua中有两种编译管道。

1.  自定义分析,这是一种非常传统的做法,能生成pflang过滤语句的高级AST。例如,如果我们采用该编译管道来编译Pflang语句ip或ip6,得到的Lua源码如下:

[js]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. return function(P,length)  
  2.    if not (length >= 14) then return false end  
  3.    do  
  4.       local v1 = ffi.cast("uint16_t*", P+12)[0]  
  5.       if v1 == 8 then return true end  
  6.       do  
  7.          do return v1 == 56710 end  
  8.       end  
  9.    end  
  10. end  

2.  Berkeley 包过滤虚拟机。Pflua能够载入libpcap库,并且利用它来把pflang语句编译成BPF(Berkeley Packet Filter)。不论你是使用原生的BPF还是pflang语句,BPF都会直接被编译成Lua源码。如果我们采用该编译管道来编译Pflang语句ip或ip6,得到的Lua源码如下:

[js]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. return function (P, length)  
  2.    local A = 0  
  3.    if 14 > length then return 0 end  
  4.    A = bit.bor(bit.lshift(P[12], 8), P[12+1])  
  5.    if (A==2048) then goto L2 end  
  6.    if not (A==34525) then goto L3 end  
  7.    ::L2::  
  8.    do return 65535 end  
  9.    ::L3::  
  10.    do return 0 end  
  11.    error("end of bpf")  
  12. end  

性能比较

经与LuaJIT的强强联合,Pflua的表现令人满意:


这是一个摹拟的两机之间ping泛滥测试,图中不同pflang执行方式的说明如下:

  1. libpcap:libpcap解释的用户空间(user-space)BPF。
  2. linux-bpf:发布于2011年旧d的Linux内核空间(kernel-space)BPF编译器。我们把它的库调整为一个可载入的用户空间模块。
  3. linux-ebpf:发布于2014年新的Linux内核空间BPF编译器,相应调整为用户空间可用。
  4. bpf-lua:BPF字节码,由Pflua交叉编译为Lua。
  5. pflua:透过Pflua直接把Pflang编译成Lua。

图中显示了Pflua能以接近测试机内存带宽极值100G/S速度来执行pflang包过滤操作,表明它不俗的包处理能力。


此外,我们还尝试从wingolog.org上进行包过滤测试,wingolog.org大部分时间是作为Web服务器来运作的,测试情况如上图所示。Pflua在这里再次击败了其它对手。

写在最后

如果想更多了解Pflua,不妨选择以下任一方式:有关Snabb中运用Pflua的查询,请访问论坛:snabb-devel。更多内容,请点击:wingolog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值