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

当我在网上冲浪时,试图找到一种在Linux中原型化网络协议或功能的方法。我偶然发现了PacketScript。
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.

目的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的指南。希望这篇文章对您有所帮助。我很高兴在评论中回答问题。让我知道您的网络原型工具。
本文来源于Lonely Blog -全球网络安全资讯平台, 转载请注明出处: https://blog.wuhao13.xin/2992.html