Linux 以编程方式将数据包注入虚拟接口

Linux 以编程方式将数据包注入虚拟接口,linux,networking,libpcap,Linux,Networking,Libpcap,我们目前正在开发一个原型,旨在使用专有硬件将Linux中的本地虚拟接口“桥接”到发送/接收以太网数据包的API。最终的想法是通过这种专有硬件透明地使用标准库和工具 作为确保我们想要做的事情确实可行的第一步,我们制作了原型的第一个版本,使用libpcap将虚拟接口桥接到实际的以太网接口。以下是我们所做的: 使用MAC/IP地址(192.168.0.1)在PC1上创建本地虚拟接口 在同一网络上使用IP配置PC2(192.168.0.2) 使用PC1上的未配置接口链接PC1和PC2 在PC1上使用一

我们目前正在开发一个原型,旨在使用专有硬件将Linux中的本地虚拟接口“桥接”到发送/接收以太网数据包的API。最终的想法是通过这种专有硬件透明地使用标准库和工具

作为确保我们想要做的事情确实可行的第一步,我们制作了原型的第一个版本,使用libpcap将虚拟接口桥接到实际的以太网接口。以下是我们所做的:

  • 使用MAC/IP地址(192.168.0.1)在PC1上创建本地虚拟接口
  • 在同一网络上使用IP配置PC2(192.168.0.2)
  • 使用PC1上的未配置接口链接PC1和PC2
  • 在PC1上使用一个简单的“桥接”程序,该程序使用libpcap开发,侦听一个接口并在第二个接口上注入数据包(使用pcap_sendpacket),反之亦然,以桥接虚拟接口和实际以太网接口
  • 启动从PC1到PC2的ping
当监视PC1上的虚拟接口时,我们观察ICMP请求和响应,因此网桥程序工作正常,但ping工具无法在应用程序级别获得ICMP响应

我猜我们在内核路由过程中注入数据包太晚了……或者其他什么

你知道如何正确地做到这一点吗?可能使用其他类型的虚拟接口?(桥接、tun/tap…)它不可能是一个完整的系统/命令行解决方案,因为最终我们希望将数据包桥接到专有API,而不是以太网接口,因此我们需要对数据包进行编程访问(因此是libpcap)


提前感谢你的帮助

这在Linux中使用虚拟模块接口是不可能的。它们只能“向下”传输数据包,从内核传输到网络硬件设备。并且,与虚拟接口没有硬件设备的情况一样,当数据包到达该路径的底部时,数据包被丢弃(
dummy_xmit
function)。您可以将其视为单向水槽

以下是调用图:

                          [applications]
                          [tcp/ip stack]  
                                 |
                                 |
                                 v
pcap_sendpacket -> tpacket_snd -> dev_queue_xmit -> dev_hard_start_xmit -> xmit_one -> netdev_start_xmit -> ndo_start_xmit -> dummy_xmit -> dev_kfree_skb
                                                                                    |
                                                                                    |
pcap_next <- tpacket_rcv <- prot_hook.func <- deliver_skb <-dev_queue_xmit_nit <-----
这就是为什么您同时看到请求和响应。但是响应并没有被传递到内核TCP/IP堆栈和ping应用程序,因为这在虚拟接口中是不可能的。它们被向下传输到
dummyxmit
并丢弃


因此,在您的情况下,您应该使用TAP接口,或者,如果您仍然想使用pcap交换数据包,则可以使用veth虚拟链接。

在Linux中,使用虚拟模块接口是不可能的。它们只能“向下”传输数据包,从内核传输到网络硬件设备。并且,与虚拟接口没有硬件设备的情况一样,当数据包到达该路径的底部时,数据包被丢弃(
dummy_xmit
function)。您可以将其视为单向水槽

以下是调用图:

                          [applications]
                          [tcp/ip stack]  
                                 |
                                 |
                                 v
pcap_sendpacket -> tpacket_snd -> dev_queue_xmit -> dev_hard_start_xmit -> xmit_one -> netdev_start_xmit -> ndo_start_xmit -> dummy_xmit -> dev_kfree_skb
                                                                                    |
                                                                                    |
pcap_next <- tpacket_rcv <- prot_hook.func <- deliver_skb <-dev_queue_xmit_nit <-----
这就是为什么您同时看到请求和响应。但是响应并没有被传递到内核TCP/IP堆栈和ping应用程序,因为这在虚拟接口中是不可能的。它们被向下传输到
dummyxmit
并丢弃


因此,在您的情况下,您应该使用TAP接口,或者,如果您仍然想使用pcap交换数据包,请查看虚拟链接。

您正在寻找tun/TAP接口。您正在寻找tun/TAP接口。