Aller au contenu

Console de site

Capturé le 2026-07-28 depuis un CE de ce déploiement. sitecli/capture-manifest.json consigne quel nœud, et scripts/capture-sitecli.sh --check revérifie la surface de commandes sur un CE actif.

Chaque Customer Edge sert la Console de site F5 sur https://<sli-ip>:65500. Sur ce déploiement, c’est généralement la voie à essayer en premier.

C’est celle qui exige le moins de vous : aucune clé SSH à distribuer, aucun hôte de rebond à maintenir, aucune adresse IP publique sur le nœud, et aucun remplacement de VM pour l’activer. Déterminer qui peut se connecter devient une décision Azure RBAC. Et elle n’a pas besoin que le site soit enregistré : cette page a d’abord été capturée alors que les trois sites signalaient site_state: FAILED, puis revérifiée sans changement sur les mêmes nœuds une fois qu’ils étaient ONLINE.

Le revers est que la Console de site ne répond que sur l’adresse interne (SLI) du nœud, accessible uniquement depuis l’intérieur du VNet. Azure Bastion comble cet écart sans rien ajouter d’autre sur le réseau.

  1. Connectez-vous à Azure et ajoutez l’extension Bastion. Le tunneling est une fonctionnalité du client natif et l’extension n’est pas installée par défaut.

    Fenêtre de terminal
    az login
    az extension add --name bastion
  2. Détenez le rôle Reader sur la machine virtuelle CE, son interface réseau et l’hôte Bastion. Il s’agit de l’exigence documentée par Microsoft et elle est non vérifiée ici — chaque exécution dans ce déploiement a été effectuée en tant que propriétaire de l’abonnement, aucun rôle moindre n’a donc été démontré suffisant ou insuffisant.

  3. Confirmez que Bastion est déployé et capable. Le SKU Basic ne prend en charge ni le tunneling ni la connexion par IP, donc Standard et True sont tous deux déterminants ici.

    Fenêtre de terminal
    az network bastion list -g "$(terraform output -raw resource_group_name)" \
    --query "[].{name:name, sku:sku.name, tunneling:enableTunneling}" -o table
    Name Sku Tunneling
    ----------------- -------- -----------
    mcn-ce-ha-bastion Standard True

Prenez les valeurs depuis terraform output plutôt que de les saisir — l’identifiant de ressource n’est pas quelque chose à assembler à la main.

  1. Lisez le nom de l’hôte Bastion, le groupe de ressources et l’identifiant de ressource de la VM du CE ciblé.

    Fenêtre de terminal
    cd terraform
    BASTION=$(terraform output -raw bastion_name)
    RG=$(terraform output -raw resource_group_name)
    VM_ID=$(terraform output -json ce_vm_ids | jq -r '.eastus01')
    mcn-ce-ha-bastion
    rg-mcn-ce-ha-<deployer>
    /subscriptions/…/providers/Microsoft.Compute/virtualMachines/f5-xc-ce-vm-01
  2. Démarrez le tunnel. Il maintient le port ouvert jusqu’à son arrêt, exécutez-le donc en arrière-plan ou utilisez un second terminal.

    Fenêtre de terminal
    az network bastion tunnel \
    --name "$BASTION" \
    --resource-group "$RG" \
    --target-resource-id "$VM_ID" \
    --resource-port 65500 \
    --port 65500 &
    WARNING: Opening tunnel on port: 65500
    WARNING: Tunnel is ready, connect on port 65500
    WARNING: Ctrl + C to close

    Les trois lignes sont préfixées par WARNING:. C’est l’Azure CLI qui écrit sa progression sur stderr, pas un problème. Attendez Tunnel is ready avant de vous connecter.

  3. Confirmez que l’écouteur est local, sur la boucle locale :

    Fenêtre de terminal
    lsof -nP -iTCP:65500 -sTCP:LISTEN
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    Python 41648 you 7u IPv4 … 0t0 TCP 127.0.0.1:65500 (LISTEN)
  4. Ouvrez la console. Le tunnel la rend locale, l’adresse est donc localhost — et non l’adresse du nœud.

    Fenêtre de terminal
    open https://localhost:65500/ # macOS
    xdg-open https://localhost:65500/ # Linux
  5. Arrêtez le tunnel lorsque vous avez terminé — Ctrl-C, ou kill %1 si vous l’avez lancé en arrière-plan. Le laisser ouvert maintient le port local 65500 et la session Bastion.

Une boîte de dialogue d’identifiants, pas une page de connexion. La console utilise l’authentification HTTP Basic, le navigateur affiche donc sa propre invite de nom d’utilisateur et de mot de passe. Il n’y a aucun formulaire à regarder :

Fenêtre de terminal
curl -skI https://localhost:65500/
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Volterra Site Console"
Content-Type: text/html; charset=utf-8
Content-Length: 0

Un 401 avec ce domaine (realm) signifie que la console fonctionne correctement. C’est ce qu’une requête non authentifiée est censée obtenir — et fournir l’identifiant admin à la même URL renvoie 200, ce qui permet de confirmer l’identifiant avant d’ouvrir un navigateur :

Fenêtre de terminal
curl -sk -u admin -o /dev/null -w '%{http_code}\n' https://localhost:65500/
Enter host password for user 'admin':
200

-u admin sans deux-points fait que curl demande le mot de passe au lieu de le prendre depuis la ligne de commande, où il finirait dans l’historique du shell et dans la liste des processus.

Un avertissement de certificat, pour trois raisons à la fois. En vérifiant directement le certificat :

Fenêtre de terminal
openssl s_client -connect localhost:65500 -servername localhost </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
subject=C=US, ST=California, L=Santa Clara, O=Volterra, OU=Volterra Edge Services, CN=site-local.volterra.io
issuer=C=US, ST=California, L=Santa Clara, O=Volterra, OU=Volterra Edge Services, CN=site-local.volterra.io
notBefore=Oct 25 04:51:31 2024 GMT
notAfter=Oct 25 04:51:31 2025 GMT

Le sujet est identique à l’émetteur : il est donc auto-signé. Le nom est site-local.volterra.io alors que vous vous connectez à localhost, il ne correspondra donc pas. Et sur la build qu’exécute ce déploiement, le certificat a expiré le 25 octobre 2025 — l’appliance le livre ainsi, et rien dans ce dépôt ne le renouvelle.

Attendez-vous à un avertissement brutal du navigateur, et attendez-vous à le voir chaque fois. La ligne du sujet ci-dessus est la partie utile : c’est ainsi que vous confirmez avoir atteint l’appliance et non autre chose écoutant sur le port local 65500.

Connectez-vous en tant que admin. Cette documentation ne publie pas le mot de passe, et ne devrait pas le faire.

Deux raisons pour lesquelles ne pas le publier importe davantage ici qu’il n’y paraît :

  • Cette documentation est publique. Imprimer le mot de passe console actuel du parc transformerait « détenir Reader sur le Bastion » en accès complet à l’appliance pour quiconque lit la page.
  • Un mot de passe publié dans la documentation est faux dès l’instant où quelqu’un le fait tourner, et faux de la manière la plus trompeuse — le lecteur conclut que son accès est cassé plutôt que que la page est obsolète.

Une fois qu’il a été renouvelé, obtenez-le là où votre équipe conserve ses secrets opérationnels.

Pourquoi le tunnel doit cibler l’identifiant de ressource

Section intitulée « Pourquoi le tunnel doit cibler l’identifiant de ressource »

--target-resource-id est obligatoire. Cibler l’adresse du nœud à la place est refusé — quelle que soit l’adresse utilisée, c’est pourquoi aucune adresse réelle n’est délibérément imprimée ici :

Fenêtre de terminal
az network bastion tunnel --name "$BASTION" -g "$RG" \
--target-ip-address <any-sli-address> --resource-port 65500 --port 65501
ERROR: Custom ports are not allowed. Allowed ports for Tunnel with IP connect is 22, 3389.

La raison n’est pas que la connexion par IP soit désactivée — sur ce Bastion, ip_connect_enabled vaut true. Microsoft ne prend pas en charge les ports personnalisés sur les connexions client natif basées sur IP, indépendamment de ce paramètre (documentation Azure), et 65500 est un port personnalisé. Inspecter la configuration Bastion ici ne mène nulle part ; utilisez l’identifiant de ressource.

SymptômeCauseCorrectif
ERROR: Custom ports are not allowed. Allowed ports for Tunnel with IP connect is 22, 3389.Utilisation de --target-ip-addressUtilisez --target-resource-id
ERROR: Defined port is currently unavailableUn autre tunnel occupe déjà ce port localArrêtez l’autre tunnel, ou passez un --port différent ; --resource-port reste 65500
terraform output -raw bastion_name vaut null ou est videBastion n’est pas déployéDéfinissez enable_bastion = true et appliquez
Le tunnel démarre mais l’identifiant de ressource est videLe filtre jq a utilisé le nom de la VM au lieu de la clé de siteIndexez sur eastus01/02/03
401 Unauthorized, realm Volterra Site ConsolePas une panne — requête non authentifiéeFournissez l’identifiant admin
Le navigateur refuse le certificatAuto-signé, nom non concordant, et expiré depuis octobre 2025Attendu ; confirmez que le sujet est CN=site-local.volterra.io et continuez