我编写了一个模拟简单机器的程序。该程序有自己的 MAC,并使用原始套接字来编写原始以太网帧,有效地自行管理 IP/ARP 表等。它可以与外界通信,但我在主机到客户机和客户机到主机的连接方面遇到了问题。目前,我在桥接模式,但发往主机的数据包永远不会到达任何一个虚拟macvlan1或底层eth0。另外我的交换机不支持簪所需的功能vepa 模式。
我尝试重现这个帖子那里有一个用户遇到了类似的问题,但首先答案对我来说不起作用,其次用户回答结束时
不过,如果使用 macvlan 的话会容易得多。
那么我该如何设置 macvlan,以便客人可以与外界沟通和主人?
我也会使用桥接(例如这个帖子)如果它对我有用。(此外,我想避免预定义静态 IP)
答案1
好的,现在我必须玩一下原始套接字。
然而,原始套接字(man 7 raw
,socket(AF_INET, SOCK_RAW, ...)
)确实在第 3 层工作。你说你编写原始以太网帧,并执行 ARP,所以可能你的意思是封包套接字(man 7 packet
,socket(AF_PACKET, SOCK_RAW, ...)
)。
对于数据包套接字和原始套接字,数据包都不会被正确路由,而是直接放置在特定接口的出站部分。可以通过按名称绑定到该接口或查找目标地址来确定此接口。因此,“内核会自动进行转发”是不正确的:根本不会发生转发。特别是,如果目标是本地地址,则数据包不会通过环回接口重新路由。
这使得该方法完全不适合将具有“额外接口端点”的设备模拟到主机中。
对于 macvlans,桥接模式描述为
macvlan 是一种简单的桥接器,它不需要进行学习,因为它知道它可以接收的每个 mac 地址,所以它不需要实现学习或 stp。这使得它变得简单、愚蠢和快速。
我认为这意味着 macvlan 通过检查原始接口的 MAC 地址和 macvlan 添加的每个附加 MAC 地址来进行桥接。这意味着当您通过原始套接字模拟 MAC 地址时,macvlan 代码不知道存在“附加”MAC 地址,因此无法为其找到任何目的地。
此外,原始套接字和数据包套接字需要 root 权限(对于模拟其他设备的应用程序来说,这应该不是必需的),因此在我看来,原始套接字和数据包套接字完全不适合这种应用程序。它们旨在在用户空间中实现新的 IP 协议或其他低级网络内容,仅此而已。
所以我的建议仍然是:不要使用原始/数据包套接字。使用 Tap 接口,如 QEMU 或其他模拟器。这将允许您的应用程序以非 root 身份运行,并且您将能够在您喜欢的主机中设置任何网络配置(在第 3 层路由它,或在第 2 层桥接它)。