Xray gRPC API로 트래픽 통계 확인하고 노드를 자동 전환하는 실전 가이드

Xray gRPC API를 스크립트와 연결해 트래픽을 확인하고 노드 관리를 자동화하는 방법을 안내합니다. JSON 설정, StatsService와 HandlerService 활용, API 보안 및 운영 중 문제 해결 팁을 확인하세요.

Xray의 gRPC API를 사용하면 실행 중인 코어에서 아웃바운드별 업로드·다운로드 누적량을 조회하고, 외부 스크립트나 모니터링 도구와 연결할 수 있습니다. 다만 트래픽 통계 조회와 노드 선택은 서로 다른 기능입니다. API가 통계를 반환한다고 해서 코어가 자동으로 가장 빠른 노드를 고르는 것은 아닙니다. 통계 수집, 노드 상태 확인, 전환 정책을 각각 설계해야 안정적으로 자동화할 수 있습니다.

이 글의 핵심

Xray API를 로컬에 안전하게 열고 StatsService로 트래픽 카운터를 확인하는 방법, HandlerService가 관리하는 대상, 노드 전환 자동화를 설계할 때의 주의점을 정리합니다. 설정 예시는 필요한 필드만 보여 주는 조각이며, 실제 적용 전에는 현재 Xray 버전과 클라이언트가 생성하는 설정 구조를 확인하세요.

gRPC API가 하는 일과 하지 않는 일

Xray API는 클라이언트 화면을 조작하는 인터페이스가 아니라, 실행 중인 Xray 코어가 제공하는 gRPC 서비스입니다. StatsService는 정책에 따라 수집된 트래픽 카운터를 조회하고, HandlerService는 실행 중인 인바운드·아웃바운드 핸들러를 추가하거나 제거하는 등 런타임 관리를 담당합니다. 따라서 API를 켰다고 해서 v2rayN의 노드 목록이나 현재 선택 항목이 자동으로 바뀌지는 않습니다.

클라이언트 요청 인바운드 수신 라우팅 규칙 매칭 아웃바운드 선택 통계 조회 및 판단

노드 자동 전환에는 별도의 판단 주체가 필요합니다. 외부 스크립트가 여러 후보의 연결 상태를 확인하고 선택 결과를 반영하거나, Xray의 라우팅·관측 기능을 구성해 코어가 출구를 선택하도록 설계할 수 있습니다. 반면 트래픽 카운터는 얼마나 전송했는지를 보여 줄 뿐, 서버 부하·실제 대역폭·다음 연결의 성공 여부를 직접 보증하지 않습니다. 사용량이 적다는 이유만으로 노드가 고장 났다고 판단해서는 안 됩니다.

설정 준비: API 인바운드와 통계 정책

다음은 V2Ray 형식의 JSON 설정에서 API 관련 항목을 찾기 위한 예시입니다. 전체 실행 설정이 아니므로 기존 설정의 api, inbounds, outbounds, routing, policy 구조에 맞춰 필요한 필드만 반영하세요. API용 인바운드는 일반 프록시 인바운드와 구분하는 태그를 사용하고, 로컬 주소에서만 수신하게 구성하는 것이 기본입니다.

API 서비스와 인바운드

서비스
StatsService, HandlerService
태그
api
수신 주소
127.0.0.1
예시 포트
10085

10085는 예시입니다. 사용 중인 포트와 겹치지 않는지 확인하세요.

통계 수집 정책

최상위 항목
stats: {}
사용자 정책
statsUserUplink: true
사용자 정책
statsUserDownlink: true
확인 대상
해당 코어의 실제 사용자 레벨

통계 항목이 비어 있으면 계정별 카운터가 생성되지 않을 수 있습니다.

API 인바운드는 일반적으로 dokodemo-door로 만들고, api 태그를 가진 요청이 API 아웃바운드로 라우팅되도록 구성합니다. 설정 파일에 API 서비스만 추가하고 라우팅 규칙을 빠뜨리면 gRPC 요청을 처리하지 못할 수 있습니다. 다음은 필드 관계를 보여 주는 일부 예시입니다.

{
  "api": {
    "tag": "api",
    "services": ["HandlerService", "StatsService"]
  },
  "stats": {},
  "policy": {
    "levels": {
      "0": {
        "statsUserUplink": true,
        "statsUserDownlink": true
      }
    }
  }
}

위 정책의 레벨 0은 설정 예시에서 사용할 값일 뿐, 모든 노드가 반드시 이 레벨을 사용한다는 뜻은 아닙니다. 실제로 적용되는 사용자의 레벨이 다르면 해당 레벨의 정책을 수정해야 합니다. 또한 통계를 켜는 것만으로 모든 인바운드·아웃바운드 카운터가 원하는 형태로 생기는 것은 아닙니다. Xray 버전과 설정에 따라 표시되는 항목을 조회해 확인하세요.

StatsService로 트래픽 확인하기

Xray의 API 명령줄 도구로 로컬 gRPC 서버의 통계를 조회할 수 있습니다. Xray 실행 파일과 설정에 맞춰 서버 주소를 지정하고, 실제로 쓰이는 명령 옵션은 설치된 버전의 도움말에서 확인하세요.

xray api statsquery --server=127.0.0.1:10085

결과에는 구성에 따라 outbound>>>태그>>>traffic>>>uplink 또는 downlink 형태의 카운터가 나타날 수 있습니다. 아웃바운드 태그는 노드 표시 이름과 같지 않을 수 있으므로 실제 설정의 outbounds[].tag를 기준으로 연결하세요. 예를 들어 노드별 태그가 node-a, node-b라면 스크립트가 두 태그의 업로드와 다운로드 값을 각각 식별하도록 해야 합니다.

판단 기준: 카운터 증가와 노드 정상 여부를 분리하세요

트래픽 카운터는 전송량을 보여 줍니다. 노드가 살아 있는지 판단하려면 별도의 연결 검사와 실패 기록이 필요합니다. 사용량이 0인 노드는 단지 현재 요청이 없을 수도 있습니다.

카운터를 주기적으로 저장할 때는 누적값과 구간별 사용량을 구분하세요. 조회 시 통계를 초기화하는 옵션을 사용하면 그 뒤의 값은 새 구간부터 계산될 수 있으므로, 초기화 전후 값을 같은 누적 기록처럼 비교하면 안 됩니다. 일반적으로는 일정 간격으로 누적값을 읽고 이전 값과의 차이를 계산하는 편이 기록을 보존하기 쉽습니다. 코어 재시작이나 통계 초기화 뒤 값이 감소하는 경우도 별도 구간으로 처리하세요.

노드 전환 자동화: 검사와 변경을 분리하기

실제 전환은 통계 조회만으로 완성되지 않습니다. 먼저 후보 노드를 어떻게 검사할지 정하고, 실패가 일시적인지 확인한 다음, 선택된 노드가 새 연결에 적용되도록 해야 합니다. 간단한 스크립트라도 전환 조건을 너무 민감하게 잡으면 순간적인 패킷 손실이나 대상 사이트의 응답 지연만으로 노드가 계속 바뀌는 플래핑이 생길 수 있습니다.

  1. 태그 정리

    사용할 아웃바운드마다 node-a, node-b처럼 고유한 태그를 부여합니다. 구독을 갱신할 때 태그가 바뀔 수 있는 클라이언트라면 설정 생성 후 실제 태그를 다시 확인하세요.

  2. 통계 수집

    StatsService에서 각 태그의 업로드·다운로드 카운터를 일정 간격으로 조회합니다. 예를 들어 10초 간격은 관찰 주기의 예시이며, 서비스의 요청량과 운영 목적에 맞게 조정하세요.

  3. 연결 검사

    후보 노드별로 새 연결을 만들어 검사합니다. 검사 주소와 제한 시간을 고정하고, 카운터가 증가하는지만으로 연결 성공을 판정하지 마세요.

  4. 전환 조건 적용

    예를 들어 연속 3회 검사 실패 때만 장애 후보로 표시하고, 전환 뒤 60초 동안 재전환을 보류할 수 있습니다. 이 값은 정책 예시이므로 사용 환경에서 오탐과 복구 시간을 확인해 조정하세요.

  5. 결과 확인

    전환 뒤 새 연결이 목표 아웃바운드를 이용하는지 확인하고, 이전 노드로 돌아갈 조건과 수동 복구 방법도 기록합니다. 실행 로그에는 시각, 기존 태그, 새 태그, 검사 결과를 남기되 구독 주소나 인증 정보는 기록하지 마세요.

전환 방식은 클라이언트와 코어 구성에 따라 달라집니다. 여러 아웃바운드를 미리 구성하고 라우팅의 밸런싱·관측 기능을 사용하는 방식은 코어가 선택을 맡는 구조입니다. 외부 제어 스크립트가 설정을 바꾸는 방식은 설정 파일 재생성, 코어 재시작 또는 지원되는 런타임 API 호출이 필요할 수 있습니다. HandlerService는 실행 중인 핸들러를 관리하지만, 그 호출만으로 v2rayN의 활성 노드 표시까지 변경된다고 가정해서는 안 됩니다. 적용 전에 현재 Xray 버전의 API 명령과 클라이언트의 설정 관리 방식을 검증하세요.

API 보안과 자주 만나는 문제

gRPC API는 관리 인터페이스입니다. 로컬에서만 제어할 목적이라면 포트를 인터넷이나 신뢰하지 않는 LAN에 공개하지 마세요. 방화벽으로 접근을 제한하고, 원격 관리가 꼭 필요하다면 인증·암호화·접근 허용 범위를 갖춘 관리 경로를 별도로 설계해야 합니다. 예시의 127.0.0.1:10085는 로컬 접속을 전제로 하며, 이를 0.0.0.0으로 바꾸는 것은 단순한 연결 오류 해결책이 아닙니다.

API 연결이 거부되는데 포트는 열려 있어요

먼저 실제 코어가 API 인바운드를 시작했는지 로그를 확인하세요. 설정에 API 서비스만 있고 API 태그로 라우팅하는 구성이 빠졌거나, 다른 프로세스가 해당 포트를 사용 중일 수 있습니다. Xray가 수신하는 주소와 명령의 --server 주소도 일치시킵니다.

조회 결과에 노드별 통계가 안 보여요

실행 설정의 아웃바운드 태그와 결과 필터를 확인하고, 계정별 통계를 원한다면 실제 사용자의 정책 레벨에서 업로드·다운로드 통계가 켜져 있는지 점검하세요. 일부 카운터는 해당 연결을 실제로 사용한 뒤에 나타날 수 있습니다.

통계는 계속 쌓이는데 노드가 자동으로 바뀌지 않아요

통계 수집은 전환 결정을 실행하지 않습니다. 스크립트나 코어의 라우팅·관측 설정이 있는지 확인하고, 전환 결과가 새 연결에 반영되는 구조인지 테스트하세요. 기존 연결은 전환 뒤에도 이전 아웃바운드를 계속 사용할 수 있습니다.

전환 뒤 카운터가 갑자기 작아졌어요

코어 재시작이나 통계 초기화가 있었는지 확인하세요. 누적 카운터의 감소는 장애 판정 기준으로 바로 사용하지 말고 새 측정 구간을 시작한 것으로 기록하세요.

v2rayN 다운로드