【问题标题】:Sending a packet through a kernel module通过内核模块发送数据包
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2020-12-27
    • 2018-02-28
    • 2021-06-25
    • 2012-05-17
    • 2017-10-31
    相关资源
    最近更新 更多