Networking 如何实现虚拟网络接口

Networking 如何实现虚拟网络接口,networking,virtual,tap,Networking,Virtual,Tap,我正试图编写一个程序来模拟一些虚拟网络接口。我的程序运行在Linux PC上,表示为a,连接到路由器,表示为R,并且a有一个物理网络接口eth0,具有IPv4地址,例如,192.168.1.2。我的程序可以通过DHCP从路由器获得多个不同的IPv4地址,例如,192.168.1.3,192.168.1.4。。。(我通过编一些虚拟MAC地址完成了这一部分)。我接下来需要做的是,当另一台物理PC(表示为B)也连接到路由器R,尝试与我的程序获得的一个IPv4地址(不是分配给A的物理接口eth0)通信时

我正试图编写一个程序来模拟一些虚拟网络接口。我的程序运行在Linux PC上,表示为a,连接到路由器,表示为R,并且a有一个物理网络接口
eth0
,具有IPv4地址,例如,
192.168.1.2
。我的程序可以通过DHCP从路由器获得多个不同的IPv4地址,例如,
192.168.1.3
192.168.1.4
。。。(我通过编一些虚拟MAC地址完成了这一部分)。我接下来需要做的是,当另一台物理PC(表示为B)也连接到路由器R,尝试与我的程序获得的一个IPv4地址(不是分配给A的物理接口
eth0
)通信时,比如,
192.168.1.3
B看来,
192.168.1.3
是一个“真正的”网络接口。例如,如果Bping
192.168.1.3
,它应该能够从
192.168.1.3
接收响应(即使数据包实际上通过A的物理网络接口
eht0
)。此外,我的程序应该能够在接收整个数据包的虚拟接口上提取IP数据包

换句话说,我的程序想要实现的就像VirutalBox或VMWare Player等虚拟机中的“桥接网络”

有人能告诉我应该从什么开始吗?我应该用水龙头吗?有我可以使用的现有图书馆吗?或者我应该为自己的目的创建一个链接层套接字吗?(我在Richard Stevens的Unix网络编程中读过“数据链接访问”,但信息并不十分详细。) 谢谢
Tom

根据我对您需求的理解,您可以使用子接口。您可以将eth0拆分为多个接口,如eth0:1 eth0:2等。然后您可以为每个接口分配IP,并将它们用作常规接口。您可以在这些子接口上运行tcpdump/wireshark,并根据需要捕获数据包

嗨,乔,谢谢你的回复。我需要以编程方式处理数据包,也就是说,我需要创建一个套接字并将其绑定到每个虚拟接口。如果我使用子接口,我能做到这一点吗?是的。绝对地处理虚拟接口与处理常规接口完全相同。从内核的角度来看,它们看起来都一样。您可以获取子接口的ifindex并使用它进行绑定。