各位好。我在内核3.4.39版本上使用netfilter框架抓包。钩子注册如下对于符合条件的skb,从L2层起抓取数据,然后封装新的mac,ip,udp发送到指定目的地。抓包效果如下图:
现在遇到一个问题,就是进来的报文它是有以太网头域的,对于出去的报文,却没有,出去的钩子函数注册在
NF_INET_POST_ROUTING链上,想请教各位大牛 L2层地址内核会在什么时候填写,可不可以手动填写等。
原始报文的源地址和目的地址等都已经有了。

解决方案 »

  1.   

    想到一个方法是在LOCAL_IN链上注册钩子函数,因为这时候进来的报文都是本机的,新建数组保存目的地址和目的ip地址。这样当LOCAL_OUT链的报文出去的时候可以根据源地址查找数组找到源MAC地址。不过这种方式不能够准确获取目的MAC地址,因为对于进来的报文,它的源MAC地址可能成千上万个。目前思路是既然出去的报文源IP地址、目的IP地址有了,能否手动去调用路由函数等等填写。这方面经验不是很多,不知道具体哪些该调用哪些函数去完成这一部分工作,对于linux路由和邻居子系统刚开始了解,有没有有经验的大神给个方向。非常感谢!