跳转到内容

站点控制台

采集于 2026-07-28,取自本部署的一个 CE。sitecli/capture-manifest.json 记录了具体是哪个节点,scripts/capture-sitecli.sh --check 会针对一台在线 CE 重新校验命令界面。

每个 Customer Edge 都在 https://<sli-ip>:65500 上提供 F5 的站点控制台。在本 部署中,它通常是首选尝试的路径。

它对你的要求最少:无需分发 SSH 密钥、无需维护跳板机、节点上无需公网 IP,也无需替换 VM 即可启用。谁可以连接变成了一个 Azure RBAC 决策。而且它不需要站点已注册:本页首次采集时 三个站点都报告 site_state: FAILED,之后在同一批节点变为 ONLINE 后重新校验,内容未变。

需要注意的是,站点控制台只在节点的内部(SLI)地址上响应,而该地址只能从 VNet 内部访问。 Azure Bastion 弥合了这一差距,且不会在网络上放置任何其他东西。

  1. 登录 Azure 并添加 Bastion 扩展。隧道功能是原生客户端特性,该扩展默认不会安装。

    Terminal window
    az login
    az extension add --name bastion
  2. 对 CE 虚拟机、其网络接口以及 Bastion 主机持有 Reader 权限。 这是 Microsoft 的文档要求,且此处未经验证 —— 本部署中的每次运行都是以订阅所有者 身份执行的,因此没有证据表明更低的角色足够或不足够。

  3. 确认 Bastion 已部署且具备相应能力。Basic SKU 既不支持隧道也不支持基于 IP 的连接, 因此这里的 StandardTrue 都是关键。

    Terminal window
    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

terraform output 中取值,而不要手动输入 —— 资源 id 不是应该手工拼装的东西。

  1. 读取 Bastion 主机名称、资源组,以及目标 CE 的 VM 资源 id。

    Terminal window
    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. 启动隧道。它会一直保持端口开放直到被停止,因此请将其放到后台或使用第二个终端。

    Terminal window
    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

    三行都以 WARNING: 为前缀。那是 Azure CLI 把进度写到 stderr,不是问题。 请等到 Tunnel is ready 之后再连接。

  3. 确认监听器在本地的 loopback 上:

    Terminal window
    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. 打开控制台。隧道使其变为本地服务,因此地址是 localhost —— 而不是节点的地址。

    Terminal window
    open https://localhost:65500/ # macOS
    xdg-open https://localhost:65500/ # Linux
  5. 完成后停止隧道 —— 使用 Ctrl-C,若放到了后台则用 kill %1。 保持其开启会占用本地端口 65500 以及 Bastion 会话。

一个凭据对话框,而不是登录页面。 控制台使用 HTTP Basic 身份验证,因此浏览器会 弹出自己的用户名和密码提示。没有可查看的表单:

Terminal window
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

带有该 realm 的 401 说明控制台工作正常。这正是未经身份验证的请求应当得到的结果 —— 而向同一 URL 提供 admin 凭据会返回 200,这就是在打开浏览器之前确认凭据的方法:

Terminal window
curl -sk -u admin -o /dev/null -w '%{http_code}\n' https://localhost:65500/
Enter host password for user 'admin':
200

-u admin 后不加冒号会让 curl 提示输入密码,而不是从命令行获取 —— 否则密码会留在 shell 历史和进程列表中。

一个证书警告,同时有三个原因。 直接检查证书:

Terminal window
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

subject 等于 issuer,因此它是自签名的。名称是 site-local.volterra.io,而你连接的是 localhost,因此不会匹配。并且在本部署所运行的版本上,该证书已于 2025 年 10 月 25 日 过期 —— 它由设备自带,本仓库中没有任何东西会更新它。

请预期浏览器给出直白的警告,并且每次都会出现。上面的 subject 行才是有用的部分: 它是你确认自己连到的是该设备,而不是本地 65500 端口上监听的其他东西的方法。

admin 身份登录。本文档不公布该密码,也不应公布。

不公布它在此处比看起来更重要,有两个原因:

  • 本文档是公开的。打印整个机群当前的控制台密码,会把”对 Bastion 持有 Reader”变成 任何读到此页的人都能获得的完整设备访问权限。
  • 文档中公布的密码在有人轮换它的那一刻就是错的,而且是以最具误导性的方式错误 —— 读者会认为自己的访问权限出了问题,而不是这个页面过时了。

一旦它被轮换过,请从你团队保存运维机密的地方获取。

为什么隧道必须以资源 id 为目标

Section titled “为什么隧道必须以资源 id 为目标”

--target-resource-id 是必需的。改用节点地址会被拒绝 —— 无论你使用哪个地址, 因此这里有意不打印真实地址:

Terminal window
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.

原因不是基于 IP 的连接被禁用 —— 在这台 Bastion 上 ip_connect_enabledtrue。 无论该设置如何,Microsoft 都不支持在基于 IP 的原生客户端连接上使用自定义端口 (Azure 文档), 而 65500 是一个自定义端口。在这里检查 Bastion 配置无济于事;请使用资源 id。

症状原因解决方法
ERROR: Custom ports are not allowed. Allowed ports for Tunnel with IP connect is 22, 3389.使用了 --target-ip-address改用 --target-resource-id
ERROR: Defined port is currently unavailable另一个隧道已占用该本地端口停止另一个隧道,或传入不同的 --port--resource-port 保持为 65500
terraform output -raw bastion_namenull 或为空Bastion 未部署设置 enable_bastion = true 并 apply
隧道启动了但资源 id 为空jq 过滤器使用了 VM 名称而非站点键使用 eastus01/02/03 作为键
401 Unauthorized,realm 为 Volterra Site Console并非故障 —— 未经身份验证的请求提供 admin 凭据
浏览器拒绝该证书自签名、名称不匹配,且自 2025 年 10 月起已过期属于预期;确认 subject 为 CN=site-local.volterra.io 后继续