
Administrer un serveur KVM depuis votre poste de travail évite les connexions SSH multiples et permet d'utiliser l'interface graphique de virt-manager. Ce guide vous montre comment configurer l'accès distant de façon sécurisée.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Vous connecter à libvirt via SSH, la méthode recommandée
- Utiliser virsh en ligne de commande sur un hôte distant
- Configurer virt-manager pour piloter plusieurs hyperviseurs
- Décrypter les URIs de connexion libvirt et leurs pièges
- Ouvrir un accès TCP ou TLS par activation de socket, quand SSH ne suffit pas
Prérequis
Section intitulée « Prérequis »Sur votre poste de travail (client) :
libvirt-clientou équivalent installé- Clés SSH configurées (recommandé)
virt-managersi vous voulez l'interface graphique
Sur le serveur KVM (distant) :
- libvirt installé et fonctionnel
- Service SSH actif
- Votre utilisateur dans le groupe
libvirt
Comprendre les URIs de connexion libvirt
Section intitulée « Comprendre les URIs de connexion libvirt »libvirt utilise des URIs (Uniform Resource Identifiers) pour identifier où se connecter. C'est comme une URL, mais pour les hyperviseurs.
Format général
Section intitulée « Format général »Un URI libvirt se lit de gauche à droite comme une adresse postale : le driver dit à quel hyperviseur on parle (qemu pour KVM), le transport dit par quel canal on l'atteint, et le path final dit quel jeu de machines on veut voir. Seul le driver est obligatoire, tout le reste se déduit d'une valeur par défaut quand on l'omet.
driver[+transport]://[username@]hostname[:port]/path[?parameters]Les URIs les plus courants
Section intitulée « Les URIs les plus courants »Cinq formes couvrent la quasi-totalité des usages. La colonne Sécurité est celle qui doit guider le choix : deux de ces URIs restent locaux à la machine, deux chiffrent le trafic, et un seul le laisse circuler en clair sur le réseau.
| URI | Description | Sécurité |
|---|---|---|
qemu:///system | Local, VMs système (root/libvirt) | Local |
qemu:///session | Local, VMs utilisateur | Local |
qemu+ssh://user@host/system | Distant via SSH | Chiffré |
qemu+tcp://host/system | Distant via TCP | Non chiffré |
qemu+tls://host/system | Distant via TCP + TLS | Chiffré |
system vs session : la différence
Section intitulée « system vs session : la différence »Le suffixe de l'URI ne change pas l'hyperviseur interrogé, il change le socket auquel le client se branche, et donc le lot de machines qu'il voit. Une VM créée en /session reste invisible depuis /system, et réciproquement : c'est l'explication numéro un du « ma VM a disparu » après un changement d'URI.
| URI | VMs visibles | Socket | Permissions |
|---|---|---|---|
/system | Toutes les VMs de l'hôte | /run/libvirt/libvirt-sock | Groupe libvirt ou root |
/session | VMs de l'utilisateur uniquement | $XDG_RUNTIME_DIR/libvirt/libvirt-sock | Utilisateur courant |
Pour l'administration serveur, utilisez toujours /system.
Méthode 1 : Connexion SSH (recommandée)
Section intitulée « Méthode 1 : Connexion SSH (recommandée) »La connexion via SSH est la plus simple et la plus sécurisée. Elle utilise le tunnel SSH existant, pas de port supplémentaire à ouvrir.
Comment ça fonctionne
Section intitulée « Comment ça fonctionne »Il n'y a aucun démon supplémentaire à exposer : le transport SSH se contente de relayer, dans un tunnel chiffré, la conversation que le client aurait eue avec le socket local du serveur. C'est pour cette raison qu'un serveur déjà joignable en SSH est déjà prêt pour l'accès distant libvirt.
Le schéma se lit en trois temps :
- Votre client (virsh ou virt-manager) ouvre une connexion SSH vers le serveur.
- Il y démarre un relais qui se branche sur le socket
/run/libvirt/libvirt-sock. Par défaut (paramètreproxy=auto), libvirt tente d'abord le relais natifvirt-ssh-helperlivré avec le paquet, et retombe surnc -U /run/libvirt/libvirt-socksi ce binaire est absent du serveur. - Toutes les commandes suivantes passent par ce tunnel, sans port supplémentaire ouvert sur le pare-feu.
Vérifier les prérequis côté serveur
Section intitulée « Vérifier les prérequis côté serveur »Ces trois contrôles se font dans cet ordre parce qu'ils isolent trois causes différentes : le transport SSH, les droits de votre compte, puis le service libvirt lui-même. Un échec de connexion distante vient presque toujours de l'un des trois, et les tester séparément évite de chercher au mauvais endroit.
-
Vérifier que SSH fonctionne
Depuis votre poste :
Fenêtre de terminal ssh user@serveur-kvm hostnameDoit afficher le hostname du serveur.
-
Vérifier que l'utilisateur est dans le groupe libvirt
Sur le serveur :
Fenêtre de terminal groupsSortie attendue :
user libvirt kvmSi
libvirtn'apparaît pas :Fenêtre de terminal sudo usermod -aG libvirt $USER# Puis se reconnecter -
Vérifier que libvirt fonctionne localement
Sur le serveur :
Fenêtre de terminal virsh -c qemu:///system list --allDoit lister les VMs (même si la liste est vide).
Se connecter avec virsh
Section intitulée « Se connecter avec virsh »Depuis votre poste de travail :
virsh -c qemu+ssh://user@serveur-kvm/system list --allSortie attendue :
Id Name State----------------------------- 1 web-prod running - db-backup shut offSimplifier avec un alias
Section intitulée « Simplifier avec un alias »Pour éviter de retaper l'URI complet à chaque fois :
Option 1 : Alias shell
Ajoutez dans ~/.bashrc ou ~/.zshrc :
alias virsh-prod='virsh -c qemu+ssh://admin@prod-kvm.example.com/system'alias virsh-dev='virsh -c qemu+ssh://admin@dev-kvm.local/system'Utilisation :
virsh-prod list --allvirsh-dev start ma-vmOption 2 : Variable d'environnement
export LIBVIRT_DEFAULT_URI="qemu+ssh://admin@serveur-kvm/system"virsh list --all # Utilise automatiquement l'URIOption 3 : Configuration SSH
Ajoutez dans ~/.ssh/config :
Host kvm-prod HostName prod-kvm.example.com User admin IdentityFile ~/.ssh/id_ed25519Puis :
virsh -c qemu+ssh://kvm-prod/system listSe connecter avec virt-manager
Section intitulée « Se connecter avec virt-manager »virt-manager permet de gérer plusieurs hôtes KVM avec une interface graphique.
-
Lancer virt-manager
Fenêtre de terminal virt-manager -
Ajouter une connexion
- Menu File → Add Connection...
- Ou clic droit dans la liste → Add Connection...
-
Configurer la connexion
Champ Valeur Hypervisor QEMU/KVM Connection Cocher Connect to remote host over SSHUsername votre-user Hostname serveur-kvm.example.com -
Valider
Cliquez sur Connect. Si vos clés SSH sont configurées, la connexion s'établit automatiquement.
Dépannage SSH
Section intitulée « Dépannage SSH »Les quatre messages ci-dessous couvrent l'essentiel des échecs de connexion, et ils se distinguent par l'endroit où la chaîne casse. Les deux premiers viennent du poste client ou des droits du compte, le troisième du serveur libvirt, le dernier n'est pas une erreur mais une lenteur. Lisez le message exact avant de changer quoi que ce soit : ils se ressemblent peu, et chacun a une cause unique.
| Symptôme | Cause probable | Solution |
|---|---|---|
Permission denied (publickey) | Clé SSH non configurée | Configurer l'authentification par clé |
Cannot recv data: Connection reset by peer | Utilisateur pas dans groupe libvirt | sudo usermod -aG libvirt user |
error: failed to connect socket | libvirt non démarré sur le serveur | sudo systemctl start libvirtd |
| Connexion très lente | Résolution DNS inverse | Ajouter UseDNS no dans /etc/ssh/sshd_config |
Tester la connexion manuellement :
# Vérifier que le socket est accessible via SSHssh user@serveur-kvm "ls -la /run/libvirt/libvirt-sock"Sortie attendue :
srw-rw---- 1 root libvirt 0 Jan 31 10:00 /run/libvirt/libvirt-sockMéthode 2 : Connexion TCP (avancé)
Section intitulée « Méthode 2 : Connexion TCP (avancé) »Contrairement au transport SSH, le transport TCP ouvre un véritable service réseau sur le serveur, avec son port et son authentification propres. Trois situations le justifient : une restriction réseau qui interdit SSH, une migration live entre hyperviseurs où le coût du chiffrement SSH se voit, ou un réseau de management physiquement séparé du trafic de production.
Activer l'écoute TCP sur le serveur
Section intitulée « Activer l'écoute TCP sur le serveur »C'est systemd qui ouvre le port, pas le fichier de configuration. Sur toute
distribution récente, libvirtd est lancé par activation de socket : des
unités .socket détiennent les ports et démarrent le démon à la première
connexion. Dans ce mode, les directives listen_tcp et listen_tls de
libvirtd.conf ne servent plus à rien, et l'option --listen non plus.
Le fichier de configuration livré par la distribution le dit lui-même, juste au-dessus de ces directives :
# This setting is not required or honoured if using systemd socket# activation.Vérifiez d'abord que vous êtes bien dans ce cas, ce qui est la situation normale :
systemctl list-unit-files 'libvirtd*.socket'Si la liste contient libvirtd-tcp.socket et libvirtd-tls.socket, tout se
règle par ces unités. Activer l'écoute se réduit alors à démarrer la bonne
socket, et rien d'autre n'est à modifier dans le fichier de configuration :
-
Démarrer la socket voulue
Fenêtre de terminal sudo systemctl enable --now libvirtd-tls.socketPour un lab sur réseau isolé, et en connaissance de cause, la variante non chiffrée est
libvirtd-tcp.socket. -
Redémarrer le démon pour qu'il reprenne ses sockets
Fenêtre de terminal sudo systemctl restart libvirtd -
Vérifier l'écoute
Fenêtre de terminal ss -tlnp | grep -E '16509|16514'Le port 16514 correspond à TLS, le 16509 au TCP en clair.
-
Ouvrir le pare-feu sur le port correspondant
Fenêtre de terminal sudo ufw allow 16514/tcp # Ubuntu, TLSsudo firewall-cmd --permanent --add-port=16514/tcp && sudo firewall-cmd --reload # RHELRemplacez par 16509 si vous avez délibérément choisi la socket en clair.
Démons modulaires : virtproxyd remplace libvirtd
Section intitulée « Démons modulaires : virtproxyd remplace libvirtd »Les distributions qui ont migré vers les démons modulaires n'ont plus de
libvirtd du tout : virtqemud, virtnetworkd et virtstoraged se partagent
le travail selon le domaine, et c'est virtproxyd qui expose l'accès
distant en routant les demandes vers le bon démon. La logique reste
exactement la même, seules les unités changent de nom :
sudo systemctl enable --now virtproxyd-tls.socketC'est aussi le seul cas où listen_tls garde un sens : virtproxyd lit
bien sa configuration, et n'a jamais eu besoin de l'option --listen. Pour
savoir dans quelle configuration vous êtes, une seule commande suffit :
systemctl list-unit-files 'libvirtd*.socket' 'virt*d.socket'Se connecter via TCP
Section intitulée « Se connecter via TCP »L'URI perd le nom d'utilisateur : il n'y a plus de compte système à traverser, donc plus rien à authentifier tant que auth_tcp vaut none. Le port 16509 étant implicite, il n'apparaît pas non plus. Depuis le client :
virsh -c qemu+tcp://serveur-kvm/system list --allConnexion TLS (production)
Section intitulée « Connexion TLS (production) »Pour une connexion TCP sécurisée, utilisez TLS avec des certificats :
- Générer une CA et des certificats (serveur + client)
- Placer les certificats dans
/etc/pki/libvirt/ - Configurer
listen_tls = 1danslibvirtd.conf
Cette configuration est plus complexe. Pour la plupart des cas, SSH reste la meilleure option.
Commandes utiles à distance
Section intitulée « Commandes utiles à distance »Une fois connecté, toutes les commandes virsh fonctionnent normalement :
# Définir l'URI par défautexport LIBVIRT_DEFAULT_URI="qemu+ssh://admin@kvm-server/system"
# Lister les VMsvirsh list --all
# Voir les infos d'une VMvirsh dominfo web-prod
# Démarrer/arrêtervirsh start ma-vmvirsh shutdown ma-vm
# Console série (avec échappement Ctrl+])virsh console ma-vm
# Voir les logs QEMU (nécessite SSH direct)ssh admin@kvm-server "tail -f /var/log/libvirt/qemu/web-prod.log"Exécuter des commandes sur plusieurs hôtes
Section intitulée « Exécuter des commandes sur plusieurs hôtes »Comme l'URI est un simple argument, une boucle shell suffit à interroger un parc entier sans outil supplémentaire. La redirection 2>/dev/null masque les messages d'erreur de libvirt pour ne garder que le message de repli, plus lisible dans une sortie qui enchaîne plusieurs serveurs. Script pour lister les VMs de plusieurs serveurs :
#!/bin/bash# list-all-vms.sh - Liste les VMs de tous les serveurs KVM
SERVERS="kvm1.example.com kvm2.example.com kvm3.example.com"
for server in $SERVERS; do echo "=== $server ===" virsh -c qemu+ssh://admin@$server/system list --all 2>/dev/null || echo " Connexion échouée" echo ""doneSécurité : bonnes pratiques
Section intitulée « Sécurité : bonnes pratiques »1. Utilisez SSH avec des clés
Section intitulée « 1. Utilisez SSH avec des clés »Jamais de mot de passe en clair. Configurez l'authentification par clé :
# Générer une clé si nécessairessh-keygen -t ed25519 -C "admin-kvm"
# Copier sur le serveurssh-copy-id admin@kvm-server2. Limitez les utilisateurs autorisés
Section intitulée « 2. Limitez les utilisateurs autorisés »Sur le serveur, seuls les utilisateurs nécessaires doivent être dans le groupe libvirt :
# Voir qui est dans le groupegetent group libvirt
# Retirer un utilisateursudo gpasswd -d utilisateur libvirt3. Utilisez des comptes dédiés
Section intitulée « 3. Utilisez des comptes dédiés »Ne pas utiliser root pour l'administration libvirt. Créez un compte dédié :
sudo useradd -m -G libvirt kvm-admin4. Restreignez l'accès SSH
Section intitulée « 4. Restreignez l'accès SSH »Les deux directives ci-dessous se complètent : AllowUsers transforme la liste des comptes autorisés en liste blanche, tout compte non cité est refusé même avec le bon mot de passe, et PermitRootLogin no ferme le compte root, cible privilégiée des attaques automatisées. Dans /etc/ssh/sshd_config :
# Autoriser seulement certains utilisateursAllowUsers kvm-admin@192.168.1.0/24
# Désactiver root loginPermitRootLogin no5. Configurez le pare-feu
Section intitulée « 5. Configurez le pare-feu »Le pare-feu prend le relais de AllowUsers une couche plus bas : il refuse la connexion avant même la réponse de sshd, ce qui retire le serveur des scans automatisés. Les deux commandes font la même chose avec les deux outils les plus répandus, ufw sur Ubuntu et firewalld sur RHEL. SSH uniquement depuis les postes d'administration :
# UFW (Ubuntu)sudo ufw allow from 192.168.1.100 to any port 22
# firewalld (RHEL/Fedora)sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept'6. Auditez les connexions
Section intitulée « 6. Auditez les connexions »Les deux journaux ne racontent pas la même histoire et se lisent ensemble. last donne les ouvertures de session sur le serveur, avec l'adresse d'origine ; le journal de libvirtd donne les clients libvirt qui se sont réellement connectés au socket. Un écart entre les deux signale un accès qui ne passe pas par le chemin prévu. Vérifiez régulièrement les connexions :
# Dernières connexions SSHlast -a | head -20
# Logs libvirtjournalctl -u libvirtd | grep -i "client"Architecture multi-hôtes
Section intitulée « Architecture multi-hôtes »Pour gérer plusieurs serveurs KVM, voici une architecture recommandée :
Dans virt-manager, vous pouvez ajouter les 3 connexions et basculer facilement entre les hôtes.
Erreurs fréquentes
Section intitulée « Erreurs fréquentes »Ces cinq messages reviennent en boucle, et quatre d'entre eux ne parlent pas de libvirt alors qu'ils s'affichent au lancement de virsh : ils viennent du transport, du service ou des droits. La bonne réflexe est de situer le message avant de chercher une cause : un refus de clé publique est un problème SSH, un refus d'authentification libvirt est un problème de groupe, et une fin de fichier en pleine lecture trahit un écart de version entre client et serveur.
| Erreur | Cause | Solution |
|---|---|---|
Failed to connect socket to '/run/libvirt/libvirt-sock' | libvirt non démarré | sudo systemctl start libvirtd |
authentication failed | Utilisateur pas dans groupe libvirt | sudo usermod -aG libvirt user |
Permission denied (publickey) | Pas de clé SSH | Configurer ssh-copy-id |
Connection refused | Port non ouvert ou service arrêté | Vérifier firewall et service |
error: End of file while reading data | Version libvirt incompatible | Mettre à jour client/serveur |
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- SSH est la méthode recommandée, simple, sécurisé, pas de config serveur
- URI =
qemu+ssh://user@host/system, mémorisez ce format - Groupe
libvirtobligatoire, sur le serveur, pour l'utilisateur distant - Clés SSH = confort, évite les mots de passe à chaque commande
- TCP sans TLS = danger, uniquement sur réseau isolé de confiance
- virt-manager = multi-hôtes, gérez tous vos serveurs depuis une interface
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Dépannage réseau KVM/libvirt : Les erreurs de connexion
qemu+sshet les pannes de réseau virtuel y sont traitées symptôme par symptôme.