从Netfilter挂钩中扩展数据包头

问题描述

我想在NF_HOOK_LOCAL_OUT内的现有IP数据包上添加IP标头。我面临的问题是skb扩展功能(例如copy / clone / expand / reallocate标头)分配了新的sk_buff。我们不能返回这个新分配的指针,因为netfilter钩子函数(内核版本2.6.31)不再传递skb指针的地址(按值传递)。我如何解决此问题如下: 1.我使用skb_header_realloc()获得了一个新的skb。这将从skb复制所有数据。 2.我修改了新的skb(称为skb2),以在新的IP头之前添加新的IP头,并在新的IP头中设置适当的值。 3.使用skb_morph()用skb2的内容替换原始skb的内容(在Netfilter挂钩函数中传递)。返回NF_ACCEPT。 这是实现我的预期的唯一方法吗?有没有更有效的解决方案?还有skb_morph的其他用例(除了IP重组代码)?     

解决方法

这对我来说适用于2.6内核:
...
struct iphdr* iph;
if (skb_headroom(skb) < sizeof(struct iphdr))
  if (0 != pskb_expand_head(skb,sizeof(struct iphdr) - skb_headroom(skb),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;
希望能帮助到你。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...