我的系统上有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/。