从Netfilter挂钩中扩展数据包头

时间:2011-04-14 11:50:25

标签: network-programming linux-kernel ip netfilter

我希望在NF_HOOK_LOCAL_OUT内部的现有IP数据包上添加IP头。我面临的问题是skb扩展函数(例如copy / clone / expand / reallocate header)分配了一个新的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重组代码)?

1 个答案:

答案 0 :(得分:1)

这适用于我,在2.6内核中:

...
struct iphdr* iph;
if (skb_headroom(skb) < sizeof(struct iphdr))
  if (0 != pskb_expand_head(skb, sizeof(struct iphdr) - skb_headroom(skb), 0, GFP_ATOMIC)) {
    printk("YOUR FAVOURITE ERROR MESSAGE");
    kfree_skb(skb);
    return NF_STOLEN;
  }
iph = (struct iphdr*) skb_push(skb, sizeof(struct iphdr));
//Fill ip packet
return NF_ACCEPT;

希望它有所帮助。