MacAddress

¿VMs con MAC Address Duplicadas en Hyper-V?

*Nota importante: Si tus VMHost estan siendo administrados por System Center VMM, este articulo no aplica, ya que el rango de MAC Addresses es administrado por SCVMM.

Es posible que construyendo sus primeros Hosts de Hyper-V encuentren que algunas de sus VMs que viven en hosts diferentes tengan problemas de conectividad, esto debido a que las MAC address de las VMs se duplican y le genera conflictos a la tabla ARP de los switches. ¿Porque sucede esto?

Hyper-V tiene un mecanismo en el cual cada VMHost genera un rango de MAC Address que serán asignados a cada vNIC conectada a los vSwitches declarados dentro del Host. Esta Mac Address se conforma de la siguiente manera:

00-15-5D

– XX –

XX

– 00

Rango predefinido para HyperV Basado en el 3er Octeto de la dirección IP del Host Basado en el 4to Octeto de la direccion IP Rango inicial y Rango final

 

Los últimos 2 dígitos son “00” para el rango inicial y “FF” para el rango final.

Existe un pequeño issue con esta lógica y es que debido a que todos los servidores al momento de ser instalados, el rango de Mac Address asignado es siempre el mismo, siendo en todos los casos 00-15-5D-00-00-00 hasta  00-15-5D-00-00-FF. Si no ajustamos previamente este rango, o bien, si el vSwitch es generado antes de asignarle una dirección IP estática al VMHost, y se generan los vSwitches con el VMHost usando las direcciones IP de APIPA (Automatic Private Internet Protocol Addressing)  y  además tenemos en nuestro ambiente 2 o mas VMhosts, cada uno de estos generará MAC address para las VMs y vNICs empezando desde el rango inferior e ira incrementado en uno.  Aqui un ejemplo:

VMHost 1

VM1      00-15-5D-00-00-00

VM2      00-15-5D-00-00-01

VMHost 2

VM3      00-15-5D-00-00-00

VM4      00-15-5D-00-00-01

En el ejemplo anterior, tendriamos un conflicto con la MAC address entre la VM1 y VM3, y el mismo caso para la VM2 y VM4

¿Como evitar esto?

La recomendación es configurar previamente los rangos de MAC address que serán asignados a las VMs en cada VMHost, esto puede realizarse con Powershell y tansolo es necesario tener armada una tabla de los rangos a usar basados en la tabla mostrada al principio de esta entrada. Asi podrian armar una tabla similar a la siguiente:

Servername MinMACAddress MaxMACAddress
VMHost1 00-15-5D-46-0B-00 00-15-5D-46-0B-FF
VMHost2 00-15-5D-46-0C-00 00-15-5D-46-0C-FF
VMHost3 00-15-5D-46-0D-00 00-15-5D-46-0D-FF

En el ejemplo mostrado en la tabla, los primeros 3 bloques, es el rango pre-definido por HyperV (“00-15-5D”). Para el 4to bloque (“46”)corresponderia al 3er Octeto de las direcciones IP de nuestros VMHosts, como en nuestro caso el segmento es “172.18.70.0/24”, vemos que el 3er octeto siempre será “70”, lo cual en hexadecimal es….. “46” 🙂  . El cuarto bloque corresponde al 4to octeto de la dirección IP, por ejemplo para el VMHost1 la dirección IP es 172.18.70.11, al tomar el 4to octeto (“11”) y convertirlo a hexadecimal, obtenemos “0B” y como podrán deducir el la IP del VMHost2 es 172.18.70.12. Ya con esta tabla armada, la podemos tener en un CSV y tomar el siguiente bloque para usar en Powershell.

 


$MacAddress = import-csv C:\MacAddresses.csv
#En este loop se establece el Rango de MacAddress para cada VMHost.
foreach($server in $MacAddress ){
    if($env:computername -eq $server.ServerName){
        Set-VMHost -MacAddressMinimum $server.MinMacAddress -MacAddressMaximum $server.MaxMacAddress
    }
}

La lógica de este pedazo de código es simple. Tan solo hay que pegar en un CSV la tabla que preparamos previamente con los rangos de MAC Addresses, este archivo es importado en una variable y se procesa. Si se encuentra que el Hostname del servidor donde esta siendo ejecutado, coincide con el valor de la columna “Servername“, entonces se establece el rango de MacAddresses establecido en las columnas “MinMacAddress” y “MaxMacAddress“. Si desean hacerlo de manera manual, pueden usar el cmdlet Set-VMHost con los parametros MacAddressMinimum y MacAddressMaximum. Con esto, las MAC Address asiganadas a cada VM en cada VMHost, variaran.