Linux 以编程方式将数据包注入虚拟接口
我们目前正在开发一个原型,旨在使用专有硬件将Linux中的本地虚拟接口“桥接”到发送/接收以太网数据包的API。最终的想法是通过这种专有硬件透明地使用标准库和工具 作为确保我们想要做的事情确实可行的第一步,我们制作了原型的第一个版本,使用libpcap将虚拟接口桥接到实际的以太网接口。以下是我们所做的: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上使用一
- 使用MAC/IP地址(192.168.0.1)在PC1上创建本地虚拟接口
- 在同一网络上使用IP配置PC2(192.168.0.2)
- 使用PC1上的未配置接口链接PC1和PC2
- 在PC1上使用一个简单的“桥接”程序,该程序使用libpcap开发,侦听一个接口并在第二个接口上注入数据包(使用pcap_sendpacket),反之亦然,以桥接虚拟接口和实际以太网接口
- 启动从PC1到PC2的ping
提前感谢你的帮助 这在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接口。