- Início
- Rede multi-cloud
- Customer Edge diagnostics
- Reaching a Customer Edge
- SSH
SSH
Capturado em 2026-07-28 de um CE desta implantação. sitecli/capture-manifest.json
registra qual nó, e scripts/capture-sitecli.sh --check reverifica a superfície de
comandos em um CE ativo.
O SSH alcança a conta admin do appliance, cujo shell de login é o Site CLI
(/opt/bin/vpmu). Esta é a única rota para a superfície completa de comandos no appliance — a
API de debug expõe 34 comandos, e o próprio appliance oferece muito mais
que não estão nessa 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"Cada parte dessa linha de comando é indispensável, e as próximas três seções explicam qual falha cada uma previne.
Não há prompt de shell ao qual chegar: o shell de login de admin é o Site CLI, portanto você
chega ao seu prompt >>>. Execute comandos no appliance como execcli <nome> ali — consulte
comandos no appliance.
Por que o cloud-init escreve a chave, e não a API
Seção intitulada “Por que o cloud-init escreve a chave, e não a API”admin_user_credentials.ssh_key no objeto do site parece exatamente o campo para
isso. Ele é aceito, sobrevive a uma releitura e não configura nada. O vpm controla os
usuários locais do nó e recusa-se a alterar este — do próprio log do nó, três vezes
durante uma única inicialização:
vpm users.go:165: Won't do any change for user admin (internal skip)Tudo o mais decorre dessa única linha. /var/home/admin/.ssh nunca existe, antes ou
depois de o site atingir ONLINE. A data da última alteração da shadow de admin permanece
na data de build da imagem enquanto vesbkp e vesopcon mostram a data atual, porque o
vpm configurou esses dois e pulou o admin. E o vpm não registra nada sobre ssh_key
ou authorized_keys em nenhum momento.
Portanto, o arquivo precisa ser escrito fora do vpm. admin é uid 2202, incorporado na
imagem do nó, de modo que ele existe antes da execução do cloud-init e owner: admin:admin
é resolvido no momento da escrita — sem runcmd, sem correção de propriedade:
- path: /var/home/admin/.ssh/authorized_keys permissions: "0600" owner: admin:admin content: | ${ssh_public_key}O sshd sempre esteve disposto. sshd -T reporta pubkeyauthentication yes, e admin
aparece em AllowUsers nos dois arquivos sshd_config que acompanham o nó. Nunca houve
nada para habilitar — apenas um arquivo ausente.
Por que ele responde em apenas um endereço
Seção intitulada “Por que ele responde em apenas um endereço”O sshd vincula 0.0.0.0:22, mas apenas o endereço interno (SLI) está na pilha de rede
do host de uma forma que o sshd responderá. eth0 é renomeado para a-i-eth0 e não carrega
nenhum IP do host — o plano de dados Argo é dono dessa interface, e o endereço de
gerenciamento/SLO que ele teria carregado aparece em vhost0 em vez disso. As outras duas NICs
permanecem na pilha do host com seus próprios nomes.
Sondado a partir de uma VM dentro da VNet, em relação a um CE:
endereço de gerenciamento/SLO timeoutendereço externo timeoutendereço interno/SLI ABERTO SSH-2.0-OpenSSH_8.7um endereço não utilizado timeout (controle)Uma sondagem em relação ao endereço pelo qual você conhece o nó, portanto, retorna exatamente o que um security group fechado retorna. Nada está bloqueando; não há listener nesse endereço.
Os endereços públicos dos CEs também não têm listener na porta 22, e é por isso que o comando
acima usa -J: uma VM de operador dentro da VNet, na mesma sub-rede que os endereços SLI.
Esta implantação constrói uma para esse fim —
terraform output -raw client_vm_name fornece o nome dela.
O Site CLI precisa de um terminal e de um retorno de carro
Seção intitulada “O Site CLI precisa de um terminal e de um retorno de carro”O shell de login de admin não é um shell. É uma aplicação go-prompt, que coloca o terminal em
modo raw e lê teclas em vez de linhas. Quatro consequências, cada uma das quais falha de um modo
que parece um problema diferente:
| Mecanismo | O que acontece sem ele |
|---|---|
Alocar um terminal (ssh -tt) | panic: no such device or address do go-prompt.NewStandardInputParser, que parece um appliance com falha |
| Enviar um retorno de carro, não uma alimentação de linha, para Enter | A linha nunca é submetida, e a sessão fecha ao fim da entrada sem ter imprimido nada |
| Manter a entrada padrão aberta | A conexão termina antes de o comando ser renderizado, então um comando funcionando parece silencioso |
| Escrever o texto do comando e o byte Enter separadamente | A nova linha chega ao buffer como um caractere literal e o CLI responde unknown command, o que parece indicar que o comando não existe |
ssh host 'some-command' portanto não funciona: o argumento é ignorado e o prompt interativo
inicia de qualquer forma. Use-o como terminal ou não use.
scripts/sitecli_ssh_harvest.py é a implementação de referência.
O banner é uma verificação de saúde gratuita
Seção intitulada “O banner é uma verificação de saúde gratuita”Antes de você digitar qualquer coisa, o banner de login já respondeu a várias das perguntas nas
quais você gastaria comandos. De f5-xc-ce-vm-01, arte ASCII e IP público omitidos:
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 um nó ainda inicializando (PROVISIONING) de um que concluiu
(PROVISIONED). Software é a string de build que determina quais comandos existem.
DNS e NTP cobrem as duas dependências que quebram o registro primeiro, portanto um nó que
nunca ficou online geralmente já informou aqui o motivo — antes de
chronyc-sources ou
dig serem necessários.
Fornecendo o par de chaves
Seção intitulada “Fornecendo o par de chaves”-
Gere um par de chaves, caso ainda não tenha um. Ed25519 em vez de RSA: mais curto e aceito pelo
sshddo appliance.Terminal window ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519 -
Aponte a implantação para a metade pública. O módulo raiz lê o arquivo uma vez e passa a string para cada nó:
terraform/terraform.tfvars ssh_public_key_path = "~/.ssh/id_ed25519.pub"ssh_public_keyrecebe o material diretamente, que é o que os testes de plano usam. A metade privada nunca sai da sua estação de trabalho. -
Aplique. Leia o aviso no topo desta página primeiro — em uma implantação existente, isso substitui as VMs dos CEs.
O que isso não é
Seção intitulada “O que isso não é”Cada um desses foi testado e descartado enquanto a rota ainda era considerada impossível. Cada um é plausível o suficiente para custar um dia.
| Não é a causa | Como foi descartado |
|---|---|
| A credencial só se aplica no momento da criação | O sshd inicia cerca de 90 segundos na primeira inicialização, antes de o objeto do site existir. admin_user_credentials também está presente em ReplaceSpecType e se aplica no local. |
block_all_services | O fechamento da porta 22 no endereço de gerenciamento é idêntico seja os serviços bloqueados ou não. |
| Uma nova linha no final da chave | Testado de ambas as formas, sem alteração. O cloud-init ainda a remove, porque um bloco literal de outra forma renderizaria uma segunda linha vazia. |
| Software de CE fixado em versão mais antiga | Reproduzido em três builds, incluindo um executando OpenSSH 9.9. |
Uma admin_password ausente | Definir admin_password junto com ssh_key em um CE criado do zero não alterou nada. |
As outras rotas
Seção intitulada “As outras rotas”ONLINE.