Aller au contenu
English
Cloud medium

Public Gateway Scaleway : sortir sans adresse publique, entrer par le bastion

Mesuré live le ·fr-par·scw 2.62.0

85 min de lecture

Une Instance sans adresse publique ne peut ni sortir sur Internet ni être jointe, et c'est exactement ce qu'on veut : une machine qu'aucun scanner ne trouvera. Reste à lui donner un chemin de sortie pour ses mises à jour, et un chemin d'entrée pour vous. La passerelle publique fait les deux, par traduction d'adresses dans un sens et par bastion SSH dans l'autre. Cette leçon construit l'ensemble, prouve chaque affirmation depuis l'intérieur de la machine, et mesure ce qui se casse quand on retire le rattachement.

  • Créer une passerelle et la rattacher à un réseau privé, avec la traduction d'adresses.
  • Prouver qu'une Instance sans adresse publique atteint Internet, et sous quelle identité.
  • Publier un service interne sur un port public, sans lui donner d'adresse.
  • Vous connecter par le bastion SSH, avec le bon utilisateur, ce qui n'est pas celui qu'on croit.
  • Retrouver l'adresse privée d'une Instance, qui ne se cherche pas là où on la cherche.
  • Supprimer dans l'ordre, en sachant ce que chaque dépendance refuse.

Pourquoi retirer l'adresse publique d'une machine ?

Section intitulée « Pourquoi retirer l'adresse publique d'une machine ? »

Parce qu'une adresse publique est une surface d'attaque permanente, et que la plupart des machines n'en ont aucun besoin. Un serveur applicatif derrière un équilibreur de charge, une base de données, un travailleur de file d'attente : aucun n'a de raison d'être joignable depuis Internet.

Ce qu'ils ont besoin de faire, en revanche, c'est sortir : télécharger des correctifs, appeler une API externe, envoyer des journaux. C'est là que la passerelle intervient.

Sans passerelleAvec passerelle
soit une adresse publique, soit aucune sortiesortie possible sans adresse publique
chaque machine exposée est une cibleune seule adresse publique, celle de la passerelle
accès SSH par adresse publique sur chaque machineun bastion unique, avec les clés du Projet
chaque machine porte une facture d'adresseune adresse pour tout le réseau privé

Le raisonnement de sécurité est celui du point d'entrée unique. Vous ne supprimez pas le risque, vous le concentrez sur un composant que vous pouvez surveiller, restreindre par liste d'adresses autorisées, et dont vous maîtrisez la version.

Le gabarit se choisit sur la bande passante, et il se change ensuite. C'est l'une des rares décisions non irréversibles de ce chapitre.

Les valeurs se lisent dans l'API plutôt que dans une page :

Fenêtre de terminal
scw vpc-gw gateway-type list zone=fr-par-1 -o json
GabaritBande passanteQuand le choisir
VPC-GW-S100 Mbit/squelques machines qui téléchargent des correctifs
VPC-GW-M1 Gbit/strafic sortant applicatif régulier
VPC-GW-L3 Gbit/splusieurs dizaines de machines actives
VPC-GW-XL10 Gbit/ssortie massive, sauvegardes vers l'extérieur

Relevé le 10 septembre 2026 avec scw 2.62.0.

  1. Créez le réseau privé, s'il n'existe pas déjà.

    Fenêtre de terminal
    VPC=$(scw vpc vpc create name=demo-vpc region=fr-par -o json | jq -r .id)
    PN=$(scw vpc private-network create name=demo-pn vpc-id="$VPC" \
    region=fr-par -o json | jq -r .id)
  2. Réservez une adresse publique pour la passerelle, puis créez-la avec le bastion activé.

    Fenêtre de terminal
    IPID=$(scw vpc-gw ip create zone=fr-par-1 -o json | jq -r .id)
    GW=$(scw vpc-gw gateway create name=demo-gw type=VPC-GW-S ip-id="$IPID" \
    enable-bastion=true bastion-port=61000 zone=fr-par-1 -o json | jq -r .id)
    scw vpc-gw gateway get "$GW" zone=fr-par-1 -o json

    La sortie doit afficher "status":"allocating", puis "running" après quelques dizaines de secondes. Le port du bastion se choisit entre 1024 et 59999, et 61000 est la valeur par défaut, choisie pour éviter les conflits.

  3. Créez l'Instance sans aucune adresse publique, puis rattachez-la au réseau privé.

    Fenêtre de terminal
    SRV=$(scw instance server create name=demo-priv type=DEV1-S \
    image=ubuntu_noble zone=fr-par-1 ip=none -o json | jq -r .id)
    scw instance private-nic create server-id="$SRV" \
    private-network-id="$PN" zone=fr-par-1

    La sortie de création doit afficher "public_ip": null : c'est le point de départ de tout le reste.

  4. Rattachez la passerelle au réseau privé, avec la traduction d'adresses et l'annonce de la route par défaut.

    Fenêtre de terminal
    GWNET=$(scw vpc-gw gateway-network create gateway-id="$GW" \
    private-network-id="$PN" enable-masquerade=true push-default-route=true \
    zone=fr-par-1 -o json | jq -r .id)
    scw vpc-gw gateway-network get "$GWNET" zone=fr-par-1 -o json

    La sortie doit afficher "masquerade_enabled":true puis, après quelques secondes, "status":"ready".

Pas là où vous allez la chercher. C'est le premier piège du lab, et il fait perdre un temps déraisonnable parce que la commande ne renvoie aucune erreur : elle renvoie une liste vide.

L'adresse réservée par IPAM n'est pas attachée au serveur, elle est attachée à sa carte réseau privée. Un filtre sur l'identifiant du serveur ne trouve donc rien :

Fenêtre de terminal
# Ne renvoie RIEN, sans erreur
scw ipam ip list resource-id="$SRV" region=fr-par

La bonne requête passe par le réseau privé, puis retient les adresses de type instance_private_nic :

Fenêtre de terminal
scw ipam ip list private-network-id="$PN" region=fr-par -o json

Sur le lab du 10 septembre 2026, cette commande a renvoyé trois entrées, et c'est instructif :

AdresseType de ressourceCe que c'est
172.16.0.2/22instance_private_nicvotre Instance
172.16.0.3/22vpc_gateway_networkla passerelle, qui prend aussi une adresse
une adresse en fdb2:…/64instance_private_nicl'IPv6 de la même carte

Retenez la deuxième ligne : la passerelle consomme une adresse du réseau privé, et c'est celle qui deviendra la route par défaut de vos machines.

Une passerelle qui « devrait » fonctionner ne prouve rien : il faut regarder depuis l'intérieur de la machine. Et pour y entrer sans adresse publique, on passe par le bastion.

Une fois connecté, deux commandes suffisent à tout prouver :

Fenêtre de terminal
ip route | grep '^default'
curl -s https://ifconfig.me

La traduction d'adresses se prouve par une égalité, et il suffit de deux commandes pour l'obtenir. Relevé le 10 septembre 2026 avec scw 2.62.0, depuis une Instance jointe par le bastion : la première a renvoyé default via 172.16.0.3 dev ens6 proto dhcp, c'est-à-dire l'adresse privée de la passerelle, poussée automatiquement par l'annonce de route par défaut. La seconde a renvoyé 203.0.113.10, qui était exactement l'adresse publique de la passerelle réservée au début du lab. Ces deux valeurs suffisent : la machine ne porte aucune adresse publique, et pourtant Internet la voit sous celle de la passerelle, qui réécrit l'adresse source de chaque paquet sortant. Toutes les machines du même réseau privé partageront cette identité unique, avec une conséquence directe en exploitation. Quand un service tiers filtre par adresse source, une place de marché d'API ou un pare-feu partenaire, c'est l'adresse de la passerelle qu'il faut lui déclarer, jamais celle des Instances, qui n'existe que dans le réseau privé.

Les ressources d'un réseau privé portent un nom résolvable, ce qui évite de manipuler des adresses qui changent :

<nom-de-la-ressource>.<nom-du-reseau-prive>.internal

Vérifié sur le lab : la connexion par ce nom aboutit exactement comme par l'adresse. C'est la forme à préférer dans une configuration, parce qu'elle survit à la recréation d'une machine.

Comment publier un service interne sans lui donner d'adresse ?

Section intitulée « Comment publier un service interne sans lui donner d'adresse ? »

Par une règle PAT, qui fait entrer le trafic là où la traduction d'adresses le faisait sortir. PAT signifie Port Address Translation : la passerelle écoute sur un de ses ports publics et renvoie tout ce qui y arrive vers un couple adresse privée et port interne. Le service reste sans adresse publique, mais devient joignable.

C'est la moitié du produit que les tutoriels oublient, alors qu'elle décide souvent du choix d'architecture.

  1. Faites tourner un service sur l'Instance privée, ici un serveur web sur le port 8080.

    Fenêtre de terminal
    python3 -m http.server 8080 --directory /root
  2. Publiez ce port sur un port public de la passerelle.

    Fenêtre de terminal
    RULE=$(scw vpc-gw pat-rule create gateway-id="$GW" public-port=18080 \
    private-ip=172.16.16.2 private-port=8080 protocol=tcp zone=fr-par-1 \
    -o json | jq -r .id)
    scw vpc-gw pat-rule list gateway-ids.0="$GW" zone=fr-par-1 -o json

    Le protocole accepte tcp, udp ou both. La sortie doit afficher la règle avec ses quatre valeurs, par exemple "public_port":18080 et "private_ip":"172.16.16.2".

  3. Vérifiez depuis l'extérieur, sur votre poste et non depuis l'Instance.

    Fenêtre de terminal
    curl -s http://<adresse-publique-de-la-passerelle>:18080/

    La sortie doit afficher la page servie par l'Instance. Sur le lab du 10 septembre 2026, curl http://203.0.113.20:18080/ a renvoyé le contenu d'une machine qui n'avait aucune adresse publique.

Parce que le filtre ne s'appelle pas comme on l'écrit spontanément. En version 2.62.0, scw vpc-gw pat-rule list attend gateway-ids.{index}, au pluriel et indexé, et non gateway-id :

Fenêtre de terminal
scw vpc-gw pat-rule list gateway-ids.0="$GW" zone=fr-par-1 -o json

Avec la forme au singulier, le CLI répond unknown argument 'gateway-id' et sort en code 1. Jusque-là, rien de perdu. Le piège vient de -o json : dans ce mode, le message d'erreur part sur la sortie d'erreur au format JSON, la sortie standard reste vide, et l'objet renvoyé ressemble à ceci :

{"message":"unknown argument 'gateway-id'","error":{},"hint":"Valid arguments are: order-by, gateway-ids.{index}, private-ips.{index}, protocol, zone"}

Un script qui fusionne les deux flux avec 2>&1 puis lit la clé pat_rules n'y trouve rien et conclut zéro règle, alors que la règle existe et fonctionne. Le script du lab de cette page est tombé exactement dans ce trou, et il a fallu la commande curl réussie pour s'apercevoir que le décompte mentait. La discipline qui l'évite tient en une ligne : ne jamais fusionner la sortie d'erreur dans un flux qu'on parse, et toujours tester le code de retour.

Tout se coupe, y compris le chemin du bastion, et c'est logique une fois qu'on y pense. Le rattachement est ce qui relie la passerelle au réseau privé : sans lui, elle ne sait plus router vers vos machines, ni dans un sens ni dans l'autre.

Mesuré sur le lab : après suppression du rattachement, une tentative de connexion par le bastion échoue avec

Connection timed out during banner exchange

La leçon opérationnelle est qu'on ne retire pas un rattachement pour « tester » sur une infrastructure en service : on perd du même coup l'accès d'administration aux machines concernées, et il faut recréer le rattachement pour les retrouver.

LimiteValeurSource
Réseaux privés par passerelle8FAQ officielle
Passerelles par Organisation50FAQ officielle
Port du bastionentre 1024 et 59999, défaut 61000documentation du bastion
Bande passante selon le gabarit100 Mbit/s à 10 Gbit/sgateway-type list, relevé le 2026-09-10
Zones disposant de passerelles9 zones, sans fr-par-3gateway create zone=fr-par-3 renvoie Unknown service, 2026-09-10

Le plafond de 8 réseaux privés par passerelle est celui qui structure une architecture. Au-delà, il faut plusieurs passerelles, donc plusieurs adresses publiques, ce qui casse l'avantage du point de sortie unique.

Deux changements majeurs ont eu lieu et se retrouvent encore dans de vieux tutoriels. Les connaître évite de chercher des fonctions qui n'existent plus.

Le DHCP a quitté la passerelle le 12 juillet 2023 pour rejoindre les réseaux privés eux-mêmes. Les réservations statiques créées à l'époque ont été migrées, mais la configuration manuelle est dépréciée et absente de la version 2 de l'API.

La version 1 de l'API a été retirée le 3 novembre 2025, et toutes les passerelles restantes ont été automatiquement migrées en mode IPAM. Un script qui appelle encore la v1 ne fonctionne plus.

Security : combien de portes votre réseau a-t-il vraiment ?

Section intitulée « Security : combien de portes votre réseau a-t-il vraiment ? »

La question clé : combien de machines de votre infrastructure sont joignables depuis Internet, et chacune a-t-elle une raison de l'être ?

La passerelle permet de ramener ce nombre à un. Encore faut-il utiliser la liste d'adresses autorisées du bastion, sans laquelle le point d'entrée unique reste ouvert au monde entier.

La discipline : aucune adresse publique par défaut sur les machines, et une liste d'adresses autorisées sur le bastion, restreinte aux réseaux depuis lesquels vous administrez réellement.

Operational Excellence : que se passe-t-il si la passerelle tombe ?

Section intitulée « Operational Excellence : que se passe-t-il si la passerelle tombe ? »

La question clé : vos machines perdent-elles seulement leur sortie, ou aussi votre accès d'administration ?

Les deux, comme le lab le montre. Une passerelle est donc un point de défaillance unique pour l'exploitation, et pas seulement pour le trafic sortant.

La discipline : savoir à l'avance comment reprendre la main sans elle, par la console série de l'Instance par exemple, et documenter cette procédure avant d'en avoir besoin.

Cost Optimization : payez-vous une passerelle par habitude ?

Section intitulée « Cost Optimization : payez-vous une passerelle par habitude ? »

La question clé : vos machines ont-elles réellement besoin de sortir sur Internet, ou seulement d'atteindre des services du même fournisseur ?

Une passerelle se facture à l'heure, plus le trafic traité. Pour joindre un stockage objet ou une base managée du même fournisseur, un chemin privé évite souvent ce détour et son coût.

La discipline : distinguer ce qui doit sortir sur Internet de ce qui reste chez le fournisseur, et ne router par la passerelle que le premier.

Toutes ces situations ont été rencontrées en lab le 10 septembre 2026 avec scw 2.62.0.

SymptômeCauseSolution
scw ipam ip list resource-id=<serveur> renvoie une liste vide, sans erreurl'adresse appartient à la carte réseau, pas au serveurfiltrer par private-network-id et retenir le type instance_private_nic
Permission denied (publickey,keyboard-interactive) sur le bastionl'utilisateur du rebond est bastion, pas rootssh -J bastion@<passerelle>:61000 root@<privée>
Host key verification failed. sur le rebondles options SSH ne se propagent pas au saut avec -Jpasser par un ProxyCommand explicite qui porte les mêmes options
Connection timed out during banner exchangele rattachement au réseau privé a été retirérecréer le rattachement, il porte aussi le chemin du bastion
Unknown service à la création d'une passerellela zone visée n'héberge pas le produit, fr-par-3 par exemplechoisir fr-par-1 ou fr-par-2, et vérifier au catalogue public plutôt que dans l'aide
resource is still in use, Private Network must be empty to be deleteddes ressources sont encore rattachées au réseau privédétacher les machines et la passerelle d'abord
Une clé SSH récente ne fonctionne pas sur le bastionles clés sont copiées à l'activation du bastionréimporter les clés depuis la console
unknown argument 'gateway-id' sur pat-rule listle filtre est gateway-ids.{index}, au pluriel et indexépat-rule list gateway-ids.0="$GW"
pat-rule list annonce zéro règle alors qu'elle fonctionneavec -o json, l'erreur part sur la sortie d'erreur et un 2>&1 la fait passer pour une liste videne pas fusionner les flux, et tester le code de retour
Resource already exists à la création d'une règle PATle port public est déjà attribué à une autre règlechoisir un autre port public, ou supprimer la règle existante
AntipatternConséquenceDiscipline
Donner une adresse publique à chaque machine « pour simplifier »autant de surfaces d'attaque que de machines, et autant de lignes de factureaucune adresse publique par défaut, une passerelle pour la sortie
Activer le bastion sans liste d'adresses autoriséesle point d'entrée unique est ouvert au monderestreindre aux réseaux d'administration réels
Retirer un rattachement pour tester en productionperte simultanée de la sortie et de l'accès d'administrationtester sur un réseau privé dédié
Router tout le trafic par la passerelleon paie le traitement d'un trafic qui aurait pu rester internedistinguer sortie Internet et accès aux services du fournisseur
Coder les adresses privées en durelles changent à la recréation d'une machineutiliser le nom interne en .internal
Publier un service applicatif par une règle PATaucune répartition, aucune terminaison TLS, aucun contrôle d'état du serviceréserver PAT à l'administration ponctuelle, et passer par un équilibreur pour du trafic applicatif

L'ordre compte, et les deux dépendances ne se comportent pas pareil.

  1. Supprimez les règles PAT, puis les Instances avec leurs volumes et leurs adresses.

    Fenêtre de terminal
    scw vpc-gw pat-rule delete "$RULE" zone=fr-par-1
    scw instance server terminate "$SRV" zone=fr-par-1 \
    with-block=true with-ip=true
  2. Supprimez le rattachement, puis la passerelle et son adresse.

    Fenêtre de terminal
    scw vpc-gw gateway-network delete "$GWNET" zone=fr-par-1
    scw vpc-gw gateway delete "$GW" zone=fr-par-1
    scw vpc-gw ip delete "$IPID" zone=fr-par-1
  3. Supprimez le réseau privé, puis le VPC.

    Fenêtre de terminal
    scw vpc private-network delete "$PN" region=fr-par
    scw vpc vpc delete "$VPC" region=fr-par
  4. Vérifiez le retour à zéro sur les cinq familles concernées.

    Fenêtre de terminal
    scw instance server list zone=fr-par-1 -o json
    scw vpc-gw gateway list zone=fr-par-1 -o json
    scw vpc-gw ip list zone=fr-par-1 -o json
    scw vpc private-network list region=fr-par -o json
    scw vpc vpc list region=fr-par -o json

    Les cinq sorties doivent être des listes vides.

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

6 questions
6 min.
70% requis

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

  • L'adresse publique se facture à part de la passerelle : au catalogue public du 10 septembre 2026, VPC Public Gateway IP vaut 0,005 € par heure en fr-par-1, en plus des 0,026 € du gabarit VPC-GW-S.
  • L'adresse privée d'une Instance appartient à sa carte réseau, pas au serveur : ipam ip list resource-id=<serveur> renvoie une liste vide sans erreur.
  • La passerelle consomme une adresse du réseau privé, et c'est celle qui devient la route par défaut de vos machines.
  • L'utilisateur du rebond SSH est bastion, pas root, et les clés du Projet sont copiées sur le bastion à son activation seulement. Les deux erreurs donnent le même Permission denied (publickey,keyboard-interactive), qui fait chercher du mauvais côté.
  • La traduction d'adresses se prouve en une commande : depuis l'Instance, l'adresse vue par Internet est celle de la passerelle.
  • Une règle PAT fait l'inverse : pat-rule create public-port=18080 private-ip=… private-port=8080 rend joignable un service qui n'a pas d'adresse publique.
  • Le filtre de pat-rule list est gateway-ids.0=, et avec -o json une erreur part sur la sortie d'erreur : un 2>&1 la transforme en liste vide silencieuse.
  • Retirer le rattachement coupe aussi le bastion, donc l'accès d'administration, pas seulement la sortie Internet.
  • Le réseau privé refuse d'être supprimé tant qu'il porte des ressources, alors que la passerelle, elle, accepte de disparaître même rattachée.
  • fr-par-3 n'héberge pas de passerelle : la création y renvoie Unknown service. À l'inverse, une zone absente de l'aide du CLI peut fonctionner, l'aide étant figée dans le binaire.

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