PacketScript概述:一种用于内核中数据包处理的Lua脚本引擎

linux-tux-100360806-large

当我在网上冲浪时,试图找到一种在Linux中原型化网络协议或功能的方法。我偶然发现了PaC++ketScript。

PacketScript是Linux内核中Lua VM的实现。这样的实现并不是新的,luak和lunatik已经存在了一段时间。但是,使PacketScript与众不同的是使用Lua处理网络数据包的能力。不只是在内核中运行Lua代码。实际上,PacketScript在内核引擎中将lunatik用作其Lua。

PacketScript建立在现有技术的基础上,以确保将来的可维护性。它基于iptables基础结构和现有的xtable-addons平台构建。使用xtables-addons使PacketScript不需要内核修补和编译。您只需要安装内核模块。xtables-addons还提供了向iptables命令行界面添加功能的帮助。

PacketScript是工作安德烈·格拉夫是他的硕士论文在巴塞尔大学。自从最初发表论文源代码以来它就一直没有得到维护。它目前正在运行,我不知道有任何错误,但是缺乏维护可能会使该项目不适合生产使用(除非您自己分叉和维护)。

请注意,PacketScript在Linux内核2.x上编译。(除非您应用补丁)

对于PacketScript支持的内核版本感到非常失望,我找到了OpenWrt团队的补丁程序,该团队已将PacketScript移植到4.x内核!该修补程序适用于OpenWrt,但您可以轻松地将其应用到源代码并在其他任何发行版上构建。(我自己在OpenWrt上使用PacketScript)。

如果要在OpenWrt上使用PacketScript,只需在menuconfig中选择它(网络-> IPTables-> ipt-mod-lua)。

在本指南中,我们将使用Debian稳定版(jessie)来学习修补过程。同样的过程也可以用于其他发行版。开始吧 :

 Installing dependencies 
 APT install libxtables-dev linux-headers-$(uname -r) build-essential pkg-config
 Download xtables-addons https://sourceforge.net/projects/xtables-addons and extract files.
 Download patches 
 $ cd xtables-addons-3.2/
 $ wget "https://Github.com/openwrt-mirror/openwrt/raw/master/package/network/utils/xtables-addons/patches/201-fix-lua-packetscript.patch"
 $ wget "https://raw.githubusercontent.com/openwrt-mirror/openwrt/master/package/network/utils/xtables-addons/patches/200-add-lua-packetscript.patch"
 Apply patches 
 $ patch -p1 < 200-add-lua-packetscript.patch
 $ patch -p1 < 201-fix-lua-packetscript.patch
 change config files (only necessary if patch fAIls at config files)
 At this stage due to difference between xtables-addons version the first patch may fail at config file, You need to change them manually and remove all patch rejects and backups. 
 5.1. Change configs
 add 'build_LUA=m' to the 'xtables-addons-1.xy/mconfig' file
 add 'obj-${build_LUA} += LUA/' to the 'xtables-addons-1.xy/extensions/Mbuild' file
 add 'obj-${build_LUA} += LUA/' to the 'xtables-addons-1.xy/extensions/Kbuild' file
 5.2. Remove rejects and backups
 $ find -name ".rej" -delete $ find -name ".orig" -delete
 Build & Install 
 $ make
 make install

请注意,尽管已安装,但模块可能仍未加载:

insmod /lib/modules/$(uname -r)/extra/xt_LUA.ko

注意:可能未将模块安装在有效位置,以便被modprobe检测到。使用符号链接或相应地更改Makefile。看到这个这个

现在一切准备就绪:

root@debian:~# iptables -I INPUT -j LUA
 iptables v1.6.0: LUA: --script parameter required
 Try `iptables -h' or 'iptables --help' for more information.
18-Figure3.1-1

目的NAT(DNAT)

创建一个这样的lua脚本(dnat.lua):

function process_packet(p)
     local ip = p:data(packet_eth):data(packet_ip)
     if not ip then return NF_DROP end
     ip:daddr():set("2.1.1.1") 
     return XT_CONTINUE
 end

然后像这样将其推入内核:

iptables -t mangle -A POSTROUTING -d 8.8.8.8 -j LUA --script dnat.lua

建议使用Netfilter匹配项和扩展名,并在由于性能原因而无法执行所需操作时使用PacketScript。

我正在对PacketScript中的一些新功能进行原型设计。如果我的雇主同意开放资源,我将创建一个GitHub存储库并使用此链接更新此帖子。

Internet上没有PacketScript的指南。希望这篇文章对您有所帮助。我很高兴在评论中回答问题。让我知道您的网络原型工具。

标签