以下是我自己翻译的nff-go的github:https://github.com/intel-go/nff-go 的readme文件,自己mark用,翻译错的还请指出。
好消息:我们现在支持AF_XDP,也(几乎)支持直接从Linux中获取包了。所以你不必再写3种不同的应用来处理来自不同类型PMD驱动的数据包了。你只需要用NFF-Go编写所有内容,它就可以动态的使用你想要的任何东西。如果有需要,请联系 我们。
NFF-Go是一组用于创建和部署本地云网络功能(NFs)的库。它在不牺牲性能的情况下简化了网络功能的创建。
基于ACL的简单防火墙
func main() {
// Initialize NFF-GO library to use 8 cores max.
config := flow.Config{
CPUCoresNumber: 8,
}
flow.CheckFatal(flow.SystemInit(&config))
// Get filtering rules from access control file.
L3Rules, err := packet.GetL3ACLFromORIG("Firewall.conf")
flow.CheckFatal(err)
// Receive packets from zero port. Receive queue will be added automatically.
inputFlow, err := flow.SetReceiver(uint8(0))
flow.CheckFatal(err)
// Separate packet flow based on ACL.
rejectFlow, err := flow.SetSeparator(inputFlow, L3Separator, nil)
flow.CheckFatal(err)
// Drop rejected packets.
flow.CheckFatal(flow.SetStopper(rejectFlow))
// Send accepted packets to first port. Send queue will be added automatically.
flow.CheckFatal(flow.SetSender(inputFlow, uint8(1)))
// Begin to process packets.
flow.CheckFatal(flow.SystemStart())
}
// User defined function for separating packets
func L3Separator(currentPacket *packet.Packet, context flow.UserContext) bool {
currentPacket.ParseL4()
// Return whether packet is accepted or not. Based on ACL rules.
return currentPacket.L3ACLPermit(L3Rules)
}
NFF-Go是一个开源的BSD许可项目,主要在Linux用户区运行。社区提供的最新补丁和增强功能在develop分支中提供。主分支提供了适当的tag下的最新的稳定发布版本。
从版本0.7.0开始,NFF-Go使用go.mod获取依赖,因此Go的版本需要1.11或更高。使用以下命令获取NFF-Go分支:
git clone --recurse-submodules http://github.com/intel-go/nff-go
NFF-GO 使用 DPDK,所以你必须设置你的系统来构建和运行DPDK。查看 System Requirements in the DPDK Getting Started Guide for Linux以获取更多信息。
NFF-Go默认用现成的的Mellanox卡支持构建的,你需要安装MLX网络驱动所需的额外依赖。在Ubuntu上它们叫做libmnl-dev
和libibverbs-dev
。更多详细信息,请参阅MLX驱动MLX4和 MLX5各自的页面。如果这些依赖不够,并且也不需要Mellanox驱动,你可以设置变量NFF_GO_NO_MLX_DRIVERS
为一些非空值来禁用MLX驱动程序编译。
pktgen也需要额外的依赖,特别是当你运行在ReadHat或者CentOS Linux发行版上时。详细信息请查看这个文件。RedHat和CentOS的LUA部分在它的结尾。
在使用make
命令构建DPDK驱动后,你必须注册网卡才能使用DPDK驱动,加载必要的内核模块,并将卡绑定到模块上。查看中的 Compiling the DPDK Target from Source 和 How to get
best performance with NICs on Intel
platforms以获取更多信息。内核模块是DPDK用户模式驱动程序所必需的,它是内置的,但没有安装到内核目录中。您可以使用模块文件的完整路径加载它:
nff-go/test/dpdk/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
使用Go语言的1.11.4或者更高版本。使用以下命令查看Go的版本:
go version
当Go编译器第一次运行的时候,它会下载go.mod文件中列出的全部依赖包。这个操作不能并行执行,否则Go的包缓存会损坏。因此在第一次运行make
之前首先要运行go mod download
。另一个选择是在第一次运行的时候使用单进程make -j1
,但可能会很慢。
cd nff-go
go mod download # do it once before first build
make -j8
AF_XDP支持是默认开启的,并且它需要你安装libbpf
包。在我写这个readme的这个时刻,Ubuntu在它的包库中还没有这个包,所以需要从源码构建libbpf
或者是关闭AF_XDP套接字支持。
要关闭它,需要设置NFF_GO_NO_BPF_SUPPORT
为一些非空值。当使用这个值来构建NFF_GO时,AF_XDP支持会被关闭,并且使用它会报错。
如果你想从源码构建libbpf
,你可以选择以下2种方式:
如果你正在使用发行版中的现有linux内核, 从Github下载libbpf
, 然后执行 cd src; make; sudo make install
。 将 /usr/lib64 添加到你的 ldconfig 路径。
如果你从源代码构建linux内核,你可以从Linux源代码树中构建 libbpf
,执行命令为 cd tools/lib/bpf; make; sudo make install install_headers
。将 /usr/lib64 添加到你的 ldconfig 路径。
make debug -j8
在线API文档在 godoc.org site中查看. API的用法在我们的 维基页面上解释了.
在顶层目录中调用make
构建测试框架和示例。NFF-GO分布式测试打包在Docker容器映像中。在一些包里也有单节点的单元测试,你可以使用如下命令运行:
make testing
要在本地默认目标上创建docker映像(在/var/run/docker.sock中的默认UNIX socket或其他的已经在DOCKER_HOST变量中定义了),使用make images
命令。
要在分布式测试中部署并使用Docker镜像,使用make deploy
命令。这个命令需要2个环境变量:
要删除默认Docker目标中生成的图像,使用make clean-images
命令。
在Docker镜像上部署完全部测试主机后,你可以运行分布式网络测试了。这个测试框架在test/main目录下,可以接受一个带有测试规范的JSON文件。在同一目录中有性能和稳定性测试的预定义配置。要运行这些测试,把hostname1 和 hostname2改成JSON文件里的NFF_GO_HOSTS列表里的主机。
要清理全部已生成的二进制文件,使用make clean
命令。要删除全部在NFF_GO_HOSTS里列出的已部署的镜像,使用make cleanall
命令。
If you want to contribute to NFF-Go, check our Contributing guide. We also recommend checking the bugs with ‘help-wanted’ or ‘easyfix’ in our list of open issues; these bugs can be solved without an extensive knowledge of NFF-Go. We would love to help you start contributing.
You can reach the NFF-Go development team via our mailing list.