C 将传入数据包注入网络接口
我希望能够在某个物理网络接口上模拟传入的数据包 具体地说,给定一个字节数组和一个接口名,我希望能够使该接口认为包含这些字节的数据包是从另一个接口(很可能在另一台机器上)到达的 我已经实现了准备数据包的代码,但我不确定下一步是什么C 将传入数据包注入网络接口,c,linux-kernel,C,Linux Kernel,我希望能够在某个物理网络接口上模拟传入的数据包 具体地说,给定一个字节数组和一个接口名,我希望能够使该接口认为包含这些字节的数据包是从另一个接口(很可能在另一台机器上)到达的 我已经实现了准备数据包的代码,但我不确定下一步是什么 我应该指出,我实际上需要向接口提供字节,而不是使用可能在其他机器上产生类似结果的变通方法(我已经看到了关于环回接口和外部工具的其他问题的答案)。这段代码应该模拟机器上的流量,该机器期望通过特定接口接收来自特定来源的流量。其他任何东西都会被机器忽略。我要说的是,如果没有内
我应该指出,我实际上需要向接口提供字节,而不是使用可能在其他机器上产生类似结果的变通方法(我已经看到了关于环回接口和外部工具的其他问题的答案)。这段代码应该模拟机器上的流量,该机器期望通过特定接口接收来自特定来源的流量。其他任何东西都会被机器忽略。我要说的是,如果没有内核修改,或者没有驱动程序修改,这是不可能的。请注意:
- 有很多方法可以通过特定接口生成出口数据包,包括
。但您希望生成入口数据包libpcap
- 有很多方法可以生成不通过物理接口的入口数据包-这就是tap/tun设备的用途
如果您只需要模拟(并且您对完整的模拟感到满意),请构建一个tap/tun驱动程序,并将tap接口重命名为
eth0
或类似名称。另一个解决方案是创建一个新的虚拟网络设备驱动程序,该驱动程序将具有与环回接口相同的功能(即,它将是虚拟的)。之后,您可以结束简单tcp数据包的创建,并在源地址和目标地址中指定两个网络设备的地址
这听起来有点难,但值得一试——您将从linux中的网络和tcp/ip堆栈中学到很多东西 您可以使用libpcap来实现这一点,因为您可以澄清“我希望能够使该接口认为包含从另一个接口到达的字节的数据包”是什么意思吗?你的意思是希望内核按照与它到达该接口时相同的规则处理它,还是其他什么?@Shloim在使用
libpcap
注入数据包时,一个注入出口数据包(即它们离开接口),而不是入口数据包(据我回忆,这肯定是我唯一使用它的方法).看一看@abligh是的,没错。我不想仅仅通过接口发送数据包,我想模拟一个场景,数据包到达接口,然后接口将其发送到其他地方(第二步有很多解决方案,从我所看到的)。