我正在寻找一种以特定方式处理 Linux 服务器中的数据包的方法 - 我需要在每个数据包上运行一些自定义逻辑,然后(可能)对数据包采取一些操作并让内核按其需要路由数据包。我的具体用例是:
- 捕获 IGMP 数据包(正在我的主机上的 Linux 桥内传递)并根据我拥有的某些允许值列表验证其内部字段(多播组和校验和)。如果未找到匹配项,则丢弃该数据包。
- 当收到 IPv6 数据包(通过我的 Linux 机器路由)时,将源地址与一些“可疑”地址词典进行比较。如果是,则打开数据包(直到 HTTP 标头和内部)并运行一些测试以确保其有效(例如验证端口号、内容长度、标头结构)
- 捕获 TCP 段后,检查其中启用的标志数量,如果数量大于 5,则将数据包的副本发送到另一个目的地(比如说,IDS 设备)并正常转发数据包。
我查看了一些 Linux 实用程序和工具,例如tc
、XDP
和DPDK
其他FD.io
解决方案(VPP
),但找不到一种简单的方法以简单的方式运用这些技术来实现我想要的。如果我的验证和操作可以在现代、灵活的环境和代码中运行,那就更好了(这里不要求使用 python 或 Java,但 bash 比一些类似内核的 C 代码更可取)。
在 Linux 机器上实现此类操作的常用方法是什么? 是否有任何最佳实践或技术可以以编程方式实现上述所有修改和功能?
干杯。
答案1
对于 igmp 和 tcp 场景,使用 XDP INGRESS 是理想的选择。但是对于 ipv6,由于您有更多的检查和界限,因此不确定它将如何转换。这里的缺点是没有特定的用户应用程序,因此无法使用用户零复制模式和 eBPF 在沙盒 JIT 中逐个数据包处理数据包。id 的数据包镜像也将很困难。
DPDK 与 TAP 或 KNI 确实是一种可行的方法,因为您可以批量处理并分摊成本。但这涉及用户空间拦截。
以下是我的建议
- 如果您有 hw ack 或 flow.director,则将感兴趣的流量分叉到自定义端口或队列。
- 在自定义端口上使用 DPDK 并检查。如果与 ida 镜像匹配,则通过 tap 或 kni 注入内核。
或者
- 如果没有硬件过滤器,请尝试使用用户空间 ebpf 从传入流量中过滤 igmp、ipv6 和 tcp 内容。
- 然后,用户空间应用程序运行过滤器和镜像逻辑,然后注入回内核。