콘텐츠로 이동

사이트 콘솔

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. 리스너가 로컬 루프백에 있는지 확인합니다:

    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이 명령줄에서 비밀번호를 받는 대신 프롬프트로 묻습니다. 명령줄에 쓰면 셸 히스토리와 프로세스 목록에 남게 됩니다.

인증서 경고가 뜨는데, 세 가지 이유가 동시에 있습니다. 인증서를 직접 확인해 보면:

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를 대상으로 해야 하는 이유

섹션 제목: “터널이 반드시 리소스 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인지 확인 후 진행