通过内核模块发送数据包

bsc*_*te3 8 c linux networking kernel

我正在尝试创建一个内核模块,该模块能够通过netfilter挂钩从它接收到的数据包中发送出已修改的数据包.我正在使用此处提供的代码框架.我只是使用这段代码在内核中创建一个原始套接字:

struct socket *sockptr;
sock_create(PF_INET, SOCK_RAW, IPPROTO_TCP, &sockptr);
Run Code Online (Sandbox Code Playgroud)

sendpacket函数由此调用:

len = sendpacket(sockptr, dev, IPPROTO_TCP, duplicate, ntohs(dupiph->tot_len));
Run Code Online (Sandbox Code Playgroud)

socketptr是我创建的原始套接字,dev是挂钩函数传递给我的net_device,而复制是原始数据包的修改副本.

从调用到dev_queue_xmit的返回表明数据包已成功传输,但我无法在线路上看到数据包.我有两个问题:首先,我希望能够更好地调试正在发生的事情,因此对此提出的任何建议都非常感谢.另外,我想知道我是否正确处理套接字创建或者是否存在某种类型的配置我缺少.这对我来说都很新鲜,所以很可能是我错过了一些愚蠢的东西.

TJD*_*TJD 1

您不太可能需要修改内核来完成您的任务。您是否考虑过使用 tun 或 tap 接口,以便可以在用户空间中完成所有工作?这是一个教程:http://backreference.org/2010/03/26/tuntap-interface-tutorial/