我的系统上有 2 个端口 NIC - Linux 看到的 eth0 和 eth1。
我想拦截所有进入/进入 eth0 的数据包,通过 eth1 将它们发送到连接到与 eth1 相同的交换机的外部设备。因此,我需要添加一个额外的标头以使其到达正确的外部设备。
我知道内核中的发送和接收代码都发送到网络分路器的概念,但是我如何创建一个呢?此外,我不仅想捕获 IP,还想捕获所有以太网数据包,我知道NETFILTER_HOOK
这会帮助我获得 IPv4 数据包。
我的系统上有 2 个端口 NIC - 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)
。有关示例用法,请参见绑定或我的uman驱动程序。
dev_add_pack
也可以,但似乎除了 af_packet.c 之外,所有捕获所有数据包的用户dev_add_pack
都已迁移到使用rx_handler
s,例如https://patchwork.ozlabs.org/patch/367236/。该补丁的讨论表明这可能更有效。