如何创建可以拦截来自/来自网络接口的所有数据包的内核模块

时间:2014-06-17 16:08:47

标签: linux linux-kernel network-monitoring

我的系统上有2个端口网卡 - eth0和eth1,如Linux所见 我想拦截进入/到eth0的所有数据包,通过eth1将它们发送到连接到与eth1相同的交换机的外部设备。因此,我需要打一个额外的标头,以使其到达正确的外部设备。

我知道有一个网络分流器的概念,内核中的发送和接收代码都发送给了,但我该如何创建呢?此外,我想捕获的不仅仅是IP,而是所有的以太网数据包,我知道NETFILTER_HOOK会帮助我获取IPv4数据包。

1 个答案:

答案 0 :(得分:0)

可以使用rx_handler

轻松实现
static rx_handler_result_t handle_frame(struct sk_buff **pskb)
{
    struct sk_buff *skb = *pskb;
    struct net_device *whereto_dev;

    skb = skb_share_check(skb, GFP_ATOMIC);
    if (unlikely(!skb))
        return RX_HANDLER_CONSUMED;

    *pskb = skb;

    whereto_dev = rcu_dereference(skb->dev->rx_handler_data);

    skb->dev = whereto_dev;

    return RX_HANDLER_ANOTHER; /* Do another round in receive path */
}

他们是通过netdev_rx_handler_register(slave_dev, handle_frame, whereto)注册的。有关示例用法,请参阅bonding或我的uman驱动程序。

dev_add_pack也会起作用,但似乎除了af_packet.c之外,所有追踪数据包的dev_add_pack用户都已迁移到使用rx_handler,例如https://patchwork.ozlabs.org/patch/367236/。补丁的讨论suggests this might be more effecient