Aller au contenu
Virtualisation medium

Accès distant libvirt : gérer vos VMs KVM depuis n'importe où

14 min de lecture

Logo KVM

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.

À la fin de ce guide, vous saurez :

  • Vous connecter à libvirt via SSH (méthode recommandée)
  • Utiliser virsh en ligne de commande à distance
  • Configurer virt-manager pour gérer des hôtes distants
  • Comprendre les URIs de connexion libvirt
  • Sécuriser l’accès (bonnes pratiques)

Sur votre poste de travail (client) :

  • libvirt-client ou équivalent installé
  • Clés SSH configurées (recommandé)
  • virt-manager si vous voulez l’interface graphique

Sur le serveur KVM (distant) :

  • libvirt installé et fonctionnel
  • Service SSH actif
  • Votre utilisateur dans le groupe libvirt

libvirt utilise des URIs (Uniform Resource Identifiers) pour identifier où se connecter. C’est comme une URL, mais pour les hyperviseurs.

driver[+transport]://[username@]hostname[:port]/path[?parameters]
URIDescriptionSécurité
qemu:///systemLocal, VMs système (root/libvirt)
qemu:///sessionLocal, VMs utilisateur
qemu+ssh://user@host/systemDistant via SSH🔒 Chiffré
qemu+tcp://host/systemDistant via TCP⚠️ Non chiffré
qemu+tls://host/systemDistant via TCP + TLS🔒 Chiffré
URIVMs visiblesSocketPermissions
/systemToutes les VMs de l’hôte/run/libvirt/libvirt-sockGroupe libvirt ou root
/sessionVMs de l’utilisateur uniquement$XDG_RUNTIME_DIR/libvirt/libvirt-sockUtilisateur courant

Pour l’administration serveur, utilisez toujours /system.

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.

Connexion SSH vers libvirt

  1. Votre client (virsh/virt-manager) ouvre une connexion SSH
  2. Il exécute nc -U /run/libvirt/libvirt-sock sur le serveur
  3. Toutes les commandes passent par ce tunnel
  1. Vérifier que SSH fonctionne

    Depuis votre poste :

    Fenêtre de terminal
    ssh user@serveur-kvm hostname

    Doit afficher le hostname du serveur.

  2. Vérifier que l’utilisateur est dans le groupe libvirt

    Sur le serveur :

    Fenêtre de terminal
    groups

    Sortie attendue :

    user libvirt kvm

    Si libvirt n’apparaît pas :

    Fenêtre de terminal
    sudo usermod -aG libvirt $USER
    # Puis se reconnecter
  3. Vérifier que libvirt fonctionne localement

    Sur le serveur :

    Fenêtre de terminal
    virsh -c qemu:///system list --all

    Doit lister les VMs (même si la liste est vide).

Depuis votre poste de travail :

Fenêtre de terminal
virsh -c qemu+ssh://user@serveur-kvm/system list --all

Sortie attendue :

Id Name State
-----------------------------
1 web-prod running
- db-backup shut off

Pour éviter de retaper l’URI complet à chaque fois :

Option 1 : Alias shell

Ajoutez dans ~/.bashrc ou ~/.zshrc :

Fenêtre de terminal
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 :

Fenêtre de terminal
virsh-prod list --all
virsh-dev start ma-vm

Option 2 : Variable d’environnement

Fenêtre de terminal
export LIBVIRT_DEFAULT_URI="qemu+ssh://admin@serveur-kvm/system"
virsh list --all # Utilise automatiquement l'URI

Option 3 : Configuration SSH

Ajoutez dans ~/.ssh/config :

Host kvm-prod
HostName prod-kvm.example.com
User admin
IdentityFile ~/.ssh/id_ed25519

Puis :

Fenêtre de terminal
virsh -c qemu+ssh://kvm-prod/system list

virt-manager permet de gérer plusieurs hôtes KVM avec une interface graphique.

  1. Lancer virt-manager

    Fenêtre de terminal
    virt-manager
  2. Ajouter une connexion

    • Menu FileAdd Connection…
    • Ou clic droit dans la liste → Add Connection…
  3. Configurer la connexion

    ChampValeur
    HypervisorQEMU/KVM
    Connection✅ Connect to remote host over SSH
    Usernamevotre-user
    Hostnameserveur-kvm.example.com

    ![Configuration connexion virt-manager](data:image/svg+xml,)

  4. Valider

    Cliquez sur Connect. Si vos clés SSH sont configurées, la connexion s’établit automatiquement.

SymptômeCause probableSolution
Permission denied (publickey)Clé SSH non configuréeConfigurer l’authentification par clé
Cannot recv data: Connection reset by peerUtilisateur pas dans groupe libvirtsudo usermod -aG libvirt user
error: failed to connect socketlibvirt non démarré sur le serveursudo systemctl start libvirtd
Connexion très lenteRésolution DNS inverseAjouter UseDNS no dans /etc/ssh/sshd_config

Tester la connexion manuellement :

Fenêtre de terminal
# Vérifier que le socket est accessible via SSH
ssh user@serveur-kvm "ls -la /run/libvirt/libvirt-sock"

Sortie attendue :

srw-rw---- 1 root libvirt 0 Jan 31 10:00 /run/libvirt/libvirt-sock

La connexion TCP est utile quand :

  • Vous ne pouvez pas utiliser SSH (restrictions réseau)
  • Vous avez besoin de performances maximales (migration live)
  • Vous avez un réseau de management isolé
  1. Éditer la configuration libvirtd

    Fenêtre de terminal
    sudo nano /etc/libvirt/libvirtd.conf

    Décommentez ou ajoutez :

    # Écouter sur TCP (sans TLS pour le lab)
    listen_tls = 0
    listen_tcp = 1
    # Port d'écoute (16509 par défaut)
    tcp_port = "16509"
    # Adresse d'écoute (0.0.0.0 = toutes les interfaces)
    listen_addr = "0.0.0.0"
    # Authentification (none = pas d'auth, DANGEREUX)
    # Utilisez sasl pour de l'authentification
    auth_tcp = "none"
  2. Activer l’écoute réseau

    Pour les systèmes avec systemd, créez un override :

    Fenêtre de terminal
    sudo systemctl edit libvirtd

    Ajoutez :

    [Service]
    ExecStart=
    ExecStart=/usr/sbin/libvirtd --listen

    Ou modifiez /etc/default/libvirtd :

    Fenêtre de terminal
    LIBVIRTD_ARGS="--listen"
  3. Redémarrer libvirtd

    Fenêtre de terminal
    sudo systemctl restart libvirtd
  4. Vérifier l’écoute

    Fenêtre de terminal
    ss -tlnp | grep 16509

    Sortie attendue :

    LISTEN 0 128 0.0.0.0:16509 0.0.0.0:* users:(("libvirtd",pid=1234,fd=18))
  5. Ouvrir le pare-feu

    Fenêtre de terminal
    sudo ufw allow 16509/tcp # Ubuntu
    # ou
    sudo firewall-cmd --permanent --add-port=16509/tcp && sudo firewall-cmd --reload # RHEL/Fedora

Depuis le client :

Fenêtre de terminal
virsh -c qemu+tcp://serveur-kvm/system list --all

Pour une connexion TCP sécurisée, utilisez TLS avec des certificats :

  1. Générer une CA et des certificats (serveur + client)
  2. Placer les certificats dans /etc/pki/libvirt/
  3. Configurer listen_tls = 1 dans libvirtd.conf

Cette configuration est plus complexe. Pour la plupart des cas, SSH reste la meilleure option.

Une fois connecté, toutes les commandes virsh fonctionnent normalement :

Fenêtre de terminal
# Définir l'URI par défaut
export LIBVIRT_DEFAULT_URI="qemu+ssh://admin@kvm-server/system"
# Lister les VMs
virsh list --all
# Voir les infos d'une VM
virsh dominfo web-prod
# Démarrer/arrêter
virsh start ma-vm
virsh 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"

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 ""
done

Jamais de mot de passe en clair. Configurez l’authentification par clé :

Fenêtre de terminal
# Générer une clé si nécessaire
ssh-keygen -t ed25519 -C "admin-kvm"
# Copier sur le serveur
ssh-copy-id admin@kvm-server

Sur le serveur, seuls les utilisateurs nécessaires doivent être dans le groupe libvirt :

Fenêtre de terminal
# Voir qui est dans le groupe
getent group libvirt
# Retirer un utilisateur
sudo gpasswd -d utilisateur libvirt

Ne pas utiliser root pour l’administration libvirt. Créez un compte dédié :

Fenêtre de terminal
sudo useradd -m -G libvirt kvm-admin

Dans /etc/ssh/sshd_config :

# Autoriser seulement certains utilisateurs
AllowUsers kvm-admin@192.168.1.0/24
# Désactiver root login
PermitRootLogin no

SSH uniquement depuis les postes d’administration :

Fenêtre de terminal
# 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'

Vérifiez régulièrement les connexions :

Fenêtre de terminal
# Dernières connexions SSH
last -a | head -20
# Logs libvirt
journalctl -u libvirtd | grep -i "client"

Pour gérer plusieurs serveurs KVM, voici une architecture recommandée :

Architecture multi-hôtes libvirt

Dans virt-manager, vous pouvez ajouter les 3 connexions et basculer facilement entre les hôtes.

ErreurCauseSolution
Failed to connect socket to '/run/libvirt/libvirt-sock'libvirt non démarrésudo systemctl start libvirtd
authentication failedUtilisateur pas dans groupe libvirtsudo usermod -aG libvirt user
Permission denied (publickey)Pas de clé SSHConfigurer ssh-copy-id
Connection refusedPort non ouvert ou service arrêtéVérifier firewall et service
error: End of file while reading dataVersion libvirt incompatibleMettre à jour client/serveur
  1. SSH est la méthode recommandée — simple, sécurisé, pas de config serveur
  2. URI = qemu+ssh://user@host/system — mémorisez ce format
  3. Groupe libvirt obligatoire — sur le serveur, pour l’utilisateur distant
  4. Clés SSH = confort — évite les mots de passe à chaque commande
  5. TCP sans TLS = danger — uniquement sur réseau isolé de confiance
  6. virt-manager = multi-hôtes — gérez tous vos serveurs depuis une interface

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.