Aller au contenu
Ouvrir la console

Déployer un stockage partagé privé sur ZCP

Ce tutoriel déploie un partage de fichiers NFS sur une VM du niveau privé créé avec Créer un réseau privé avec Headscale. Il est accessible depuis ce niveau et le réseau maillé construit dans ce tutoriel, jamais depuis Internet.

À la fin, vous aurez :

  • Une VM dans votre niveau privé existant, avec un disque de données séparé
  • Un partage NFS exporté vers le niveau et le maillage, jamais vers le réseau public
  • La confirmation que le partage fonctionne depuis un client du maillage et que seul le service SSH est accessible sur son IP publique

Prévoyez environ 20 minutes.

  • Terminez Créer un réseau privé avec Headscale : vous devez disposer d’un VPC avec un niveau privé, d’un serveur Headscale et d’un routeur de sous-réseau qui annonce et sert déjà la route du niveau. Ce tutoriel nécessite le nom exact du niveau créé, par exemple my-workspace-tier si vous avez utilisé --name my-workspace.
  • Gardez ZCP_REGION et ZCP_PROJECT exportés depuis le tutoriel précédent ou exportez-les de nouveau.
  • Utilisez le même nom de clé SSH que dans son étape 4.
  • Installez jq. Les scripts de déploiement et de suppression l’exigent.

Un seul script déploie la VM de stockage, son disque de données et l’export NFS : zcp/deploy-private-storage.sh du dépôt zsoftly/tools. Il exécute les phases expliquées dans la section suivante, dans l’ordre.

bash <(curl -fsSL https://raw.githubusercontent.com/zsoftly/tools/main/zcp/deploy-private-storage.sh) \
--ssh-key my-key --tier-name my-workspace-tier --name my-storage

Ce tutoriel utilise my-storage comme préfixe --name et my-workspace-tier comme niveau de l’exemple précédent my-workspace. Vos valeurs dépendent du --name choisi dans ce tutoriel et du précédent.

Le script lit ZCP_REGION et ZCP_PROJECT dans votre shell si vous les avez exportés. Sinon, passez --region et --project.

IndicateurRôleValeur par défaut ou exigence
--ssh-keyNom de clé utilisé par la VM de stockageObligatoire
--tier-nameNiveau privé existant à attacherObligatoire
--namePréfixe de la VM et du volumestorage
--share-nameNom du répertoire du partage NFScompany-share
--volume-sizeTaille du volume de données en GB20
--regionSlug de région zcpObligatoire (indicateur ou variable d’environnement)
--projectSlug de projet zcpObligatoire (indicateur ou variable d’environnement)
-y/--yesIgnorer l’invite de confirmationDésactivé

--tier-name n’est pas détecté automatiquement. Un compte peut contenir plusieurs niveaux privés et deviner le bon niveau représente un risque réel d’isolation. Le script échoue si ce nom ne correspond pas à exactement un niveau.

Comme build-private-network.sh, le script détecte les plans de calcul et réseau ainsi que les deux catégories de stockage, qui peuvent différer entre le disque racine et le volume de données. Il détecte aussi votre IP publique avec ifconfig.me pour limiter SSH (--my-ip). Passez un indicateur précis pour fixer une valeur et utilisez --help pour la liste complète.

Le script attribue délibérément une IP publique à la VM (my-storage, selon le préfixe --name), puis la limite à SSH.

Une VM sans présence réseau publique paraît plus privée, mais il serait impossible de l’atteindre, même pour la configuration ponctuelle de l’interface du niveau. Le script déploie normalement, attribue une IP publique puis limite SSH à votre seule IP, comme build-private-network.sh le fait pour ses deux VM. Rien d’autre n’est ouvert publiquement. NFS est donc aussi inaccessible depuis l’extérieur qu’il le serait sans IP publique. L’IP ne sert qu’à l’administration limitée.

La VM est attachée au niveau nommé avec add-network, comme le routeur de sous-réseau du script précédent.

L’interface du niveau est activée comme celle du routeur. Le disque de données est détecté, sans hypothèse.

La plateforme ajoute l’interface réseau à chaud, mais le système d’exploitation ne l’active pas automatiquement. Le script écrit et applique un fichier netplan, comme pour l’interface de niveau du routeur.

Le disque de données est le volume my-storage-data créé avec la VM. Le script l’identifie comme le disque entier qui n’est pas le disque racine, plutôt que de supposer un nom de périphérique fixe. Les noms de périphériques varient selon la plateforme. Une mauvaise supposition pourrait formater le mauvais disque. Le formatage est idempotent : lors d’une nouvelle exécution, le script ignore mkfs si le disque est déjà formaté et ne détruit pas les données. Le répertoire du partage est créé après le montage : s’il est créé avant, il réside sur le disque racine et devient masqué lorsque le volume est monté dessus.

Le partage est exporté vers le CIDR du niveau et celui du maillage : le serveur accepte les deux adresses source, même si une seule est accessible par la configuration actuelle.

Le script installe nfs-kernel-server et exporte le répertoire vers le CIDR du niveau et 100.64.0.0/10, la plage d’adresses du maillage Headscale employée également par build-private-network.sh dans ses règles ACL.

Une seconde couche indépendante limite NFS aux mêmes plages que l’export. SSH reste limité par la couche zcp.

Le script ouvre aussi le pare-feu ufw de la VM pour les trois ports NFS (2049, 111, 20048), limités aux deux CIDR de l’export. Aucune règle de pare-feu ni redirection zcp n’existe pour ces ports sur l’IP publique. Les deux couches sont nécessaires pour NFS.

SSH est différent : ufw l’autorise sans limite (0.0.0.0/0), tandis que son refus par défaut reste en place pour le reste après --force enable. La limitation à votre IP est entièrement assurée par la couche de pare-feu zcp. Limiter aussi ufw à votre IP fonctionnerait aujourd’hui mais vous exclurait si votre IP changeait, car ufw ne nettoie pas les règles obsolètes comme le script.

zcp instance list
zcp volume list
zcp ip list

Utilisez un appareil déjà connecté par Tailscale au serveur Headscale du tutoriel précédent, pas un appareil situé physiquement dans le niveau. C’est le scénario important :

sudo apt-get install -y nfs-common
sudo mkdir -p /mnt/company-share
sudo mount -t nfs <storage-vm-tier-ip>:/srv/nfs/company-share /mnt/company-share
echo "test" | sudo tee /mnt/company-share/test.txt
cat /mnt/company-share/test.txt

<storage-vm-tier-ip> est affiché dans le résumé final du script. company-share est la valeur par défaut de --share-name. Utilisez votre valeur si vous en avez passé une autre.

# from the public internet:
nc -zv -w 3 <storage-vm-public-ip> 2049

Cette commande échoue (connexion refusée ou délai dépassé). L’IP publique de la VM de stockage n’autorise l’accès SSH que depuis votre adresse IP. NFS est joignable uniquement dans le niveau ou par le maillage.

La facturation horaire s’applique tant que ces ressources existent. Le script de suppression retire la VM de stockage et son volume de données pour un préfixe --name. Il ne touche pas le niveau privé ni le VPC du tutoriel précédent.

bash <(curl -fsSL https://raw.githubusercontent.com/zsoftly/tools/main/zcp/destroy-private-storage.sh) \
--name my-storage --allow-unverified-volume-delete

Il récupère ZCP_REGION et ZCP_PROJECT dans votre shell comme le script de déploiement. Sinon, passez --region et --project. Le script échoue sans l’un ou l’autre.

  1. Déployez une VM dans le niveau du tutoriel précédent avec un disque séparé : deploy-private-storage.sh --ssh-key <name> --tier-name <tier-name> --name my-storage.
  2. Le script limite SSH à votre IP, active l’interface du niveau, formate et monte le disque de données, puis l’exporte par NFS vers les CIDR du niveau et du maillage avec un pare-feu correspondant.
  3. Montez le partage depuis un appareil connecté au maillage, vérifiez lecture et écriture, puis confirmez que seul le service SSH est accessible sur l’IP publique.
  4. Exécutez destroy-private-storage.sh --name <prefix> --allow-unverified-volume-delete à la fin et cherchez un réseau résiduel.

Interroger la documentation ZCP

Posez une question et choisissez un assistant. Il s’ouvre dans un nouvel onglet et lit cette page et toute la documentation ZCP, pour répondre à partir de nos docs.

Exemples de questions

Demander avec

Votre question est envoyée à l’assistant choisi, selon ses propres conditions.