Ao usar o KVM, o endereço MAC da interface no lado do host nunca é o mesmo que o endereço MAC dentro da VM, independentemente do sistema operacional. É uma consequência da rede TUN / TAP.
Por exemplo, com uma VM do CentOS 7 em execução:
$ 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
Podemos ver semelhante com uma VM do Solaris 11:
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
Portanto, não importa qual seja o sistema operacional da VM; o endereço MAC visto dentro da VM sempre será diferente daquele visto no lado do host.
Agora, você pode escolher normalmente o nome da interface no lado do host e o endereço MAC no lado do convidado por meio da configuração. Eu uso libvirt para gerenciar minhas VMs e assim no meu arquivo guest.xml eu tenho
<interface type='bridge'>
<mac address='52:54:00:0c:d8:88'/>
<source bridge='br0'/>
<target dev='v-test1'/>
<model type='virtio'/>
</interface>
Isso cria uma rede chamada "v-test1" no host e o endereço MAC dentro do convidado é especificado. Isso corresponde ao primeiro exemplo acima.
Se você especificar dois adaptadores de rede para um host, poderá escolher em qual ponte do host eles estão, o nome da interface de rede como visto no host e os endereços MAC de forma independente.
por exemplo
<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>
Então agora eu defini duas interfaces, chamei um v-test2 e coloquei na bridge "br0" e outra chamada v-test2b e coloquei na bridge "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
E dentro do convidado nós os vemos:
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
Isso torna possível definir exatamente quais interfaces e endereços MAC e pontes cada VM possui.