Lister la génération des machines virtuelles

Si vous avez besoin de liste vos machines virtuelles (VM) et de connaitre leur génération (generation 1 ou 2), vous pouvez le faire relativement simplement avec une commande Powershell.

Depuis l’hyperviseur

Vous pouvez lancer la commande suivante depuis votre serveur hôte Microsoft Windows Server, ou Hyper-V directement comme dans l’exemple ci-dessous.

Get-VM | Select Name, Generation | Sort Name -Descending
Depuis l’hyperviseur

Depuis la machine virtuelle

Vous pouvez également lancer la commande suivante dans votre machine virtuelle (guest) si vous n’avez pas, vous-même, accès à l’hyperviseur, comme dans l’exemple ci-dessous.

Get-WmiObject -Class Win32_BIOS | Select Manufacturer
  • La valeur American Megatrends Inc. correspond à génération 1
  • La valeur Microsoft Corporation correspond à génération 2
Depuis la machine virtuelle, dans ce cas, génération 2
Depuis la machine virtuelle, dans ce cas génération 1

La différence

Les VMs de génération 1 utilisent un émulateur de BIOS et supportent deux contrôleurs IDE émulés (Intel), alors que celles de génération 2 utilisent une construction UEFI en lieu et place du BIOS, ce qui permet notamment d’offrir le support pour le Secure Boot, les disques GPT bootables et présenter jusqu’à 4 contrôleurs SCSI au système.

La génération 1 permet d’émuler un lecteur de disquette, un port COM, ainsi qu’un adaptateur réseau d’ancienne génération. Ces fonctionnalitées ne sont pas possible avec la génération 2. Le lecteur DVD sur une génération 1 sera toujours présenté sous la même lettre logique.

Les VMs de génération 2 ne supportent que des disques VHDX, alors que celle de génération 1 supportent les disques VHD et VHDX. Les avantages des disques VHDX sont notamment de supporter les blocks de 4KB avec un alignent améliorés, une plus grande taille maximale de disque, une meilleure resistance en cas de perte de courant et de meilleures performances.

De manière générale, il convient d’utiliser la génération qui correspondra au système d’exploitation, ou aux contraintes spécifiques. De manière générale, si votre VM supporte la génération 2, vous feriez mieux de l’utiliser en lieu et place de la génération 1. Les performances et la fiabilité seront meilleures.

Pour plus de détails sur quels systèmes sont supportés sur quelle génération, voici la page officielle de Microsoft https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/plan/should-i-create-a-generation-1-or-2-virtual-machine-in-hyper-v

BGP avec Windows Server

Dans cet article, nous allons voir la configuration du protocole BGP avec la version Windows Server 2016 (également disponible sur Windows Server 2019) de Microsoft.

Ainsi, il est possible de configurer du routage BGP sur votre serveur et de partager des routes par le protocole de routage dynamique Border Gateway Protocol 4 (BGP4).

Ceci permet notamment de faire du routage sur l’hôte « routing on the host », ou sur les machines virtuelles installées sur votre hyperviseur Windows. Ceci permet d’ouvrir des horizons très intéressants pour vos topologies réseau.

À noter enfin que, selon mes recherches, Windows ne supporte pas le MD5 sur les sessions BGP.

Installation

Pour commencer, il faut installer les fonctionnalitées Remote Access, RSAT Remote Access Powershell et Routing en Powershell. Faites une élévation de privilège puis passez la commande Powershell suivante

Install-WindowsFeature RemoteAccess,RSAT-RemoteAccess-PowerShell,Routing

Activez le routage sur le serveur avec la commande suivante :

Install-RemoteAccess -VpnType RoutingOnly
Votre routeur BGP est prêt !

Configuration

Puis on créer un routeur BGP avec la commande suclivante

Add-BgpRouter -BgpIdentifier 172.16.30.11 -LocalASN 65534

Puis on ajoute un peer iBGP avec la commande suivante

Add-BgpPeer -LocalIPAddress 172.16.30.10 -PeerIPAddress 172.16.30.11 -PeerASN 65534 -Name SRV02
L’état est « Connecting » car l’autre serveur n’est pas encore configuré

Lorsque l’on configure le routeur et on ajoute la session BGP sur l’autre serveur la connexion s’établie

Add-BgpRouter -BgpIdentifier 172.16.30.11 -LocalASN 65534

Add-BgpPeer -LocalIPAddress 172.16.30.11 -PeerIPAddress 172.16.30.10 -PeerASN 65534 -Name SRV01
Connexion établie (depuis SRV02)
Connexion établie (depuis SRV01)

On peut ensuite ajouter des routes à annoncer. Contrairement à ce que vous connaissez certainement du BGP, il n’y a pas besoin de créer de null route dummy route pour que Windows annonce une route. Il annonce toutes les routes souhaitées sans même que celles-ci ne soient présentent dans sa table de routage.

Depuis SRV01, nous allons ajouter 8 routes /24, de 192.168.96.0 à 192.168.103.0/24

Add-BgpCustomRoute -Network 192.168.96.0/24
Add-BgpCustomRoute -Network 192.168.97.0/24
Add-BgpCustomRoute -Network 192.168.98.0/24
Add-BgpCustomRoute -Network 192.168.99.0/24
Add-BgpCustomRoute -Network 192.168.100.0/24
Add-BgpCustomRoute -Network 192.168.101.0/24
Add-BgpCustomRoute -Network 192.168.102.0/24
Add-BgpCustomRoute -Network 192.168.103.0/24

Nous allons vérifier depuis SRV02 si celles-ci sont bien reçues

Vérifications des routes depuis SRV02

Nous pouvons également résumer les routes ci-dessous avec cette commande et annoncer 192.168.96.0/21 plutôt que d’annoncer les 8 routes en /24 pour alléger la table de routage

Add-BgpRouteAggregate -Prefix 192.168.96.0/21 -SummaryOnly Enabled
SRV01 demande une confirmation

Vérifications de l’aggrégation de nos routes depuis SRV02

Vérifications de l’aggrégation depuis SRV02

Pour obtenir des informations sur votre routeur

Get-BgpRouter

Pour affichier vos peers BGP

Get-BgpPeer

Pour afficher les routes BGP

Get-BgpRouteInformation

Vous pouvez également créer des policy que vous pouvez appliquer sur des peers en ingress ou en egress en deux étapes selon l’exemple.

Pour illustrer cette policy, nous allons d’abord ajouter une route BGP, vérifier la table de routage BGP sur SRV02, puis ajouter un filtre de sortie sur la session BGP du côté SRV01 et vérifier à nouveau la table de routage côté SRV02

Ajout d’une route sur SRV01

Add-BgpCustomRoute -Network 10.10.10.10/32
Ajout d’une route sur SRV01

Vérification de la table de routage sur SRV02

Vérification de la table de routage sur SRV02

Ajout d’une policy (règle) de filtrage pour n’autoriser que le préfixe 192.168.96.0/21 à être communiqué

Add-BgpRoutingPolicy -Name SRV01_IP -MatchPrefix 192.168.96.0/21 -PolicyType Allow

Et appliquation de cette policy (règle) au peer SRV02

Add-BgpRoutingPolicyForPeer -PeerName SRV02 -PolicyName SRV01_IP -Direction Egress
Ajout de la policy (règle) et appliquation de la règle sur le peer

Vérification avant et après appliquations de la policy

Avant / après appliquations la policy

Exemple

Imaginons que nous ajoutons l’adresse IP 192.168.96.5/32 sur notre serveur SRV01 et que nous essayons de le joindre par le serveur SRV02.

Adresse IP 192.168.96.5/32 ajoutée
Vérification de la table de routage et de connectivité

Conclusion

Pouvoir faire du routage directement sur votre serveur, ou sur un serveur virtuel permet de complètement repenser votre réseau et vous affranchir d’un domaine de broadcast, risqué et contraignant à maintenir.

Imaginez un réseau ou votre serveur peer et échange ses routes directement avec votre firewall ou un routeur, sans passer par une configuration contraignante de switchs. C’est sans doute, une grande avancée pour le réseau avec Windows Server, Hyper-V et pour vos futurs utilisations dans le Cloud.

La flexibilité de pouvoir annoncer des routes en /32 vous permet une mobilité quasi infinie de votre infrastructure. Vous pouvez, par exemple, mettre en place un système de anycast BGP pour vos DNS ou pour d’autres services assurant de la haute disponibilité.

Toutes les commandes

Pour aller plus loin, voici toutes les commandes BGP existantes sur Windows Server

Add-BgpCustomRoute
Add-BgpPeer
Add-BgpRouteAggregate
Add-BgpRouter
Add-BgpRoutingPolicy
Add-BgpRoutingPolicyForPeer
Clear-BgpRouteFlapDampening
Disable-BgpRouteFlapDampening
Enable-BgpRouteFlapDampening
Get-BgpCustomRoute
Get-BgpPeer
Get-BgpRouteAggregate
Get-BgpRouteFlapDampening
Get-BgpRouteInformation
Get-BgpRouter
Get-BgpRoutingPolicy
Get-BgpStatistics
Remove-BgpCustomRoute
Remove-BgpPeer
Remove-BgpRouteAggregate
Remove-BgpRouter
Remove-BgpRoutingPolicy
Remove-BgpRoutingPolicyForPeer
Set-BgpPeer
Set-BgpRouteAggregate
Set-BgpRouteFlapDampening
Set-BgpRouter
Set-BgpRoutingPolicy
Set-BgpRoutingPolicyForPeer
Start-BgpPeer
Stop-BgpPeer

Photo d’illustration par serzhile