FreeBSD 是否更改接口的 mac 地址?

FreeBSD 是否更改接口的 mac 地址?

我正在使用 KVM 托管来宾 VM。在我的主机虚拟机上,我创建了 2 个网桥,并将每个网桥分配给一个物理接口(也为它们分配了一个子网)。

路由一切都工作得很好,我可以从接口对外部资源执行 ping 操作。

然后,我将这 2 个网桥分配给运行 FreeBSD 的来宾 VM。当我登录 FreeBSD Guest 并查看网络配置时,我看到以下 2 个curr medias

root@VM% ifconfig -a | grep "curr media"
        curr media: i802 52:53:f:6f:e2:b2
        curr media: i802 52:53:f:3b:24:22

当我检查主机 Ubuntu VM 上的所有接口时,我看到以下内容:

vnet1     Link encap:Ethernet  HWaddr fe:53:0f:6f:e2:b2
vnet2     Link encap:Ethernet  HWaddr fe:53:0f:3b:24:22

这非常令人困惑,因为我假设 FreeBSD 中的接口与关联的 VNET 具有相同的 MAC 地址。

FreeBSD 是否将 mac 地址从 更改fe52?或者 freeBSD 接口是否采用与关联的 VNET 不同的 MAC 地址?

更多相关困惑:
1) 如果将 2 个带有路由的网桥分配给来宾 VM,是否会为主机上的每个网桥创建一个 VNET?
2) 如果创建 2 个网桥,一个分配给 1 个 VM,另一个分配给另一个 VM。还会有 2 个 VNETS 吗?
3) 如果在主机虚拟机上创建 2 个网桥。但是,一个网桥分配给 1 个虚拟机,另一个网桥分配给 2 个虚拟机,是否会在主机虚拟机上创建 3 个 VNET?

进行此澄清的原因是因为我看到一大堆 VNET.. 并且我不知道它们来自哪里(因为我似乎无法理解 MAC 地址)并且我似乎无法将它们取下,因为它们不在ubuntu的文件network/interfaces

答案1

使用 KVM 时,无论操作系统如何,主机端的接口 MAC 地址永远不会与 VM 内部的 MAC 地址相同。这是 TUN/TAP 网络的结果。

例如,运行 CentOS 7 VM:

$ ip link show v-test1
64: v-test1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
    link/ether fe:54:00:0c:d8:88 brd ff:ff:ff:ff:ff:ff

$ ssh test1 /sbin/ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:0c:d8:88 brd ff:ff:ff:ff:ff:ff

我们可以在 Solaris 11 VM 上看到类似的情况:

55: v-solaris: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
    link/ether fe:54:00:94:47:6d brd ff:ff:ff:ff:ff:ff

$ ssh solaris ifconfig -a
....
net0: flags=100001004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,PHYSRUNNING> mtu 1500 index 2
        inet 10.0.0.157 netmask ffffff00 broadcast 10.0.0.255
        ether 52:54:0:94:47:6d 

因此,VM 操作系统是什么并不重要;虚拟机内部看到的 MAC 地址始终与主机端看到的不同。

现在,您通常可以通过配置选择主机端的接口名称和访客端的 MAC 地址。我使用 libvirt 来管理我的虚拟机,因此在我的 guest.xml 文件中我有

<interface type='bridge'>
  <mac address='52:54:00:0c:d8:88'/>
  <source bridge='br0'/>
  <target dev='v-test1'/>
  <model type='virtio'/>
</interface>

这将在主机上创建一个名为“v-test1”的网络,并指定访客内部的 MAC 地址。这与上面的第一个示例匹配。

如果为主机指定两个网络适配器,则可以独立选择它们所在主机上的网桥、主机上显示的网络接口名称以及 MAC 地址。

例如

<interface type='bridge'>
  <mac address='52:54:00:0c:44:5d'/>
  <source bridge='br0'/>
  <target dev='v-test2'/>
  <model type='virtio'/>
</interface>
<interface type='bridge'>
  <mac address='52:54:00:0c:44:5e'/>
  <source bridge='internal'/>
  <target dev='v-test2b'/>
  <model type='virtio'/>
</interface>

所以现在我定义了两个接口,一个称为 v-test2 并将其放在桥“br0”上,另一个称为 v-test2b 并将其放在桥“internal”上

$ ip addr show v-test2
68: v-test2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
    link/ether fe:54:00:0c:44:5d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe0c:445d/64 scope link 
       valid_lft forever preferred_lft forever

$ ip addr show v-test2b
69: v-test2b: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
    link/ether fe:54:00:0c:44:5e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe0c:445e/64 scope link 
       valid_lft forever preferred_lft forever

$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.0025222613c0       no              eth0
....
                                                        v-test2

internal                8000.fe54000c445e       no              v-test2b

在客人里面我们看到了他们:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:0c:44:5d brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:0c:44:5e brd ff:ff:ff:ff:ff:ff

这使得准确定义每个虚拟机拥有的接口、MAC 地址和桥接成为可能。

相关内容