将传入数据包注入网络接口

时间:2015-11-30 17:14:30

标签: c linux-kernel

我希望能够模拟某个物理网络接口上的传入数据包。

具体来说,给定一个字节数组和一个接口名称,我希望能够让该接口认为包含这些字节的数据包来自另一个接口(很可能是在另一台机器上)。

我已经实现了准备数据包的代码,但我不确定下一步是什么。

我应该指出,我实际上需要使用我的字节来提供接口,而不是使用可能在其他机器上产生类似结果的解决方法(我已经看到其他问题的答案,提到了环回接口和外部工具) 。此代码应该模拟预期通过特定接口从某些源接收流量的计算机上的流量。机器将忽略其他任何内容。

2 个答案:

答案 0 :(得分:1)

我要伸出脖子,说如果没有内核修改,可能会修改驱动程序,这是不可能的。请注意:

  • 有很多方法可以通过特定接口生成 egress 数据包,包括libpcap。但是您想要生成 ingress 数据包。

  • 有很多方法可以生成不通过物理接口的入口数据包 - 这就是tap / tun设备的用途。

如果您修改内核以允许将数据包直接注入设备的接收队列,这可能会产生意想不到的效果,并且仍然无法准确模拟到达硬件的数据包(例如,它们不会受限于相同的MTU等)。也许你可以构建一个iptables扩展,让内核误认为数据包来自不同的接口;我不确定会做你需要的东西。

如果您只需要模拟(并且您对完整的模拟感到满意),请构建tap / tun驱动程序,并将tap接口重命名为eth0或类似。

答案 1 :(得分:1)

另一个解决方案是创建一个新的虚拟网络设备驱动程序,它将具有与环回接口相同的功能(即它将是虚拟的)。之后,您可以完成简单tcp数据包的创建,并在源地址和目标地址中指定两个网络设备的地址。

这听起来有点难,但值得尝试 - 你将在Linux中学习很多网络和tcp / ip堆栈。