- Home
- Rete multi-cloud
- Customer Edge diagnostics
- Reaching a Customer Edge
- SSH
SSH
Acquisito il 2026-07-28 da un CE di questa installazione. sitecli/capture-manifest.json
registra quale nodo, e scripts/capture-sitecli.sh --check riverifica la superficie
dei comandi su un CE attivo.
SSH raggiunge l’account admin dell’appliance, il cui shell di accesso è il Site CLI
(/opt/bin/vpmu). Questo è l’unico percorso verso la superficie completa dei comandi
sull’appliance — la debug API espone 34 comandi, mentre l’appliance
stessa ne offre molti altri che non sono disponibili su quella API.
cd terraformSLI=$(terraform output -json ce_sli_private_ips | jq -r '.eastus01')ssh -tt -i ~/.ssh/id_ed25519 -J azureuser@<operator-vm> "admin@$SLI"Ogni parte di quella riga di comando è essenziale, e le prossime tre sezioni spiegano quale errore previene ciascuna.
Non esiste un prompt di shell su cui atterrare: lo shell di accesso di admin è il
Site CLI, quindi si arriva al suo prompt >>>. Eseguire i comandi sull’appliance come
execcli <name> — vedere comandi sull’appliance.
Perché cloud-init scrive la chiave, e non l’API
Sezione intitolata “Perché cloud-init scrive la chiave, e non l’API”admin_user_credentials.ssh_key sull’oggetto site sembra esattamente il campo adatto
a questo scopo. Viene accettato, sopravvive a una rilettura, e non configura nulla. vpm
gestisce gli utenti locali del nodo e si rifiuta di toccare questo — dal log del nodo
stesso, tre volte nell’arco di un singolo avvio:
vpm users.go:165: Won't do any change for user admin (internal skip)Tutto il resto deriva da quella riga. /var/home/admin/.ssh non esiste mai, né prima
né dopo che il site raggiunge ONLINE. La data dell’ultimo cambio della shadow di admin
rimane alla data di build dell’immagine mentre vesbkp e vesopcon mostrano la data
corrente, perché vpm ha impostato quei due e saltato admin. E vpm non registra
nulla riguardo a ssh_key o authorized_keys in nessun momento.
Quindi il file deve essere scritto al di fuori di vpm. admin ha uid 2202, integrato
nell’immagine del nodo, quindi esiste prima che cloud-init venga eseguito e
owner: admin:admin si risolve al momento della scrittura — nessun runcmd, nessuna
correzione della proprietà:
- path: /var/home/admin/.ssh/authorized_keys permissions: "0600" owner: admin:admin content: | ${ssh_public_key}sshd era sempre disponibile. sshd -T riporta pubkeyauthentication yes, e admin
appare in AllowUsers in entrambi i file sshd_config presenti sul nodo. Non c’era mai
nulla da abilitare — solo un file mancante.
Perché risponde su un solo indirizzo
Sezione intitolata “Perché risponde su un solo indirizzo”sshd si associa a 0.0.0.0:22, ma solo l’indirizzo interno (SLI) è nello stack di
rete dell’host in modo che sshd risponda. eth0 viene rinominato a-i-eth0 e non porta
alcun IP host — il piano dati Argo possiede quell’interfaccia, e l’indirizzo di
management/SLO che avrebbe portato appare invece su vhost0. Le altre due NIC rimangono
nello stack dell’host con i propri nomi.
Sondato da una VM all’interno della VNet, contro un CE:
indirizzo management/SLO timeoutindirizzo esterno timeoutindirizzo interno/SLI APERTO SSH-2.0-OpenSSH_8.7un indirizzo non utilizzato timeout (controllo)Un sondaggio sull’indirizzo con cui si conosce il nodo restituisce quindi esattamente quello che restituisce un security group chiuso. Non è nulla che lo blocchi; non c’è alcun listener su quell’indirizzo.
Gli indirizzi pubblici del CE non hanno nessun listener sulla porta 22, motivo per cui il
comando sopra passa attraverso -J: una VM operatore all’interno della VNet, nella stessa
subnet degli indirizzi SLI. Questa installazione ne costruisce una allo scopo —
terraform output -raw client_vm_name la nomina.
Il Site CLI richiede un terminale e un carriage return
Sezione intitolata “Il Site CLI richiede un terminale e un carriage return”Lo shell di accesso di admin non è una shell. È un’applicazione go-prompt, che mette
il terminale in modalità raw e legge i tasti anziché le righe. Quattro conseguenze, ognuna
delle quali fallisce in un modo che sembra un problema diverso:
| Meccanismo | Cosa succede senza di esso |
|---|---|
Allocare un terminale (ssh -tt) | panic: no such device or address da go-prompt.NewStandardInputParser, che sembra un’appliance in crash |
| Inviare un carriage return, non un line feed, per Invio | La riga non viene mai inviata, e la sessione si chiude al termine dell’input senza aver stampato nulla |
| Mantenere aperto lo standard input | La connessione termina prima che il comando abbia prodotto output, quindi un comando funzionante sembra silenzioso |
| Scrivere il testo del comando e il byte Invio separatamente | Il newline finisce nel buffer come carattere letterale e il CLI risponde unknown command, il che sembra indicare che il comando non esista |
ssh host 'some-command' quindi non funziona: l’argomento viene ignorato e il prompt
interattivo si avvia comunque. Utilizzarlo come terminale, o non utilizzarlo affatto.
scripts/sitecli_ssh_harvest.py è l’implementazione di riferimento.
Il banner è un controllo di salute gratuito
Sezione intitolata “Il banner è un controllo di salute gratuito”Prima di digitare qualsiasi cosa, il banner di login ha già risposto a diverse domande su
cui si spenderebbero comandi. Da f5-xc-ce-vm-01, con ASCII art e IP pubblico rimossi:
UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITEDAll actions performed on this device are audited
Using https://register.ves.volterra.ioOS: rhel-9.2024.6Memory: 32768MiBStorage: sda: 31GiBCPU: Model: Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz | CPUs: 8Software: crt-20250613-3382DNS: 168.63.129.16: OKNTP: SyncedUptime: 0 days, 5 hours, 20 minutesRegistration Status: PROVISIONEDSLO IP: 10.0.1.4/26WELCOME IN SITE CLIRegistration Status distingue un nodo ancora in avvio (PROVISIONING) da uno che ha
terminato (PROVISIONED). Software è la stringa di build che determina quali comandi
esistono. DNS e NTP coprono le due dipendenze che interrompono prima la registrazione,
quindi un nodo che non è mai andato online di solito ha già comunicato qui il motivo —
prima che chronyc-sources o
dig siano necessari.
Fornire la coppia di chiavi
Sezione intitolata “Fornire la coppia di chiavi”-
Generare una coppia di chiavi, se non si dispone già di una. Ed25519 anziché RSA: più corta, e accettata dall’
sshddell’appliance.Terminal window ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519 -
Puntare l’installazione alla metà pubblica. Il modulo root legge il file una volta e passa la stringa a ogni nodo:
terraform/terraform.tfvars ssh_public_key_path = "~/.ssh/id_ed25519.pub"ssh_public_keyaccetta invece il materiale inline, che è ciò che usano i test del piano. La metà privata non lascia mai la propria workstation. -
Applicare. Leggere prima l’avviso in cima a questa pagina — su un’installazione esistente questo sostituisce le VM CE.
Cosa non è questo
Sezione intitolata “Cosa non è questo”Ognuno di questi è stato testato e scartato mentre il percorso era ancora ritenuto impossibile. Ognuno è abbastanza plausibile da far perdere una giornata.
| Non è la causa | Come è stato escluso |
|---|---|
| Le credenziali si applicano solo al momento della creazione | sshd si avvia circa 90 secondi nel primo avvio, prima che l’oggetto site esista. admin_user_credentials è anche presente in ReplaceSpecType e si applica in-place. |
block_all_services | La chiusura della porta 22 sull’indirizzo di management è identica sia che i servizi siano bloccati o meno. |
| Un newline finale nella chiave | Testato in entrambi i modi, nessuna modifica. Cloud-init lo elimina comunque, perché un blocco letterale altrimenti renderebbe una seconda riga vuota. |
| Software CE pinnato e più vecchio | Riprodotto su tre build, inclusa una con OpenSSH 9.9. |
Un admin_password mancante | Impostare admin_password insieme a ssh_key su un CE da zero non ha cambiato nulla. |
Gli altri percorsi
Sezione intitolata “Gli altri percorsi”ONLINE.