v2rayN이 실행된다고 해서 프록시 커널까지 작동하는 것은 아닙니다. 이 글은 Windows 데스크톱 버전을 기준으로 시작 과정을 따라가며 로그에서 처음 발생한 오류를 찾고, 수신 대기 포트, JSON 설정, 프로토콜 호환성, 커널 파일을 차례로 점검합니다. 먼저 커널을 정상적으로 시작한 뒤 시스템 프록시, DNS, 라우팅을 확인해 각 단계의 문제를 구분하세요.
먼저 프로세스, 설정, 포트 수신 대기 중 어느 단계에서 실패했는지 확인
v2rayN은 설정 및 제어 인터페이스이고, Xray와 V2Fly 같은 커널이 실제 트래픽을 처리합니다. 시작을 누르면 클라이언트는 실행 파일을 찾고 설정을 생성한 다음 프로세스를 실행해 커널이 로컬 포트에서 수신 대기하도록 합니다. 어느 단계에서든 실패하면 ‘시작 실패’가 표시되거나 커널이 반복해서 종료될 수 있지만, 원인에 따라 해결 방법은 다릅니다.
클라이언트 로그 창을 열어 현재 기록을 저장한 다음 한 번 더 시작해 보세요. 이번 작업의 시각을 기준으로 가장 먼저 나타난 failed, error 또는 프로세스 시작 오류를 찾습니다. 마지막의 ‘프로세스가 종료되었습니다’는 대개 결과일 뿐입니다. 실제 원인은 그보다 앞선 몇 줄, 특히 콜론 뒤에 이어지는 상세 오류에 있는 경우가 많습니다.
- 현재 선택한 설정과 커널 이름, 로그에 표시된 실행 파일 경로를 기록합니다.
- 마지막 상태 메시지만 캡처하지 말고 첫 번째 오류와 그 앞뒤 로그를 복사합니다.
- 한 번에 설정 하나만 바꾸고 다시 시작한 뒤 새 로그를 비교해 오류가 달라졌는지 확인합니다.
포트 충돌: PID를 확인한 뒤 프로세스를 종료하거나 포트를 변경하세요
로그에 bind, address already in use 또는 Windows 소켓 점유 메시지가 표시되면 해당 로컬 주소와 포트를 먼저 확인하세요. 클라이언트를 중복 실행했거나 이전 커널이 종료되지 않았거나 다른 프로그램이 같은 포트를 사용하면 새 커널이 수신 대기하지 못할 수 있습니다.
오류: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
원인 및 해결 방법: 같은 수신 대기 주소와 포트를 이미 다른 프로세스가 사용 중입니다. 점유 프로세스를 조회해 어떤 프로그램인지 확인한 뒤 정상적으로 종료하세요. 두 프로그램을 모두 실행해야 한다면 한쪽의 포트를 변경합니다.
아래 예시에서는 10808과 10809를 사용합니다. 이는 설정 예시일 뿐, 모든 버전의 기본값이 아니며 두 연결 지점을 반드시 함께 활성화해야 하는 것도 아닙니다. 로그에 실제로 표시된 바인딩 포트와 클라이언트 설정을 기준으로 확인하세요.
PowerShell에서 다음 명령을 실행하세요. 출력된 OwningProcess가 PID입니다. 두 번째 명령으로 프로세스 이름과 경로를 확인할 수 있습니다. 일부 프로세스 정보는 관리자 권한이 있어야 조회할 수 있습니다.
Get-NetTCPConnection -State Listen -LocalPort 10808,10809 -ErrorAction SilentlyContinue |
Select-Object LocalAddress,LocalPort,OwningProcess
Get-NetTCPConnection -State Listen -LocalPort 10808,10809 -ErrorAction SilentlyContinue |
ForEach-Object { Get-Process -Id $_.OwningProcess } |
Select-Object Id,ProcessName,Path -Unique
- 클라이언트가 중복 실행된 것이 확인되면 시스템 트레이에서 불필요한 인스턴스를 정상 종료하세요. 이름이 같은 프로세스를 모두 강제 종료하지 마세요.
- 포트를 바꾸려면 ‘설정’ → ‘매개변수 설정’에서 로컬 수신 대기 항목을 확인하세요. 항목 이름은 버전에 따라 다를 수 있으므로 실제 화면을 기준으로 합니다.
- 포트를 변경한 뒤에는 수동으로 설정한 브라우저 프록시, 명령줄 프록시, 시스템 프록시도 함께 바꾸세요. 그렇지 않으면 계속 이전 포트로 연결을 시도합니다.
- 주소 점유가 아니라 접근 권한 부족 오류라면 시스템 예약 포트와 로컬 보안 정책을 확인하세요. 모든
bind오류를 프로세스 중복으로 단정해서는 안 됩니다.
JSON 형식 오류: 문법을 먼저 고친 뒤 설정 내용을 확인하세요
JSON 파싱 오류가 발생하면 커널은 아직 설정 읽기를 완료하지 못한 상태입니다. 객체 끝의 불필요한 쉼표, 큰따옴표 대신 사용한 따옴표, 문자열에서 이스케이프하지 않은 백슬래시, 구독 내용을 완전한 JSON 설정으로 가져온 경우 등이 흔한 원인입니다. 입력 형식은 파일 확장자만 바꾼다고 서로 변환되지 않습니다.
오류: invalid character '}' looking for beginning of object key string
원인 및 해결 방법: 객체를 닫기 전에 불필요한 쉼표가 있을 수 있습니다. 오류 위치 주변의 키-값 쌍을 확인해 끝의 쉼표를 삭제하고, 바로 앞 줄의 따옴표와 괄호도 점검하세요.
오류: unexpected EOF
원인 및 해결 방법: 파서가 내용의 끝에 도달했지만 뒤에 문자가 더 있을 것으로 예상하는 상태입니다. 파일이 잘렸거나 괄호가 닫히지 않았을 때 흔히 발생합니다. 전체 설정을 다시 확보한 뒤 객체와 배열의 괄호가 제대로 닫혔는지 확인하세요.
아래 예시는 올바른 JSON의 일부 구조만 보여 주며, 바로 실행할 수 있는 프록시 설정은 아닙니다. Windows 경로를 JSON 문자열에 넣을 때는 백슬래시를 이스케이프해야 합니다. 파일 탐색기에서 경로를 사용할 때는 백슬래시를 두 번 쓸 필요가 없습니다.
{
"log": {
"loglevel": "warning",
"error": "C:\\v2rayN\\logs\\error.log"
}
}
- 사용자 설정을 먼저 백업한 뒤 오류가 발생한 파일이 직접 가져온 설정인지, 클라이언트가 자동으로 생성한 실행 설정인지 확인하세요.
- 자동 생성 파일은 설정을 전환하거나 다시 시작할 때 덮어써질 수 있습니다. 임시 출력 파일만 수정하지 말고 원본 설정이나 클라이언트 옵션을 고치세요.
- 구독 주소, UUID, 비밀번호, 키가 포함된 전체 설정을 온라인 포맷터에 올리지 마세요. 공유해야 한다면 먼저 로컬에서 민감한 정보를 가리세요.
알 수 없는 프로토콜 및 필드: 필드 이름만 바꾸지 말고 커널 지원 여부를 확인하세요
JSON 문법 검사에 통과했다고 해서 설정이 반드시 실행되는 것은 아닙니다. 설정은 선택한 커널의 구조와 기능도 지원해야 합니다. VMess와 VLESS는 프로토콜 이름이고, REALITY는 해당 기능을 지원하는 커널이 필요한 전송 보안 방식입니다. 이 이름들을 임의로 바꿔 쓸 수 있는 레이블처럼 취급해서는 안 됩니다.
오류: unknown protocol: vless
원인 및 해결 방법: 해당 프로토콜을 지원하지 않는 구형 커널을 사용 중이거나 예상과 다른 커널이 실제로 실행되고 있을 수 있습니다. 커널 경로와 버전을 확인한 뒤 전체 설정 요건에 맞는 호환 커널을 선택하세요. VLESS를 VMess로 무작정 바꾸면 안 됩니다.
‘알 수 없는 필드’와 ‘필수 필드 누락’ 오류도 구분해서 처리해야 합니다. 알 수 없는 필드를 처리하는 방식은 커널, 설정 입력 경로, 파서에 따라 다르며 무시하는 경우도, 거부하는 경우도 있습니다. 따라서 알 수 없는 필드 오류가 없다고 해서 해당 필드가 적용되었다고 볼 수는 없습니다. 시작 로그와 해당 버전의 설정 안내를 추가로 확인하세요.
| 점검 항목 | 확인할 내용 | 해결 방법 |
|---|---|---|
| 프로토콜 이름 | protocol의 철자와 커널 지원 여부를 확인합니다 | 해당 프로토콜을 지원하는 커널을 사용하고 프로토콜을 임의로 바꾸지 않습니다 |
| 전송 보안 | REALITY 등 설정에 필요한 필드와 버전 요건을 확인합니다 | 제공된 매개변수에 따라 설정 전체를 다시 구성합니다 |
| 설정 출처 | 구독, 공유 링크, 커널 전용 JSON 중 어떤 형식인지 확인합니다 | 해당 형식에 맞는 가져오기 기능을 사용하고 다른 형식의 내용을 붙여 넣지 않습니다 |
| 실제 실행 파일 | 시작 로그에 표시된 경로와 버전 출력을 확인합니다 | 새 인터페이스가 이전 커널 파일을 계속 실행하지 않도록 확인합니다 |
v2rayNG는 Xray 커널을, v2flyNG는 V2Fly 커널을 사용합니다. 그렇다고 두 앱에서 내보낸 모든 실행 설정을 데스크톱에서 그대로 사용할 수 있는 것은 아닙니다. 다른 환경으로 옮길 때는 클라이언트가 지원하는 구독 또는 공유 링크를 우선 사용한 다음 프로토콜과 전송 매개변수를 확인하세요. 지원 기능은 클라이언트 이름이 아니라 실제 커널 버전에 따라 달라집니다.
커널 파일 누락: 압축 해제 상태, 아키텍처, 파일 접근 권한 확인
커널 버전 정보도 출력되지 않고 로그에 파일을 찾을 수 없다고 표시되면 노드가 아니라 프로그램 파일부터 점검해야 합니다. 클라이언트 인터페이스가 실행된다는 것은 인터페이스 프로그램이 작동한다는 뜻일 뿐, 커널과 관련 파일이 지정된 폴더에 모두 갖춰졌다는 의미는 아닙니다.
오류: The system cannot find the file specified.
원인 및 해결 방법: 실행 대상이나 종속 파일의 경로가 존재하지 않습니다. 로그에 표시된 전체 경로를 확인하고 압축 파일이 완전히 풀렸는지, 커널이 예상 폴더에 있는지, 파일이 이동되거나 격리되지 않았는지 점검하세요.
오류: Access is denied.
원인 및 해결 방법: 현재 계정 또는 시스템 정책이 실행, 읽기, 쓰기를 차단하고 있습니다. 파일 권한, 제어된 폴더 액세스, 보안 프로그램 기록을 확인해 구체적인 차단 원인을 해결하세요. 모든 보안 기능을 무작정 끄지 마세요.
- 전체 프로그램을 현재 계정에서 쓸 수 있는 별도 폴더에 압축 해제하세요. 예:
C:\Tools\v2rayN. 압축 파일 미리 보기 창에서 바로 실행하지 마세요. - Windows의 ‘설정’ → ‘시스템’ → ‘시스템 정보’에서 시스템 종류를 확인하고 운영체제 및 프로세서 아키텍처에 맞는 설치 파일을 선택하세요.
- 커널 폴더를 변경했다면 클라이언트가 실제로 호출하는 경로를 확인하세요. 새 파일을 다른 폴더에 복사해도 기존 경로가 자동으로 바뀌지는 않습니다.
- 로그에 규칙 리소스 파일이 누락되었다고 명확히 표시되면 해당 리소스를 확인하세요. 실행 파일 누락과 라우팅 리소스 누락은 서로 다른 문제입니다.
설정 테스트와 재시작으로 수정 결과 확인
설정 자체의 문제인지 클라이언트 실행 환경의 문제인지 구분해야 한다면 커널의 테스트 기능을 사용할 수 있습니다. 아래 방법은 해당 명령을 지원하는 Xray에서만 사용할 수 있습니다. 실제 커널 폴더에서 PowerShell을 열어 먼저 도움말을 확인한 뒤 저장된 전체 설정 사본을 테스트하세요. 예시 파일명은 diagnosis.json이며 미리 준비해야 합니다. 앞서 나온 로그 설정 일부만 복사해서는 안 됩니다.
.\xray.exe version
.\xray.exe help run
.\xray.exe run -test -config .\diagnosis.json
테스트 매개변수는 현재 실행 파일의 도움말 출력을 기준으로 하세요. Xray 명령을 다른 커널에 그대로 적용하지 마세요. 설정 테스트는 설정을 불러올 수 있는지 확인하는 기능으로, 실제 시작이나 포트 바인딩, 원격 연결 검증을 대신하지 않습니다. 테스트를 통과해도 포트 충돌이나 노드 연결 불가 문제는 남아 있을 수 있습니다.
- 별도로 실행한 테스트 프로세스를 종료하고 v2rayN으로 돌아와 현재 설정을 시작하세요. 수동으로 실행한 프로세스가 같은 포트를 점유하지 않도록 합니다.
- 로그에 기존 오류가 더는 나타나지 않고 프로세스가 시작 직후 종료되지 않는지 확인합니다.
- 로컬 수신 대기 포트를 다시 조회해 해당 PID가 이번에 시작한 커널의 프로세스인지 확인합니다.
- 마지막으로 필요한 시스템 프록시나 TUN을 활성화해 브라우저 연결을 확인하세요. 먼저 기본 프록시가 작동하는지 확인한 뒤 복잡한 라우팅 규칙을 추가합니다.
자주 묻는 질문: 재설치, 관리자 권한, 로그의 민감 정보 가리기
재설치했는데 왜 같은 오류가 계속 발생하나요?
같은 오류가 있는 설정을 다시 가져왔거나 이전 프로세스가 포트를 계속 점유하면 문제가 재현될 수 있습니다. 기존 데이터를 먼저 저장하고 별도 폴더에서 형식이 올바른 설정 하나로 비교 테스트를 해 보세요. 그런 다음 구독과 규칙을 하나씩 복원하고 기존 설정을 한꺼번에 덮어쓰지 마세요.
시작 오류가 발생하면 반드시 관리자 권한으로 실행해야 하나요?
그렇지는 않습니다. 일반적인 로컬 프록시 수신 대기와 높은 권한이 필요한 TUN 작업은 구분해야 합니다. 로그에서 실패한 대상을 먼저 확인하세요. 권한을 높여도 JSON 오류나 프로토콜 비호환 문제는 해결되지 않습니다. 해당 권한이 문제라는 점이 확인된 경우에만 관리자 권한 실행을 고려하세요.
구독 업데이트는 성공했는데 커널이 시작되지 않는 이유는 무엇인가요?
구독을 성공적으로 내려받았다는 것은 내용이 도착했다는 뜻일 뿐, 모든 항목이 현재 커널과 호환된다는 의미는 아닙니다. 설정 하나를 선택해 시작하고 프로토콜, 전송 방식, 보안 매개변수를 확인한 뒤 실제 커널 버전도 점검하세요. 구독을 반복해서 새로고침하는 것으로 시작 오류 분석을 대신하지 마세요.
도움을 요청할 때 어떤 로그를 제공하고 어떤 정보는 가려야 하나요?
클라이언트 및 커널 버전, 시스템 아키텍처, 실패한 작업, 첫 번째 오류와 앞뒤 로그를 제공하세요. 구독 주소, UUID, 비밀번호, 키, 개인 폴더 경로는 가리세요. 문제 발생 단계를 판단할 수 있도록 필드 이름, 오류 원문, 로컬 포트는 남겨 두세요.