Aller au contenu
Virtualisation medium

Port forwarding NAT : exposer un service depuis une VM KVM

20 min de lecture

Votre VM est en NAT et vous voulez exposer un service (web, SSH, etc.) depuis l'extérieur ? Cette recette vous montre comment configurer le port forwarding selon votre firewall.

  • VM en NAT avec une IP fixe ou connue (ex: 192.168.122.10)
  • Accès root sur l'hôte KVM
  • Connaître le port à exposer (ex: 80 pour HTTP, 22 pour SSH)

En NAT, les VMs ne sont pas joignables depuis l'extérieur. Le port forwarding redirige un port de l'hôte vers un port de la VM :

Internet → hôte:8080 → NAT DNAT → VM:80

La règle de redirection est toujours la même sur le fond : une règle DNAT qui réécrit l'adresse de destination des paquets arrivant sur un port de l'hôte. Ce qui change, c'est l'outil qui la porte. Les trois onglets ci-dessous donnent la même configuration dans les trois systèmes de pare-feu que vous rencontrerez sur un hôte KVM. Identifiez le vôtre avant de copier quoi que ce soit.

firewalld est le firewall par défaut sur RHEL 9, Fedora, Rocky, Alma.

La sortie doit indiquer active (running). Si le service est inactif, les règles ajoutées plus bas ne seront pas appliquées.

Fenêtre de terminal
systemctl status firewalld

La première commande agit sur la configuration en cours uniquement : elle disparaîtrait au redémarrage. La seconde recopie l'état courant dans la configuration permanente, ce qui évite d'avoir à saisir la règle deux fois.

Fenêtre de terminal
# Rediriger le port 8080 de l'hôte vers le port 80 de la VM
sudo firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toaddr=192.168.122.10:toport=80
# Rendre la règle permanente
sudo firewall-cmd --runtime-to-permanent

La sortie doit reprendre la redirection exactement telle que vous l'avez saisie. Une sortie vide signifie que la règle a été posée sur une autre zone.

Fenêtre de terminal
sudo firewall-cmd --zone=public --list-forward-ports

Le retrait doit reprendre les quatre paramètres à l'identique, sinon firewalld ne reconnaît pas la règle à supprimer. Ici --permanent vise le fichier de configuration, d'où le --reload qui applique le changement à la configuration en cours.

Fenêtre de terminal
sudo firewall-cmd --zone=public --remove-forward-port=port=8080:proto=tcp:toaddr=192.168.122.10:toport=80 --permanent
sudo firewall-cmd --reload

Le test doit impérativement partir d'une autre machine que l'hôte KVM. Un curl lancé depuis l'hôte lui-même emprunte la chaîne OUTPUT et non PREROUTING : il peut réussir alors que la redirection ne fonctionne pas pour le reste du réseau, ou échouer alors qu'elle fonctionne. Vérifiez aussi que le service écoute bien sur toutes les interfaces de la VM, et pas uniquement sur 127.0.0.1.

Fenêtre de terminal
curl http://<ip-hote>:8080
# Doit afficher la page web de la VM

Ces trois symptômes se distinguent facilement l'un de l'autre, à condition de lire le message d'erreur. Un refus immédiat signifie que le paquet est arrivé quelque part et qu'on lui a répondu, donc que la redirection fonctionne au moins en partie. Un délai d'attente signifie au contraire qu'aucune réponse n'est revenue : le paquet est perdu en chemin.

ProblèmeCause probableSolution
Connection refusedService non démarré dans la VMVérifier que le service écoute sur le bon port
Connection timeoutRègle mal appliquéeVérifier les règles avec iptables -L ou nft list
Marche en local, pas en externeFirewall hôte bloqueOuvrir le port sur l'interface externe

Si vous avez besoin d'exposer plusieurs services ou de simplifier la configuration, envisagez de passer en mode bridge. Voir le guide réseau KVM.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn