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

C 将传入数据包注入网络接口,c,linux-kernel,C,Linux Kernel,我希望能够在某个物理网络接口上模拟传入的数据包 具体地说,给定一个字节数组和一个接口名,我希望能够使该接口认为包含这些字节的数据包是从另一个接口(很可能在另一台机器上)到达的 我已经实现了准备数据包的代码,但我不确定下一步是什么 我应该指出,我实际上需要向接口提供字节,而不是使用可能在其他机器上产生类似结果的变通方法(我已经看到了关于环回接口和外部工具的其他问题的答案)。这段代码应该模拟机器上的流量,该机器期望通过特定接口接收来自特定来源的流量。其他任何东西都会被机器忽略。我要说的是,如果没有内

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

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

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


我应该指出,我实际上需要向接口提供字节,而不是使用可能在其他机器上产生类似结果的变通方法(我已经看到了关于环回接口和外部工具的其他问题的答案)。这段代码应该模拟机器上的流量,该机器期望通过特定接口接收来自特定来源的流量。其他任何东西都会被机器忽略。

我要说的是,如果没有内核修改,或者没有驱动程序修改,这是不可能的。请注意:

  • 有很多方法可以通过特定接口生成出口数据包,包括
    libpcap
    。但您希望生成入口数据包

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

如果修改内核以允许将数据包直接注入设备的接收队列,则可能会产生意外的影响,并且仍然无法准确模拟到达硬件的数据包(例如,它们不会被约束到相同的MTU等)。也许您可以构建一个iptables扩展,使内核误以为数据包来自不同的接口;但我不确定这能满足你的需要


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

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


这听起来有点难,但值得一试——您将从linux中的网络和tcp/ip堆栈中学到很多东西

您可以使用libpcap来实现这一点,因为您可以澄清“我希望能够使该接口认为包含从另一个接口到达的字节的数据包”是什么意思吗?你的意思是希望内核按照与它到达该接口时相同的规则处理它,还是其他什么?@Shloim在使用
libpcap
注入数据包时,一个注入出口数据包(即它们离开接口),而不是入口数据包(据我回忆,这肯定是我唯一使用它的方法).看一看@abligh是的,没错。我不想仅仅通过接口发送数据包,我想模拟一个场景,数据包到达接口,然后接口将其发送到其他地方(第二步有很多解决方案,从我所看到的)。