我正在设置 QEMU/KVM 虚拟机,并希望为其使用桥接网络。在我读过的每本手册/教程中,都提到在物理网卡上禁用 DHCP 并在网桥上启用它。我不明白的是,如果网桥的作用就像物理网桥/交换机一样,为什么它必须分配一个 IP 地址,而实际的物理网卡却没有 IP 地址?这个问题已经被问过几次了,但我仍然没有找到答案,例如这里答案说这样虚拟机就可以与网桥进行通信。但他们为什么需要这样做呢?对于实际的物理机器,网桥透明地工作并且仅转发流量。所以,我的问题是:
- 为什么虚拟网桥需要 IP 地址,而物理网桥不需要 IP 地址?
- 当 NIC 没有虚拟网桥的 IP 地址时,物理 NIC 如何知道使用虚拟网桥的 IP 地址?
- 为什么虚拟机需要与网桥通信,而物理机实际上并不直接与物理网桥通信?
以下是一些插图,可以更好地说明我的意思:
- 我想象带有网络交换机的物理网络是如何工作的:
- 我想象虚拟桥应该如何工作
- 我如何理解它实际上有效
答案1
- 为什么虚拟网桥需要 IP 地址,而物理网桥不需要 IP 地址?
认为虚拟网桥需要 IP 地址是一种误解。它不需要它。
你其实能有一个没有 IP 地址的虚拟网桥。但是,主机本身根本无法通过该物理接口上的 IP 访问:只有虚拟机可以。
在企业虚拟化主机中,这可能很有用:您可能有一个需要连接到客户虚拟机的客户网络。您可能不想将此类网络的访问权限授予虚拟化主机本身,但是仅有的到各自的虚拟机。然后,您将拥有另一个物理上独立的管理网络,用于管理虚拟化主机。该网络将通过一个单独的 NIC 连接到主机不是成为任何虚拟网桥的成员。
- 当 NIC 没有虚拟网桥的 IP 地址时,物理 NIC 如何知道使用虚拟网桥的 IP 地址?
除非物理 NIC 具有特定的 IPv4 加速功能,否则 IP 地址只是 NIC 的有效负载数据。基本物理网卡仅适用于第 2 层,即 MAC 地址。 IP 协议是第 3 层协议,通常留给操作系统的网络驱动程序堆栈。当您使用ifconfig
或来“为 NIC 配置 IP 地址”时ip addr
,您不必对实际的物理硬件配置进行任何更改,而是对一个抽象构造进行更改,该抽象构造包括物理 NIC 和与 NIC 相关的操作系统级 IP 协议支持网卡。
当物理 NIC 配置为充当桥接器的成员时,任何第 3 层加速功能可能都需要关闭:当充当桥接器的一部分时,NIC 需要接收所有传入数据包,无论其状态如何。目标 MAC 或 IP 地址,网桥代码将决定是否转发数据包以及转发到网桥的哪个成员。基本网桥绝不能完全不关心 IP 地址。网桥中的任何第 3 层功能都高于基本网桥功能,并且在虚拟网桥中是/应该是可选的。
如果物理 NIC 在配置为网桥的一部分时配置了 IP 地址,它将激活该 NIC(及其驱动程序)上的 ARP 功能。但是,从该物理 NIC 发出的 ARP 消息将无法到达虚拟机:要通过其 ARP 到达整个网段(根据正确的第 2 层功能的要求),NIC 驱动程序必须将 ARP 消息生成为同时发出的 ARP 消息。 & 同时传入消息,并且 NIC 驱动程序将没有代码来执行此操作。
拥有带有 VM 的虚拟网桥意味着网桥 IP 段的某些部分将在物理上位于主机外部,而其他部分则包含在位于主机内部的 VM 内。如果主机像往常一样使用 NIC 来尝试与其中一台虚拟机进行通信,则数据包将不必要地从主机发送到主机所连接的物理交换机或路由器,并且从那里它们必须返回主机,并通过网桥到达目标虚拟机。
这肯定是低效的,并且实际上可能根本不起作用:具有虚拟网桥的主机所连接的物理交换机通常没有理由将源自该主机的任何数据包发送回主机本身。
相反,从主机到桥接网段的传出数据包必须通过桥接代码发送,桥接代码首先查找桥接的哪个接口(虚拟或物理)与目的地“最接近”。如果网桥知道目的地,则传出数据包将直接发送到该目的地。对于主机与其虚拟机之间的通信,这意味着通信完全发生在物理主机内部,根本不使用主机外部的物理网络带宽。
如果网桥不知道目标 MAC 地址,则传出数据包最初会从所有网桥成员接口发出:一旦收到应答,网桥就会获知初始数据包的目的地位置,并可以返回高效的操作方法(如上所述)。
从包含网桥的主机发出 ARP 请求时,必须将请求广播到虚拟机和出物理网卡,因此请求实际上会发送到所有的网段:桥接代码可以做到这一点,而单个物理网卡则不能。
我认为没有要求 Linux 桥应该完全是物理的或虚拟的:我不明白为什么 Linux 桥不能有多个物理接口和与其关联的任意数量的虚拟机。但在企业环境中,您通常不会希望构建这样的“万能主机”。它很容易成为一个棘手的关键基础设施,永远不会出现任何停机;换句话说,令系统管理员头疼的是。
- 为什么虚拟机需要与网桥通信,而物理机实际上并不直接与物理网桥通信?
又是一个误解:虚拟机确实不是需要网桥上的 IP 地址“与网桥进行通信”。
但如果你想为了使主机和虚拟机能够在同一IP网段内相互通信,需要为桥接设备分配IP地址。
桥接设备上的 IP 地址主要是为了满足通信需求主持人,不属于虚拟机- 但如果您需要的话,它可以允许主机通过 IP 与虚拟机高效通信,而无需循环通过外部设备。