v2rayN이 실행된다고 연결을 담당하는 코어까지 작동 중인 것은 아닙니다. 시작 직후 종료되거나 계속 재시작되고 로컬 프록시 포트가 열리지 않는 데스크톱 사용자를 위해, 전체 시작 로그를 바탕으로 포트, 설정 문법, 코어 호환성, 규칙 리소스를 차례로 점검합니다. 노드를 계속 바꾸기보다 로컬 포트가 열렸는지와 실제 요청 결과를 확인해 문제를 해결하세요.
1. 코어 시작 오류와 연결 오류 구분하기
v2rayN은 클라이언트 인터페이스이고, V2Ray와 Xray는 설정을 해석하고 포트를 열어 프록시 트래픽을 처리하는 코어입니다. 인터페이스에 서버 목록이 보인다는 것은 클라이언트 데이터가 읽혔다는 뜻일 뿐입니다. 코어 프로세스가 종료되면 로컬 프록시 포트도 닫힐 수 있습니다. 이 단계에서는 시스템 프록시를 바꾸거나 지연 시간을 반복해서 측정해도 시작 오류가 해결되지 않습니다.
먼저 메인 창 아래쪽 로그 영역에서 가장 최근의 시작 기록을 확인하세요. 로그 영역이 접혀 있으면 해당 패널을 펼치세요. 버전에 따라 패널 이름은 다를 수 있습니다. 시작 시간, 코어 이름과 버전, 첫 오류, 종료 정보를 기록하세요. 특히 failed, error, 파일 경로, 포트 번호가 포함된 전체 행을 남기고 마지막의 “시작 실패” 문구만 잘라내지 마세요.
이 단계는 문제 발생 지점을 구분하기 위한 것으로, 모든 코어 내부에서 반드시 같은 순서로 실행된다는 뜻은 아닙니다. 설정 읽기 오류, 규칙 리소스 로드 실패, 포트 바인딩 실패는 원격 연결 문제보다 먼저 확인해야 합니다. 반대로 코어가 계속 실행되고 포트도 열려 있는데 접속할 때만 i/o timeout이나 핸드셰이크 오류가 발생한다면, 노드 주소와 네트워크, 전송 방식, 보안 설정을 확인하세요.
- 시작 직후 종료: 시작 기록부터 아래로 확인해 처음 나타나는 구체적인 오류를 찾으세요. 포트, 필드 이름, 누락된 파일이 주요 단서입니다.
- 코어는 실행되지만 웹 페이지가 열리지 않음: 먼저 앱이 로컬 프록시를 사용 중인지 확인한 다음 요청 로그에서 아웃바운드 오류를 살펴보세요.
- TUN 모드에서만 시작 실패: TUN을 끄고 일반 프록시 포트로 테스트해 가상 네트워크 어댑터 권한 문제와 설정 파싱 문제를 구분하세요.
2. 포트 충돌: 점유 프로세스를 확인한 뒤 수신 설정 변경하기
포트 충돌은 이전 코어가 종료되지 않았거나 클라이언트를 중복 실행했을 때, 또는 다른 로컬 서비스가 같은 포트를 사용할 때 자주 발생합니다. 아래에서는 127.0.0.1:10808을 점검 예시로 사용합니다. 예시 숫자는 현재 설치 환경의 기본 설정을 의미하지 않습니다. 「설정」→「매개변수 설정」에서 실제 로컬 수신 포트를 확인하고 명령의 숫자를 해당 값으로 바꾸세요.
오류 예시: bind: address already in use
원인: 지정한 주소와 포트를 다른 프로세스가 이미 사용 중입니다. 오류 행에서 TCP인지 UDP인지도 확인해야 합니다.
해결: 포트를 점유한 프로세스를 확인하고 중복 실행된 인스턴스를 정상 종료하세요. 또는 사용 가능한 포트로 변경하고 고정 프록시 포트를 사용하는 앱의 설정도 함께 바꾸세요.
오류 예시: Only one usage of each socket address
원인: Windows에서 흔히 나타나는 소켓 바인딩 충돌 메시지입니다. 전체 오류 행에는 보통 수신 주소도 표시됩니다.
해결: 해당 주소를 사용 중인 프로세스를 확인하세요. 오류가 발생하지 않은 다른 인바운드 포트만 바꾸지 않도록 주의하세요.
Windows PowerShell에서 먼저 아래 명령을 실행하세요. 결과의 OwningProcess는 프로세스 ID입니다. 두 번째 명령으로 프로세스 이름과 확인 가능한 경로를 조회할 수 있습니다. 첫 번째 명령에서 결과가 나오지 않아도 현재 일치하는 TCP 수신 포트가 없다는 뜻일 뿐입니다. UDP 충돌이나 시스템 예약 포트 문제까지 배제할 수는 없습니다.
Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, OwningProcess
Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
ForEach-Object { Get-Process -Id $_.OwningProcess } |
Select-Object Id, ProcessName, Path
Get-NetUDPEndpoint -LocalPort 10808 -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, OwningProcess
확인 기준: 점유 프로세스를 파악한 뒤 종료
점유한 프로세스가 남아 있는 코어 또는 중복 실행 인스턴스라고 확인된 경우에만 종료하세요. 다른 서비스라면 클라이언트 포트를 바꾸는 편이 낫습니다. 주소 점유가 아닌 접근 권한 오류라면 예약 포트와 보안 정책을 확인하고 시스템 프로세스를 무작정 종료하지 마세요.
3. JSON 형식 오류: 문법 오류와 설정 필드 호환성 구분하기
사용자 설정을 가져온 직후 시작에 실패하면 먼저 JSON을 파싱할 수 있는지 확인하고, 그다음 필드가 코어에서 지원되는지 확인하세요. JSON 문법 오류에는 불필요한 쉼표, 빠진 따옴표, 짝이 맞지 않는 괄호가 있습니다. 필드 호환성 오류는 문법이 완전히 올바른 파일에서도 발생할 수 있습니다. 두 문제는 해결 순서가 다르므로 모든 설정 오류를 구독 문제로 단정하지 마세요.
오류 예시: invalid character
원인: 예상하지 못한 문자를 읽었습니다. JSON 끝의 불필요한 쉼표나 곡선 따옴표가 있거나, 웹 페이지 내용을 설정 파일로 저장했을 때 흔히 발생합니다.
해결: 오류가 발생한 부분을 확인하세요. 파일 첫 부분에 HTML 태그가 있다면 웹 페이지를 문자 단위로 고치려 하지 말고 올바른 설정을 다시 가져오세요.
오류 예시: unexpected EOF
원인: 파서가 필요한 내용을 모두 읽기 전에 파일 끝에 도달했습니다. 복사 과정에서 내용이 빠졌거나 파일이 잘렸을 수 있습니다.
해결: 원본 설정과 비교해 파일이 완전한지 확인하고 누락된 부분을 복원하세요. 오른쪽 괄호 하나를 덧붙여 앞부분의 손상을 가리려 하지 마세요.
엄격한 JSON 문법에서는 객체의 마지막 항목 뒤에 쉼표를 둘 수 없습니다. 아래는 문법이 올바른 일부 예시이며, 바로 실행할 수 있는 전체 코어 설정은 아닙니다. 사용자 설정 파일을 검사할 때는 노드 인증 정보가 포함된 파일을 온라인 포맷터에 올리지 말고 로컬 편집기에서 문법을 확인하세요.
{
"log": {
"loglevel": "warning"
}
}
- 사용자 설정 원본을 먼저 백업하고 오류에 표시된 경로와 행·열 정보를 보관하세요. 일부 오류는 문자 위치만 알려 주므로 주변 내용을 함께 확인해야 합니다.
- 일반 노드를 사용하는 경우 v2rayN이 매개변수를 바탕으로 설정을 생성합니다. 노드 편집 화면으로 돌아가 필드를 수정하고 임시로 생성된 실행 파일만 고치지 마세요.
- 사용자 정의 전체 설정을 사용한다면 원본 파일을 수정한 뒤 다시 불러오세요. 한 번 재시작한 다음 이번 시작 로그만 비교하세요.
- 문법 검사를 통과했는데도 문제가 계속되면 프로토콜, 전송 방식, 보안 설정, 규칙 리소스를 확인하세요. 파싱된다고 해서 실행까지 된다는 뜻은 아닙니다.
4. 알 수 없는 프로토콜 및 필드: 실제로 실행된 코어 확인하기
v2rayN, V2Ray, Xray의 버전은 서로 다른 항목입니다. 클라이언트 인터페이스를 업데이트해도 사용 중인 모든 코어 파일이 업데이트되는 것은 아닙니다. 새 코어 파일이 디스크에 있어도 이번 실행에서 해당 파일을 선택했다는 보장은 없습니다. 시작 로그에 기록된 코어 이름과 버전을 기준으로 노드에 필요한 기능을 확인하세요. 설치 파일 이름만 보고 실제 버전을 추측하지 마세요.
오류 예시: unknown field
원인: 현재 설정 로더가 해당 필드를 지원하지 않습니다. 버전 차이, 잘못된 계층 구조, 다른 형식의 설정 사용 등이 원인일 수 있습니다. 일부 로더는 알 수 없는 필드를 오류 없이 무시하기도 합니다.
해결: 로그에 표시된 필드 이름을 바탕으로 설정 계층을 확인하고 실제 코어가 지원하는 형식에 맞게 수정하세요. 필드를 삭제하는 것만으로 연결 매개변수가 모두 갖춰졌다고 판단하면 안 됩니다.
오류 예시: unknown config id
원인: 설정을 구성하는 과정에서 등록된 해당 유형을 찾지 못했습니다. 프로토콜이나 전송 방식 이름과 관련됐을 수 있으므로 같은 오류 흐름에 표시된 구체적인 식별자를 확인해야 합니다.
해결: 식별자의 철자와 기능 지원 범위를 확인하세요. 설정이 다른 코어의 기능에 의존한다면 이름만 바꾸지 말고 호환되는 코어와 설정을 사용하세요.
| 점검 항목 | 확인할 내용 | 피해야 할 해결 방법 |
|---|---|---|
| VMess / VLESS | 프로토콜 종류, 인증 매개변수, 현재 코어의 지원 여부 | 나머지 설정은 그대로 두고 프로토콜 이름만 바꾸기 |
| 전송 설정 | 전송 유형, 관련 설정 객체, 필드 계층 구조 | 다른 설정 형식의 필드를 그대로 붙여 넣기 |
| 보안 설정 | TLS 또는 REALITY에 필요한 매개변수와 코어 지원 여부 | 오류를 피하려고 보안 설정을 바로 끄기 |
| 실행 파일 | 시작 로그에 기록된 코어와 버전 | 클라이언트 버전만으로 기능 지원을 단정하기 |
VLESS 프로토콜과 REALITY 보안 설정은 구분해야 합니다. 서로 같은 옵션이 아닙니다. 코어가 VLESS를 지원하더라도 특정 설정 파일에 포함된 모든 전송 방식과 보안 기능까지 지원한다고 볼 수는 없습니다. 서버에서 요구하는 설정을 유지하면서 호환되는 코어를 선택하세요. 보안 필드를 임의로 삭제하면 시작 오류 대신 이후 핸드셰이크 오류가 발생할 수 있습니다.
5. 규칙 파일 누락: 경로, 리소스 형식, 접근 권한 확인하기
라우팅 규칙에서 외부 리소스를 참조할 때 파일이 없거나 읽을 수 없으면 시작이 중단될 수 있습니다. V2Ray와 Xray 설정에서 자주 사용하는 geoip.dat와 geosite.dat는 각각 IP와 도메인 분류에 쓰입니다. 다른 코어는 규칙 형식이 다를 수 있으므로 확장자만 바꿔 함께 사용하지 마세요. 오류 행에 표시된 실제 경로와 리소스 유형을 기준으로 확인하세요.
오류 예시: failed to open file
원인: 참조한 리소스를 열 수 없습니다. 이어지는 오류 메시지에 파일 이름과 파일이 없거나 접근 권한이 제한된 이유가 표시되는 경우가 많습니다.
해결: 전체 경로와 파일 존재 여부, 현재 사용자의 읽기 권한을 확인하세요. 클라이언트에서 제공하는 리소스 업데이트 기능을 이용해 호환되는 규칙 파일을 복원하세요.
오류 예시: failed to load geosite
원인: 도메인 분류 리소스를 불러오지 못했습니다. 파일 누락이나 손상, 또는 현재 리소스에 없는 분류를 규칙에서 참조한 경우일 수 있습니다.
해결: 이어지는 상세 오류를 확인하세요. 파일이 없으면 리소스를 복원하고, 분류가 없으면 규칙 작성 방식과 리소스 버전이 서로 맞는지 살펴보세요.
- 먼저 설치 파일이 온전한지 확인: 실행 파일만 옮겼다면 원래 폴더에 있던 코어와 리소스가 빠졌을 수 있습니다. 필요한 폴더 구조를 복원한 뒤 다시 실행하세요.
- 상대 경로도 확인: 사용자 설정의 상대 경로는 실행 환경을 기준으로 해석되며 설정 파일이 있는 폴더를 기준으로 하지 않을 수 있습니다. 실제로 존재하는 절대 경로로 테스트해 위치를 확인하세요.
- 보안 프로그램 기록 확인: 파일이 격리되었는지 확인하세요. 출처와 조치 기록을 먼저 살펴보고 보안 기능 전체를 바로 끄지 마세요.
- 마지막으로 라우팅 규칙 참조 확인: 파일을 읽을 수 있지만 분류가 없다면 규칙 백업을 복원하거나 리소스에 실제로 존재하는 분류를 사용하세요. 라우팅을 임의로 전체 직접 연결로 바꾸지 마세요.
6. 한 번에 한 항목만 바꾸고 포트와 요청으로 확인하기
수정 전에 현재 설정과 로그를 저장한 다음 한 번에 한 항목만 변경하세요. 포트 바인딩, JSON 문법, 프로토콜 필드, 규칙 리소스 순서로 확인하면 좋습니다. 다만 로그에서 누락된 파일을 명확히 지목한다면 모든 단계를 기계적으로 거치지 말고 해당 오류부터 해결하세요. 수정할 때마다 변경 내용과 결과를 기록해야 구독 업데이트, 코어 변경, 라우팅 수정을 동시에 했을 때 원인을 놓치지 않습니다.
- 최소 구성으로 복구: TUN과 당장 필요하지 않은 사용자 규칙을 끄고, 매개변수가 완전한 노드 하나를 선택한 뒤 일반 로컬 프록시 포트는 유지하세요.
- 한 번 재시작: 이번 시작 시간부터 로그를 확인해 즉시 종료되지 않는지 살펴보세요. 실제 코어 이름과 버전도 기록하세요.
- 로컬 포트가 열렸는지 확인: 앞에서 안내한 명령으로 실제 포트를 확인하고, 다른 클라이언트 인스턴스가 아니라 이번에 실행한 코어가 포트를 열었는지 확인하세요.
- 프록시를 사용하는 요청 보내기: 해당 포트가 SOCKS 서비스를 제공한다면 아래 명령으로 확인할 수 있습니다. 요청 로그도 함께 살펴 DNS, 연결, 핸드셰이크 중 어느 단계에서 오류가 발생했는지 판단하세요.
- 기능을 하나씩 복원: 라우팅 규칙을 먼저 복원한 다음 TUN을 다시 켜세요. 항목을 추가할 때마다 로그를 확인해 문제가 다시 발생하는 지점을 찾으세요.
curl.exe --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 --head https://example.com/
이 Windows 예시 명령은 연결 시간 제한을 10초, 전체 시간 제한을 20초로 설정합니다. 실행 전에 실제 SOCKS 포트로 바꾸세요. socks5h는 대상 도메인의 처리를 프록시 서버에 맡긴다는 뜻입니다. 로컬에서 HTTP 프록시만 열려 있다면 해당 프록시 유형으로 변경해야 합니다. HTTP 응답을 받았다고 해서 모든 웹 사이트에 접속할 수 있는 것은 아닙니다. 요청 시간 초과가 발생해도 코어 시작 실패를 의미하지는 않습니다.
정리: 시작 성공과 프록시 연결을 각각 확인하세요
코어가 계속 실행되고 올바른 프로세스가 포트를 열었다면 시작 단계는 통과한 것입니다. 이후에도 시간 초과나 핸드셰이크 실패가 발생한다면 요청 로그를 따라 원격 연결을 확인하세요. 클라이언트를 반복해서 재설치할 필요는 없습니다.
7. 로그 문제 해결 FAQ
마지막 줄에 “프로세스가 종료됨”만 표시되면 어디를 봐야 하나요?
같은 시작 기록에서 더 앞에 나온 첫 번째 구체적인 오류를 찾고, 뒤따르는 원인 메시지도 함께 보관하세요. 종료 알림은 대개 결과일 뿐입니다. 실제로 조치할 수 있는 정보는 앞부분의 포트 번호, 필드 이름, 파일 경로에 있는 경우가 많습니다.
v2rayN을 관리자 권한으로 실행하면 해결되나요?
모든 문제에 통하는 해결책은 아닙니다. 일반 루프백 프록시 포트를 여는 데는 보통 관리자 권한이 필요하지 않지만, TUN이나 특정 네트워크 작업에는 추가 권한이 필요할 수 있습니다. 먼저 TUN을 끄고 비교 테스트하세요. 관리자 권한을 부여해도 JSON 문법 오류나 프로토콜 비호환성은 해결되지 않습니다.
구독 업데이트는 성공했는데 왜 시작되지 않나요?
업데이트 성공은 구독을 가져와 처리했다는 뜻일 뿐, 최종 실행 설정의 호환성까지 보장하지는 않습니다. 매개변수가 완전한 노드 하나로 바꾸고 현재 코어를 확인한 다음 전역 라우팅 설정도 점검하세요. 전역 규칙 오류는 여러 노드에 영향을 줄 수 있습니다.
문제 해결을 위해 로그를 공유할 때 어떤 내용을 남겨야 하나요?
운영체제 버전, 클라이언트 버전, 실제 코어 버전, 재현 단계, 한 번의 전체 시작 과정에서 발생한 오류 흐름을 남기세요. 구독 주소, 인증 정보, 개인 키 등 민감한 정보는 가리세요. 로컬 포트, 오류 필드 이름, 민감 정보를 제거한 디렉터리 구조는 가능한 한 유지하세요.