理念:第一种方法是在bpf程序中创建一个全新的数据包,并将其发送到指定的接收器。第二种方法是复制数据包。为了便于区分,下面我将从复制中获得的数据包称为packet_copy
。然后我可以修改packet_copy
,使其可以发送到指定的接收器,并且原始数据包将通过正常路径。
尝试:关于第一种方式,我没有找到合适的解决方案,但有人说这种方式是不可能的。对于第二种方法,我发现bpf_clone_redirect()
是一种可能的解决方案。但是,我们不应该从复制中获得packet_copy
,而是应该直接修改原始数据包(以便将其重定向到指定的接收器(,然后调用bpf_clone_redirect
对其进行重定向。我还需要在调用bpf_clone_redirect
后撤消修改以恢复数据包,因为我希望此数据包能够正常处理,而不是丢弃。
问题:至于第一种方法,我想知道它是否可行。至于第二种方法,我想知道它是否可以优化,因为bpf_clone_redirect
有它的局限性。
第一种方法是在bpf程序中创建一个全新的数据包,并将其发送到指定的接收器。
这在今天确实是不可能的。它需要动态内存分配来为数据包分配内存,然后需要一个助手来发送数据包。目前BPF(v5.19(中没有这些可用。
但是,我们不应该从复制中获得
packet_copy
,而是应该直接修改原始数据包(以便将其重定向到指定的接收器(,然后调用bpf_clone_redirect
对其进行重定向。我还需要在调用bpf_clone_redirect
后撤消修改以恢复数据包,因为我希望此数据包能够正常处理,而不是丢弃。
我不知道在单个BPF程序中有什么更有效的方法。
然而,根据您所在堆栈的位置,您可能可以使用两个BPF程序,一个进行克隆,另一个在克隆后截取其中一个副本进行修改。我不相信这会更高效,但可能更干净。