从 Netfilter 挂钩内扩展数据包标头
我想在 NF_HOOK_LOCAL_OUT 内部的现有 IP 数据包上添加 IP 标头。我面临的问题是skb扩展函数(例如复制/克隆/扩展/重新分配标头)分配一个新的sk_buff。我们无法返回这个新分配的指针,因为 netfilter 钩子函数(内核版本 2.6.31)不再传递 skb 指针的地址(按值传递)。我解决这个问题的方法如下: 1.我使用skb_header_realloc()获得了一个新的skb。这会复制 skb 中的所有数据。 2.我修改了新的skb(称为skb2)以添加新的IP标头,在新的IP标头中设置适当的值。 3. 使用skb_morph()将原始skb的内容(在Netfilter钩子函数中传递)替换为skb2的内容。返回 NF_ACCEPT。
这是实现我的目的的唯一方法吗?有更有效的解决方案吗? skb_morph 是否还有其他用例(除了 IP 重组代码)?
I want to prepend IP header on an existing IP packet while inside NF_HOOK_LOCAL_OUT. The issue I face is that the skb expansion functions (such as copy/clone/expand/reallocate header) allocate a new sk_buff. We can not return this newly allocated pointer since netfilter hook function no longer (kernel version 2.6.31) passes the skb pointer's address (passes by value). How I solved the issue is as follows:
1. I got a new skb using skb_header_realloc(). This copies all the data from skb.
2. I modified the new skb (call it skb2) to prepend the new IP header, set appropriate values in the new IP header.
3. Replace the contents of the original skb (passed in the Netfilter hook function) with the contents of the skb2 using skb_morph(). Returned NF_ACCEPT.
Is this the only way of achieving what I intended to? Is there a more efficient solution? Are there other use cases of skb_morph (besides the IP reassembly code)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这对我有用,在 2.6 内核中:
希望它有帮助。
This works for me, in 2.6 kernels:
Hope it helps.