V2Ray 코어가 시작되지 않을 때: 로그로 config.json 설정 오류 찾기

클라이언트 로그에서 JSON 문법 오류, 포트 충돌, 필드 오타, 프로토콜 매개변수 누락으로 인한 대표 오류를 분석하고 수정 방법과 시작 성공 확인 기준을 안내합니다.

이 글 한눈에 보기

v2rayN, v2rayNG 또는 v2flyNG에서 코어 종료, 설정 불러오기 실패, 시작 직후 중단이 발생한 사용자를 위한 안내입니다. 첫 오류 확인, JSON 구조 검사, 수신 포트 확인, 필드와 프로토콜 매개변수 검토, 로그와 로컬 포트 재테스트 순서로 점검합니다.

먼저 시작 단계에서 실패했는지 확인하기

코어 시작 실패와 노드 연결 실패는 서로 다른 문제입니다. 시작에 실패하면 V2Ray 또는 Xray 프로세스가 보통 config.json을 읽거나 인바운드 리스너를 만들거나 아웃바운드 설정을 초기화하는 과정에서 종료됩니다. 반면 노드 연결 실패는 코어가 실행 중인 상태에서 대상 접속이 시간 초과되거나 핸드셰이크에 실패하거나 서버가 거부하는 경우입니다. 점검 방법도 다르므로 단순히 웹 페이지가 열리지 않는다는 이유만으로 판단해서는 안 됩니다.

로그를 연 다음 위쪽으로 이동해 이번 시작 과정의 첫 번째 error 또는 failed를 찾으세요. 뒤에 나오는 프로세스 종료나 재시작 실패는 결과일 뿐이며, 실제 원인은 대개 앞의 한 줄에서 다섯 줄 안에 있습니다. 예를 들어 설정 파싱 오류는 먼저 문자 위치를 표시한 뒤 코어 종료 코드를 보여 주고, 포트 충돌은 먼저 리스닝 주소를 표시한 뒤 시작 실패를 보고합니다.

v2rayN 7.x를 예로 들면, 먼저 「설정」→「매개변수 설정」→「Core 유형」에서 현재 노드가 Xray Core를 사용하는지 v2fly Core를 사용하는지 확인한 뒤 메인 화면에서 로그 영역을 여세요. Core 유형을 변경했다면 한 번 다시 시작해 현재 코어가 생성한 새 기록만 남기세요. 이전 설정의 오류를 현재 문제로 오해하는 일을 줄일 수 있습니다.

  1. 코어 중지

    클라이언트에서 중지 작업을 실행하고 로그에 프로세스 종료 정보가 나타날 때까지 기다립니다. 기존 프로세스가 로컬 리스닝 포트를 더 이상 사용하지 않는지도 확인하세요.

  2. 로그 지우기

    로그 창을 비우거나 현재 시간을 기록한 다음 코어를 한 번만 시작하세요. 연속 재시도로 같은 오류가 반복 기록되는 것을 막을 수 있습니다.

  3. 첫 오류 찾기

    새 로그의 위쪽부터 내려오며 failed, error, invalid 또는 unknown이 포함된 첫 기록을 찾습니다.

  4. 주변 로그 기록

    오류 행 앞뒤의 각 세 줄을 보관하고 설정 파일 경로, 행·열 위치, 리스닝 포트와 아웃바운드 태그를 기록하세요.

  5. 한 번에 하나씩 수정

    한 번에 한 문제만 수정하고 저장한 뒤 다시 시작하세요. 여러 필드를 동시에 변경하면 새 로그만으로 어떤 수정이 적용됐는지 판단하기 어렵습니다.

1개
첫 오류부터 처리
3줄
앞뒤 로그 맥락 보관
3초
프로세스가 계속 실행되는지 확인
2회
중지·시작 재테스트 완료

JSON 문법 오류: 행·열 위치를 기준으로 구조 수정

config.json은 표준 JSON 문법을 따라야 합니다. 키 이름과 문자열에는 반각 큰따옴표를 사용하고, 배열과 객체는 각각 대괄호와 중괄호로 작성하며, 인접한 필드 사이는 쉼표로 구분해야 합니다. 마지막 필드 뒤에는 불필요한 쉼표를 둘 수 없습니다. 중국어 입력기에서 생긴 곡선 따옴표, 빠진 따옴표, 복사 과정에서 섞인 주석 때문에 코어가 프로토콜 매개변수를 처리하기도 전에 중단될 수 있습니다.

아래 조각은 port 행 끝에 쉼표가 빠져 있어 파서가 다음 행의 protocol을 읽지 못합니다. 로그의 행 번호는 때때로 문제가 발견된 위치를 가리키므로, 실제로 빠진 문자는 바로 앞 행에 있을 수 있습니다.

{
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 10808
      "protocol": "socks"
    }
  ]
}

수정할 때 오류가 표시된 문자만 보지 마세요. 안내된 위치에서 위로 올라가 가장 가까운 중괄호 묶음을 확인하고, 각 객체의 키-값 쌍이 올바르게 구분되어 있는지 점검해야 합니다. 파일 처음부터 끝까지 괄호가 쌍을 이루는지도 확인하세요. 편집기가 JSON 서식 지정을 지원한다면 먼저 실행하세요. 서식 지정이 되지 않는다면 구조가 아직 닫히지 않았을 가능성이 큽니다.

오류: invalid character '}' looking for beginning of object key string

원인 및 해결:객체 끝에 불필요한 쉼표가 남아 있거나, 쉼표 뒤에 다음 키 이름이 없습니다. 오류 위치의 바로 앞 행을 확인해 끝 쉼표를 삭제하거나 완전한 키-값 쌍을 추가하세요.

오류: invalid character 'p' after object key:value pair

원인 및 해결:인접한 두 필드 사이에 쉼표가 빠졌습니다. 로그에 표시된 행의 바로 앞 행을 확인하고 이전 값 뒤에 반각 쉼표를 추가하세요.

오류: unexpected end of JSON input

원인 및 해결:객체나 배열을 닫기 전에 파일이 끝났습니다. 마지막에 빠진 중괄호나 대괄호를 확인하고, 설정을 복사할 때 일부만 저장되지 않았는지 점검하세요.

오류: invalid character '/' looking for beginning of value

원인 및 해결:설정에 // 또는 블록 주석이 들어갔을 수 있습니다. 표준 JSON은 이런 주석을 허용하지 않으므로 주석을 삭제하고 실제 필드만 남기세요.

포트 충돌: 충돌 프로세스와 중복 인바운드 찾기

JSON을 정상적으로 파싱하면 코어는 인바운드 리스너를 차례로 생성합니다. v2rayN의 이전 프로세스가 종료되지 않았거나 다른 로컬 네트워크 도구가 같은 포트를 사용하거나 config.json의 두 인바운드가 같은 주소와 포트를 사용하면 리스닝 단계에서 시작이 중단됩니다. 로그에는 보통 listen, bind, address already in use 같은 키워드가 표시됩니다.

일반적인 테스트 설정에서는 SOCKS 인바운드를 127.0.0.1:10808, HTTP 인바운드를 127.0.0.1:10809에 둡니다. 이 숫자가 모든 클라이언트 버전에서 고정된 값은 아니므로 실제 점검에서는 로그와 현재 매개변수 설정을 기준으로 삼으세요. 로그에 충돌 포트가 10808로 표시되면 10808만 확인하고 원격 서버 포트까지 동시에 변경할 필요는 없습니다.

로그 단서 주요 원인 처리 방법
bind 127.0.0.1:10808 이전 코어 또는 다른 프로그램이 로컬 포트를 사용 중 프로세스를 찾아 정상 종료한 뒤 다시 시작
address already in use 두 인바운드가 같은 리스닝 조합 사용 한 인바운드에 다른 포트 할당
permission denied 포트 또는 실행 디렉터리 권한 부족 일반 사용자용 높은 포트로 변경하고 디렉터리 권한 확인
cannot assign requested address 리스닝 주소가 이 컴퓨터에서 사용할 수 없는 주소 127.0.0.1 또는 올바른 로컬 주소로 변경

Windows에서는 터미널에서 다음 명령을 실행해 10808을 사용하는 프로세스 번호를 확인할 수 있습니다. 결과의 마지막 열이 6420이라고 가정하면 두 번째 명령으로 프로세스 이름을 조회하세요. 포트가 사용 중이라는 이유만으로 임의의 시스템 프로세스를 종료하지 말고, 먼저 종료되지 않은 이전 코어 인스턴스인지 확인해야 합니다.

netstat -ano | findstr :10808
tasklist /FI "PID eq 6420"

오류: failed to listen TCP on 127.0.0.1:10808

원인 및 해결:로컬 TCP 리스너를 만들지 못했습니다. 10808을 사용하는 프로세스를 확인하고 이전 인스턴스를 종료하거나 「설정」→「매개변수 설정」에서 로컬 포트를 변경한 뒤 다시 시작하세요.

오류: bind: Only one usage of each socket address is normally permitted

원인 및 해결:같은 주소와 포트 조합이 이미 사용 중입니다. 클라이언트가 중복 실행되지 않았는지, 설정의 여러 inbound가 같은 포트를 사용하지 않는지 확인하세요.

결론: 포트를 먼저 해제한 뒤 번호 변경 검토

이전 프로세스가 남아 있을 때 10810으로 바꾸면 충돌을 잠시 피할 수 있을 뿐이며 시스템 프록시는 계속 이전 포트를 가리킵니다. 먼저 남은 인스턴스를 종료하고 포트가 해제됐는지 확인하세요. 포트를 다른 필수 프로그램이 계속 사용해야 할 때만 인바운드 포트와 시스템 프록시 설정을 함께 변경해야 합니다.

필드 오타: 계층, 코어와 설정 형식 구분하기

필드 이름을 올바르게 입력했더라도 잘못된 계층에 배치하면 설정 불러오기에 실패할 수 있습니다. TLS의 서버 이름을 예로 들면 serverName은 해당 전송 보안 설정 안에 있어야 하며 outbound 루트에 임의로 둘 수 없습니다. settingssetting으로 쓰거나 streamSettingsstreamSetting으로 쓰는 경우, 배열 필드를 단일 객체로 작성하는 경우도 같은 문제를 일으킵니다.

서로 다른 코어 또는 버전의 설정 조각을 섞는 것도 흔한 원인입니다. v2rayN은 노드와 Core 유형에 따라 설정을 생성할 수 있지만 Xray Core와 v2fly Core는 일부 프로토콜, 플로우 값과 전송 필드의 지원 범위가 완전히 같지 않습니다. 한 코어에서 작동하는 설정이 Core 유형을 그대로 바꾼 뒤에도 불러와진다고 보장할 수 없습니다.

{
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": []
      },
      "streamSettings": {
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com"
        }
      }
    }
  ]
}

오류: json: unknown field "streamSetting"

원인 및 해결:필드 이름 끝의 문자가 빠졌습니다. 올바른 이름은 보통 streamSettings입니다. 현재 코어가 지원하는 설정 형식에 맞춰 수정하고, 단순한 철자 추측에만 의존하지 마세요.

오류: failed to parse outbound config

원인 및 해결:아웃바운드 객체의 프로토콜 이름, settings 구조 또는 전송 계층이 요구 형식과 다릅니다. 먼저 최소한의 아웃바운드 하나만 남긴 뒤 TLS, 전송과 라우팅 매개변수를 하나씩 복원하세요.

오류: failed to load config files

원인 및 해결:상위 단계의 종합 메시지라서 필드를 바로 특정하기 어렵습니다. 같은 시작 과정에서 앞쪽에 기록된 unknown field, invalid value 또는 구체적인 파일 행 번호를 찾으세요.

  1. v2rayN의 「설정」→「매개변수 설정」→「Core 유형」에서 선택한 코어가 노드 프로토콜과 일치하는지 확인하세요.
  2. 로그에 표시된 실제 설정 경로를 확인해 백업 파일이나 이전 디렉터리의 config.json을 편집한 것이 아닌지 점검하세요.
  3. 복잡한 설정을 인바운드 하나와 아웃바운드 하나로 줄이고, 시작되는 것을 확인한 뒤 DNS, 라우팅과 추가 인바운드를 복원하세요.
  4. 오류가 구독 노드에서 발생했다면 클라이언트에서 노드 매개변수를 편집한 뒤 설정을 다시 생성하세요. 실행 중인 임시 파일만 수정하지 마세요.

결론: 알 수 없는 필드는 위치를 바꿔 가며 해결할 수 없음

먼저 현재 Core 유형과 설정 형식을 확인한 다음 필드가 속한 객체를 검토하세요. 필드를 여러 계층으로 반복 이동하면 오류 하나는 사라질 수 있지만 의미가 잘못되어 코어가 시작된 뒤에도 연결되지 않을 수 있습니다.

프로토콜 매개변수 누락: 인바운드부터 아웃바운드까지 단계별 점검

JSON 문법과 필드 계층이 모두 올바른 뒤에야 코어가 프로토콜 매개변수를 검사합니다. VMess에서는 사용자 ID 형식 오류가 흔하고, VLESS에서는 주소, 포트, 사용자 ID, 암호화 값 또는 플로우 매개변수 불일치가 자주 발생합니다. TLS를 사용한다면 보안 유형과 서버 이름도 확인해야 합니다. 매개변수 누락이 반드시 missing으로 표시되는 것은 아니며, 사용자를 파싱하지 못하거나 UUID가 유효하지 않거나 지원되지 않는 플로우 값이라는 메시지로 나타날 수도 있습니다.

구독을 가져온 뒤 이런 오류가 발생하면 먼저 클라이언트에서 해당 노드의 편집 화면을 열고 서버 주소 앞뒤의 공백, 1~65535 범위의 포트, 완전한 사용자 ID, 일치하는 프로토콜과 전송 유형을 확인하세요. 구독 주소 자체를 노드 서버 주소로 사용하거나 로컬 10808 포트를 원격 서버 포트 위치에 입력하지 마세요.

설정 읽기 인바운드 파싱 아웃바운드 파싱 라우팅 연결 리스너 생성 실행 상태 진입

프로세스가 어느 단계에서 멈췄는지가 점검 범위를 결정합니다. 로그에 로컬 포트 리스닝 성공이 표시된 뒤 라우팅 태그가 없다고 보고된다면 SOCKS 인바운드로 돌아가 수정할 필요가 없습니다. 아웃바운드 사용자를 파싱하다 종료됐다면 DNS와 라우팅은 아직 작동하지 않은 것이므로 노드 프로토콜 매개변수를 우선 처리하세요.

오류: failed to parse ID: invalid UUID

원인 및 해결:VMess 또는 VLESS 사용자 ID가 완전하지 않거나 공백을 포함하거나 형식이 잘못되었습니다. 전체 ID를 다시 복사하고 앞뒤에 보이지 않는 문자가 섞이지 않았는지 확인하세요.

오류: outbound tag not found

원인 및 해결:라우팅 규칙이 참조하는 아웃바운드 태그가 없습니다. outboundTag와 outbounds 안의 tag가 대소문자와 하이픈까지 완전히 일치하는지 확인하세요.

오류: unsupported flow value

원인 및 해결:선택한 코어, 프로토콜 또는 버전에서 현재 플로우 값을 지원하지 않습니다. 노드 요구 사항을 확인하고 일치하는 Xray Core 설정을 선택하세요. 플로우를 사용하지 않는다면 잘못된 값을 삭제합니다.

오류: failed to find an available destination

원인 및 해결:아웃바운드 서버 주소를 확인할 수 없거나 대상 목록이 비어 있습니다. 주소 철자, DNS 사용 가능 여부와 아웃바운드 서버 목록에 실제 노드가 포함되어 있는지 확인하세요.

확인 대상 유효 범위 또는 형식 자주 헷갈리는 부분
로컬 인바운드 포트 1~65535이며 사용 중이지 않아야 함 원격 서버 포트와 혼동
서버 주소 완전한 도메인 또는 유효한 IP 주소 구독 주소로 붙여 넣거나 공백이 포함됨
사용자 ID 노드에서 제공한 전체 UUID 일부를 빠뜨리거나 줄바꿈이 섞임
라우팅 태그 아웃바운드 tag와 완전히 일치 대소문자가 다르거나 삭제된 태그를 참조

최소 설정 방법: 오류 범위 줄이기

로그에 여러 설정 오류가 동시에 나타날 때 가장 효과적인 방법은 모든 필드를 한 번에 수정하는 것이 아니라 실행 가능한 최소 설정을 만드는 것입니다. 먼저 로컬 인바운드 하나와 매개변수가 완전한 아웃바운드 하나만 남기고 사용자 지정 DNS, 라우팅 규칙, 추가 인바운드와 복잡한 전송 옵션은 잠시 제거하세요. 코어가 계속 실행되면 모듈별로 하나씩 복원합니다.

모듈을 하나 복원할 때마다 중지, 시작과 로컬 연결 테스트를 한 번씩 실행하세요. 예를 들어 먼저 DNS를 복원해 도메인 확인 오류가 없는지 확인하고, routing을 복원해 규칙이 참조하는 inboundTag와 outboundTag가 모두 존재하는지 확인한 뒤 추가 리스너를 복원합니다. 이렇게 하면 수십 개 필드에서 오류를 찾는 대신 방금 추가한 모듈 하나만 점검할 수 있습니다.

  1. 인바운드 유지

    127.0.0.1에서 리스닝하는 로컬 인바운드 하나만 남기고, 현재 사용되지 않는 높은 포트를 사용하세요.

  2. 아웃바운드 유지

    매개변수가 완전한 VMess 또는 VLESS 아웃바운드 하나만 남기고, 테스트에 사용하지 않는 예비 노드는 삭제하세요.

  3. 라우팅 일시 중지

    사용자 지정 routing 규칙을 잠시 제거해 삭제된 태그 참조가 시작 판단을 방해하지 않도록 하세요.

  4. 시작 재테스트

    로그에 더 이상 설정 오류가 나타나지 않고 프로세스가 3초 이상 실행되며 로컬 리스닝 포트가 유지되는지 확인하세요.

  5. 항목별 복원

    DNS, 라우팅, 추가 인바운드, 전송 옵션 순서로 복원하고 매번 하나의 모듈만 추가하세요.

시작 성공 확인: 로그·포트·연결을 모두 통과해야 함

설정 오류가 사라진 것은 첫 단계일 뿐입니다. 실제 시작 성공은 세 가지 조건을 모두 충족해야 합니다. 코어 프로세스가 즉시 종료되지 않고, 로컬 인바운드 포트가 리스닝 상태이며, 클라이언트의 테스트 요청이 해당 아웃바운드를 통과해야 합니다. 설정을 불러왔다는 메시지만 확인한 뒤 프로세스가 종료된다면 복구된 것으로 볼 수 없습니다.

시작 후 3~10초 동안 로그를 먼저 관찰하세요. 실행 정보가 계속 출력되고 새로운 failed to start, panic 또는 종료 코드가 없다면 포트를 확인합니다. Windows에서 netstat -ano | findstr :10808을 다시 실행하면 현재 코어 프로세스에 해당하는 리스닝 기록이 보여야 합니다. 클라이언트가 다른 포트로 설정되어 있다면 명령의 숫자를 바꾸세요.

그다음 클라이언트에 내장된 지연 시간 테스트나 접속 테스트를 한 번 실행하세요. 이때 TLS 핸드셰이크, 서버 시간 초과 또는 연결 거부가 나타난다면 시작 문제는 해결되었고 장애가 원격 연결 단계로 넘어간 것입니다. 이후에는 JSON 괄호를 계속 수정하지 말고 서버 주소, 네트워크 연결, TLS serverName, 전송 방식과 노드 유효성을 확인하세요.

결론: 시작 성공과 노드 사용 가능 여부를 나누어 확인

프로세스가 계속 실행되고 로컬 포트가 정상적으로 리스닝된다면 config.json이 시작 단계를 통과했다는 뜻입니다. 이후 나타나는 핸드셰이크나 시간 초과는 연결 경로 문제로 전환해 점검하세요. 단계별 확인을 통해 이미 올바른 설정 구조를 반복 수정하는 일을 막을 수 있습니다.

여전히 원인을 찾지 못했다면 이번 시작의 첫 오류, 앞뒤 세 줄의 로그, 현재 Core 유형, 클라이언트 버전과 문제가 발생한 설정 모듈을 함께 정리하세요. 로그를 공유하기 전 서버 주소, 사용자 ID, 구독 주소 같은 연결 자격 정보는 삭제하되 오류 유형, 필드 이름, 행·열 위치와 포트 번호는 남겨야 합니다. 이 정보가 설정 문제를 판단하는 핵심입니다.

v2rayN 다운로드