Gestion du réseau Hyper-V

Référence : https://technet.microsoft.com/windows-server-docs/compute/hyper-v/get-started/create-a-virtual-switch-for-hyper-v-virtual-machines

1. Commutateur virtuel

Un commutateur virtuel est une solution logicielle qui transfère le trafic réseau des machines virtuelles entre elles à la manère d'un commutateur matériel Ethernet, soit en fonction d'une table adresse MAC/numéro de port.

Un commutateur virtuel peut :

  • offrir des services de distribution d'adresses et d'options TCP/IP via DHCP,
  • s'interfacer à une interface physique
  • offrir un service NAT et "router" le trafic à la manière d'un routeur IP,
  • s'interfacer physiquement avec les protocoles 802.1 (VLANs, QoS, Etherchannel, LLDP, Spanning-Tree, etc.)
  • peut offir des services avancés de sécurité et de redondance

A condition d'y mettre les moyens matériels et financiers, les constructeurs offre la possibilité d'unifier les commutateurs virtuels à travers les hôtes qui les exécutent. Cisco Systems offre un commutateur tiers (Nexus 1000v) qui s'intègre aux produits VMWare vSphere (en remplacement des Distributed Switches), Microsoft Hyper-V (grâce aux Extensible Switches) et à Linux KVM. Ces solutions permettraient d'atteindre des objectifs du paradigme "Software Defined Network".

L'image suivante tirée de la solution Open Source Open vSwitch (http://openvswitch.org/) illustre ce concept de commutateur virtuel distribué.

2. Adapteur réseau physique et adapteur réseau virtuel

Les machines virtuelles se voient attribuer un (ou plusieurs) adapteur réseau lié à un commutateur virtuel.

Un adapteur réseau physique peut être connecté à un commutateur virtuel.

Lors de l'installation du rôle Hyper-V, du point de vue de la partiton parente (domaine 0), l'adaptateur réseau physique abandonne ses paramètres TCP/IP. Les paramètres TCP/IP de cet adapteur sont pris en charges par un adapteur virtuel spécial qui lui est lié.

Get-NetAdapter

On trouvera dans cet exemple de sortie un adapteur physique et deux adapteurs virtuels avec leur nom.

Name                      InterfaceDescription                    ifIndex Status       MacAddress
----                      --------------------                    ------- ------       ----------
Ethernet0                 Intel(R) 82574L Gigabit Network Conn...       5 Up           00-50-56-01-5C-08
vEthernet (VmNAT)         Hyper-V Virtual Ethernet Adapter #2           9 Up           00-15-5D-3A-FB-03
vEthernet (Internal1)     Hyper-V Virtual Ethernet Adapter              3 Up           00-15-5D-3A-FB-00

3. Commutateur virtuel "Private"

Ce type de commutateur est totalement isolé du trafic des autres adapteurs et commutateurs.

New-VMSwitch -name PrivateSwitch -SwitchType Private

Name          SwitchType NetAdapterInterfaceDescription
----          ---------- ------------------------------
PrivateSwitch Private

4. Commutateur virtuel "Internal"

Ce type de commutateur est accessible à partir de la partition parente à titre de gestion.

New-VMSwitch -name InternalSwitch -SwitchType Internal

Name           SwitchType NetAdapterInterfaceDescription
----           ---------- ------------------------------
InternalSwitch Internal

5. Commutateur virtuel "External"

Ce type de commutateur est lié à un adapteur réseau physique. Il offre le résultat du commutateur "ponté" à un adaptateur physique.

New-VMSwitch -name ExternalSwitch  -NetAdapterName Ethernet0

En lab, on autorisera la partition parente à accéder au commutateur virtuel qui offre les services TCP/IP du réseau local.

New-VMSwitch -name ExternalSwitch  -NetAdapterName Ethernet0 -AllowManagementOS $true

6. Commutateurs à services TCP/IP

Pour offrir des services TCP/IP comme le routage, DHCP, DHCPv6/RA, DNS, NAT et pare-feu, on peut utiliser deux solutions :

  1. une machine virtuelle à service dédié avec un adapteur connecté à un commutateur "External" et à un ou plusieurs commutateurs "Internal" ou "Private".
  2. les services intégrés à la solution de l'hôte disponibles selon les versions.

6.1. Routeur virtuel

Le principe consiste à dédier une machine virtuelle à service dédié avec un adapteur connecté à un commutateur "External" et à un ou plusieurs commutateurs "Internal" ou "Private".

On citera des solutions populaires mais mal supportées par Hyper-V comme pfSense (BSD) ou OpenWRT (support LIS).

Par contre, on peut utiliser des solutions pures Linux Debian ou RHEL dernières versions voire une solution Windows Server avec dans le rôle "Remote Access" et les services "Routing" et "DirectAccess and VPN (RAS)" activés.

D'autres solutions supportées en Linux (RouterOS, VyOS) en Cisco Systems (CSR1000v) sont disponibles.

6.2. Solution intégrée Powershell

Sans passer par une machine "routeur" virtuelle, on peut utiliser la fonction intégrée. Celle-ci a été testée sur Server 2016.

On ira lire utilement https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/setup_nat_network

New-VMSwitch -name NatSwitch -SwitchType Internal

Création d'une instance NAT

New-NetNat –Name LocalNAT –InternalIPInterfaceAddressPrefix “172.17.18.0/24”

Attribution TCP/IP fixe à l'adapteur virtuel (vEthernet)

get-netadapter "vEthernet (NatSwitch)" | New-NetIPAddress -IPAddress 172.17.18.1 -AddressFamily IPv4 -PrefixLength 24

On trouvera ici le cmdlet qui permet de configurer l'adaptateur des partitions parentes avec une adresse IPv4 fixes :

get-netadapter "Ethernet0" | New-NetIPAddress -IPAddress 172.17.18.2 -DefaultGateway 172.17.18.1 -AddressFamily IPv4 -PrefixLength 24
Netsh interface ip add dnsserver “Ethernet” address=<my DNS server>

Hors infrastructure, en lab, on utilisera utilement le rôle DHCP

7. Récapitulatif

Pour mieux comprendre les adapteurs réseaux virtualisé, on peut faire référence à ces documents :

7.1. Connecter/déconnecter une VM à un commutateur

...

7.2. Retirer un commutateur, un pool NAT

...

8. Exercice "Nested Virtualization"

Source : https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/nesting

8.1. Configure Nested Virtualization

  1. Create a virtual machine. See the prerequisites above for the required OS and VM versions.
  2. While the virtual machine is in the OFF state, run the following command on the physical Hyper-V host. This enables nested virtualization for the virtual machine.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
  1. Start the virtual machine.
  2. Install Hyper-V within the virtual machine, just like you would for a physical server. For more information on installing Hyper-V see, Install Hyper-V .

8.2. Disable Nested Virtualization

You can disable nested virtualization for a stopped virtual machine using the following PowerShell command:

Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $false

8.3. Dynamic Memory and Runtime Memory Resize

When Hyper-V is running inside a virtual machine, the virtual machine must be turned off to adjust its memory. This means that even if dynamic memory is enabled, the amount of memory will not fluctuate. For virtual machines without dynamic memory enabled, any attempt to adjust the amount of memory while it's on will fail.

Note that simply enabling nested virtualization will have no effect on dynamic memory or runtime memory resize. The incompatibility only occurs while Hyper-V is running in the VM.

8.4. Networking Options

There are two options for networking with nested virtual machines: MAC address spoofing and NAT mode.

8.5 MAC Address Spoofing

In order for network packets to be routed through two virtual switches, MAC address spoofing must be enabled on the first level of virtual switch. This is completed with the following PowerShell command.

Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On

8.6. Network Address Translation

Référence : https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/setup_nat_network

The second option relies on network address translation (NAT). This approach is best suited for cases where MAC address spoofing is not possible, like in a public cloud environment.

First, a virtual NAT switch must be created in the host virtual machine (the "middle" VM). Note that the IP addresses are just an example, and will vary across environments:

new-vmswitch -name VmNAT -SwitchType Internal
New-NetNat –Name LocalNAT –InternalIPInterfaceAddressPrefix “192.168.100.0/24”

Next, assign an IP address to the net adapter:

get-netadapter "vEthernet (VmNat)" | New-NetIPAddress -IPAddress 192.168.100.1 -AddressFamily IPv4 -PrefixLength 24

Each nested virtual machine must have an IP address and gateway assigned to it. Note that the gateway IP must point to the NAT adapter from the previous step. You may also want to assign a DNS server:

get-netadapter "Ethernet" | New-NetIPAddress -IPAddress 192.168.100.2 -DefaultGateway 192.168.100.1 -AddressFamily IPv4 -PrefixLength 24
Netsh interface ip add dnsserver “Ethernet” address=<my DNS server>

8.7. Optionnel : activer le rôle DHCP en Powershell

Source : https://blogs.technet.microsoft.com/teamdhcp/2012/07/15/bringing-powershell-to-dhcp-server/

Cet exemple est un excellent exercice d'apprentissage de l'environnement de commande.

8.8. Création de commutateurs pour le SAN, Live Migration, Management

...

Notes

Fixer une adresse IP dans la VM

New-NetIPAddress -IPAddress 172.17.18.2 -AddressFamily IPv4 -PrefixLength 24 -InterfaceAlias
"Ethernet"
Set-DnsClientServerAddress -InterfaceIndex 2 -ServerAddresses  8.8.8.8
Get-DnsClientServerAddress

Reconfigurer le client DHCP dans la VM

Set-NetIPInterface -dhcp --enabled

Attacher une NIC de VM à un switch

Connect-VMNetworkAdapter -VMname hy1 -SwitchName NatSwitch

Sur le rôle DHCP, obtenir les baux attribués

Get-DhcpServerv4Scope | Get-DhcpServerv4Lease