我的系统上有2个端口网卡 - eth0和eth1,如Linux所见 我想拦截进入/到eth0的所有数据包,通过eth1将它们发送到连接到与eth1相同的交换机的外部设备。因此,我需要打一个额外的标头,以使其到达正确的外部设备。
我知道有一个网络分流器的概念,内核中的发送和接收代码都发送给了,但我该如何创建呢?此外,我想捕获的不仅仅是IP,而是所有的以太网数据包,我知道NETFILTER_HOOK
会帮助我获取IPv4数据包。
答案 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。