【发布时间】:2011-12-29 18:40:08
【问题描述】:
我正在尝试创建一个内核模块,该模块将能够从它通过 netfilter 挂钩接收的数据包中发送修改过的数据包。我正在使用here 提供的代码框架。我只是使用以下代码在内核中创建了一个原始套接字:
struct socket *sockptr;
sock_create(PF_INET, SOCK_RAW, IPPROTO_TCP, &sockptr);
sendpacket 函数由此调用:
len = sendpacket(sockptr, dev, IPPROTO_TCP, duplicate, ntohs(dupiph->tot_len));
socketptr 是我创建的原始套接字,dev 是通过挂钩函数传递给我的 net_device,并且副本是原始数据包的修改副本。
对 dev_queue_xmit 的调用返回表明数据包已成功传输,但我在线路上看不到数据包。我有两个问题:首先,我希望能够更好地调试正在发生的事情,因此非常感谢任何有关此的建议。另外,我想知道我是否正确处理了套接字创建,或者我是否缺少某种类型的配置。这对我来说都是全新的,所以很可能我错过了一些愚蠢的东西。
【问题讨论】:
-
你能解释一下你在说“我看不到电线上的数据包”时做了什么吗?我建议安装wireshark或其他嗅探器程序。
-
对不起,我应该澄清一下。正在使用的接口是“venet0”,它是 openvz 容器使用的接口。我正在使用 Wireshark 观察该接口上的流量,但没有看到数据包。
-
您确定 iptables 已正确配置以传递此类数据包吗?
-
没有任何与该接口相关的 iptables 规则,所以我看不出 iptables 可能会影响它。
-
你用的是什么内核? linux是什么味道的?
标签: c linux networking kernel