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



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

我知道有一个网络水龙头的概念,发送和接收代码在内核发送,但我如何创建一个?此外,我想捕获的不仅仅是IP,而是所有的以太网数据包,我知道NETFILTER_HOOK将帮助我获得IPv4数据包。

可以很容易地用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)注册。查看绑定或我的人工驱动程序的示例用法。

dev_add_pack也可以工作,但似乎除了af_packet.c之外,所有dev_add_pack的所有数据包捕获用户都已迁移到使用rx_handler s,例如https://patchwork.ozlabs.org/patch/367236/。

相关内容

  • 没有找到相关文章

最新更新