gpt4 book ai didi

linux - 如何创建一个可以拦截所有进出网络接口(interface)的数据包的内核模块

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:44 27 4
gpt4 key购买 nike

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

我知道有一个网络分路器的概念,内核中的传输和接收代码都发送到该网络分路器,但我如何创建一个?此外,我不仅要捕获 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) 注册。查看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 .

关于linux - 如何创建一个可以拦截所有进出网络接口(interface)的数据包的内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268590/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com