Publier un port de VM (DNAT) : plage hôte, bornes et refus

La modale « Nouvelle publication » de bout en bout : les cinq champs, la plage réelle 44101-44500, les messages de refus client et serveur, et la règle netfilter réellement posée.

Mettre en ligne12 min de lectureUtilisateur propriétaire de la VM

Ce que vous obtenez : Un port d'une VM joignable depuis Internet sur `hôte:port`, avec ses règles DNAT en place.

Avant de commencer

  • Une VM sur votre compte. L'interface propose toutes vos VM, en marche ou non (voir le piège « VM arrêtée » ci-dessous).
  • Un service qui écoute dans la VM sur le port que vous voulez exposer. Le DNAT redirige le trafic : si rien n'écoute, la connexion est refusée.

1.Où ouvrir le formulaire

Le DNAT se crée depuis la page Publications et de nulle part ailleurs avec un champ « Port hôte » : c'est le seul des quatre écrans de publication à offrir ce champ. Les modales du tableau de bord, de la liste des VMs et de la fiche VM créent, elles aussi, un DNAT, mais sans jamais demander le port hôte, qui est alors toujours attribué automatiquement.

  1. Barre latérale « Publications »
  2. Bouton « + Nouvelle publication »
Ouvrir la page PublicationsLe bouton « + Nouvelle publication » est en haut à droite, à côté du compteur.

Cette modale ne fait que du DNAT

Elle ne propose ni HTTP ni HTTPS, ni nom de domaine : seulement « Port VM », « Port hôte » et « Protocole ». Le sous-titre de la modale le dit en une phrase : « Publie un port de VM sur l'hôte via DNAT. Le port hôte est attribué automatiquement si non spécifié. » Les proxys web (nom de domaine + HTTPS) se créent depuis le tableau de bord, la liste des VMs ou la fiche d'une VM.

La modale « Nouvelle publication » au moment de l'ouverture. (cliquez la capture pour l'agrandir)

2.Les cinq champs, dans l'ordre où ils s'affichent

L'ordre compte : le protocole vient après le port hôte, et il n'y a aucun champ de type (la modale ne sait faire que du DNAT).

ChampType et bornes réellesRemarque
Nomtexte, placeholder ma-publicationJamais le nom final : le serveur ajoute un suffixe (voir les pièges)
VMmenu : options « Sélectionner une VM », puis le nom de chaque VMToutes vos VM, en marche ou non
Port VMnombre, min=1 max=65535, placeholder 8080Le port dans la VM, le seul champ qui accepte 1-65535
Port hôte (optionnel)nombre, min=44101 max=44500, placeholder AutoVide = allocation automatique. C'est ici que tout se joue
Protocolemenu : TCP (défaut) ou UDPDeux valeurs seulement, jamais « les deux »

Les bornes 44101/44500 ne sont pas décoratives : le champ HTML les refuse, et le serveur refuse la même plage de son côté. La plage est celle de l'hôte entier, pas de votre compte.

3.Demander un port hôte : ce qui est refusé, et quand

Deux contrôles se succèdent. Le navigateur refuse d'abord, sans envoyer la moindre requête ; puis le serveur refuse à son tour avec le même intervalle. Un message affiché dans le champ ne veut donc pas dire que le serveur a parlé.

  1. 1

    Un port hors de la plage est refusé sur place

    Saisir 44000 dans « Port hôte (optionnel) » puis cliquer « Créer la publication » affiche, sous le champ : « Le port hôte doit être compris entre 44101 et 44500. ». Aucune requête n'est émise : le refus est purement local.

  2. 2

    Un port privilégié a son propre message

    Saisir 22 affiche : « Le port 22 est un port privilégié réservé aux services de la plateforme. Choisissez un port entre 44101 et 44500. ». Là encore, aucune requête n'est émise. Le seuil réel est 1024 : 4000 ne déclenche pas ce message, il déclenche celui de la plage (vérifié : 44000 et 4000 donnent le même texte).

Refus d'un port hôte hors plage (44000) : le message apparaît sous le champ, la modale reste ouverte. (cliquez la capture pour l'agrandir)
Le serveur, lui, répond quoi ? (réponses réelles)

Ces quatre réponses sont celles du serveur, relevées en essayant depuis la page connectée :

DemandeHTTPCode d'erreurMessage serveur (recopié)
host_port: 44501400PORT_OUT_OF_RANGEhost_port 44501 est hors de la plage autorisée [44101,44500] (ANHYWHERE_PUBLISH_PORT_MIN/MAX).
host_port: 22400PORT_PRIVILEGEDhost_port 22 est un port privilégié réservé aux services de l'hôte (SSH, HTTP, HTTPS, DNS, routage). Choisissez un port dans [44101,44500].
host_port: 44324 (déjà pris par une autre publication)409PORT_ALREADY_IN_USEhost_port 44324 est déjà utilisé par une autre publication. Choisissez-en un autre, ou omettez host_port pour en obtenir un automatiquement.
même (VM, port VM) qu'une publication existante200aucun{"host_port":"44324","status":"created"}

Ce que ces réponses apprennent

La plage annoncée dans le message serveur ([44101,44500]) est exactement celle du champ, et son suffixe nomme les réglages qui la portent côté serveur. Le conflit de port est signalé avant que l'interface ne puisse le montrer : le formulaire ne connaît aucune disponibilité, il faut essayer. Enfin, le message du 409 dit lui-même la sortie de secours : omettre le port hôte.

4.Créer : ce qui se passe réellement

  1. 1

    Laisser « Port hôte » vide

    Le champ affiche Auto. C'est le mode à préférer : il ne peut pas entrer en conflit, et le serveur retire un numéro libre dans la plage.

  2. 2

    Cliquer « Créer la publication »

    La modale se ferme, la liste se recharge et le port attribué apparaît dans la colonne de droite de la nouvelle ligne, sous la forme hôte:port. Le toast de succès (« Publication créée avec succès ») ne contient pas le port : il faut le relire dans la liste.

  3. 3

    Vérifier que le port est bien celui affiché

    Une publication créée sans port demandé apparaît avec un port choisi par le serveur, pas par votre saisie. Relisez-le dans la liste avant de le communiquer.

À cet instant, le serveur a posé deux règles netfilter et une ligne en base. Les règles sont lisibles sur l'hôte :

Sur l'hôte, après création d'un DNAT TCP sur le port 44324
$ iptables -t nat -S PREROUTING
-A PREROUTING -p tcp -m tcp --dport 44324 -j DNAT --to-destination 10.0.0.42:8080

$ iptables -S FORWARD
-A FORWARD -p tcp -m tcp --dport 8080 -j ACCEPT

La première redirige le port hôte vers IP_de_la_VM:port_VM ; la seconde autorise le trafic transféré. C'est tout ce que fait une publication DNAT : aucun nom de domaine, aucun certificat, aucun proxy.

Un DNAT ne prouve rien tant que la VM ne répond pas

Une redirection posée vers une machine qui n'écoute rien ne prouve rien : la connexion est refusée avant toute réponse HTTP, alors que les deux règles ci-dessus sont bien en place. L'état que la liste affiche est MESURÉ depuis l'hôte, sur la socket de l'invitée : il ne décrit ni la ligne enregistrée, ni la règle posée, et il ne prouve rien de plus que l'écoute de l'invitée.

5.Ce que la liste montre ensuite

Chaque ligne porte : le nom réel (suffixé), un badge de protocole (TCP ou UDP), l'adresse `hôte:port`, et un badge d'état (● Joignable, ● Injoignable ou ● Pas encore mesuré). Cliquer la zone d'information de la ligne ouvre la fiche de la publication.

Ouvrez la liste des publications : chaque ligne porte son protocole, son adresse hôte:port et son état de joignabilité mesuré. (cliquez la capture pour l'agrandir)
Voir la liste des publicationsLa colonne « Auto » n'apparaît que pour les proxys web ; un DNAT affiche toujours son port.

Les pièges, en résumé

Le nom que vous saisissez n'est jamais le nom final

Saisir site-vitrine produit site-vitrine-0745 ; saisir api-interne produit api-interne-17f3. Le serveur ajoute quatre caractères hexadécimaux aléatoires puis met le tout en minuscules. Aucun réglage ne permet un nom stable, et ce nom est ce que vous retrouverez partout, y compris dans l'adresse de la fiche.

La plage de 44101 à 44500 est partagée par toute l'instance

Elle compte 400 ports, pas 400 par compte ni 400 par projet. Ce que vous voyez dans votre liste n'est donc pas tout ce qui est occupé : le port d'un autre compte vous sera refusé avec « déjà utilisé par une autre publication ».

Demander un port précis n'apporte rien, sauf une raison de le faire

Le champ HTML accepte toute la plage, mais il ne dit jamais si le port est libre. Vous ne le découvrez qu'au clic, par un 409. Si vous n'avez pas de contrainte externe, laissez Auto.

Le succès d'une création n'est pas distingué d'un doublon

Republier le même couple (VM, port VM) renvoie 200 avec {"host_port":"44324","status":"created"}, le même code de succès qu'une vraie création, et aucune ligne n'est ajoutée : la liste reste à une publication. L'interface affiche le même message dans les deux cas : on croit avoir créé une seconde publication.

Publier le port d'une machine arrêtée ne crée aucune règle

Le menu des machines n'est pas filtré sur l'état, et rien n'exige que la machine tourne : la règle est posée si et seulement si la machine a une adresse IP. Une machine jamais démarrée n'en a pas : la publication existe, le port est attribué, et rien ne redirige. Aucun mécanisme ne rattrape le retard. Ce cas n'a pas été reproduit ici.

Le nom DNS affiché n'est pas un enregistrement DNS de votre publication

Une publication DNAT affiche un nom d'hôte synthétique mais ne crée aucun enregistrement. Ce nom répond quand même : la zone DNS de la plateforme porte un joker, donc n'importe quel nom de la zone résout vers la même adresse publique. Ne comptez donc pas sur ce champ comme preuve d'un DNS, et n'en attendez pas un certificat.

Un DNAT n'est pas persisté après un redémarrage de l'hôte

Les règles sont posées au moment de la création, en mémoire. Rien ne les réécrit au démarrage : après un redémarrage de l'hôte, le port ne répond plus depuis l'extérieur, et l'état affiché ne le montre pas, puisque la sonde mesure l'écoute de l'invitée et non la règle de l'hôte. Seule une suppression puis une recréation repose la règle.

Ce guide est-il a jour ?

Chaque affirmation de cette page a ete verifiee sur le produit avant publication, et ce qui n'etait pas verifie n'a pas ete ecrit. Une page peut cependant vieillir avant le produit : si un ecran ne correspond plus a ce que vous voyez, dites-le, la page sera reprise.

Prêt à créer vos premières VMs ?

30 secondes d'inscription. 2 secondes pour la première VM. Zéro engagement.