3

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

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

4

1 回答 1

2

可以通过以下方式轻松实现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)。有关示例用法,请参见绑定或我的uman驱动程序。

dev_add_pack也可以,但似乎除了 af_packet.c 之外,所有捕获所有数据包的用户dev_add_pack都已迁移到使用rx_handlers,例如https://patchwork.ozlabs.org/patch/367236/。该补丁的讨论表明这可能更有效

于 2018-03-04T20:53:51.663 回答