v2rayN에서 코어가 종료되었다는 알림이 표시되거나, v2rayNG 또는 v2flyNG에서 서비스를 시작할 수 없거나, 코어를 직접 실행할 때 설정 오류가 발생하는 경우에 적용할 수 있습니다. 실제로 불러온 파일과 코어부터 확인한 다음 로그를 따라 파싱, 필드, 리소스, 포트 바인딩 단계별로 점검하세요. 이 글에서는 로컬 확인 명령, 자주 나오는 오류 예시, 수정 후 검증 방법을 소개합니다. 포트와 설정 조각은 문제 해결용 예시이며 노드 연결 정보가 아닙니다.
1. 시작 오류와 연결 오류: 먼저 문제가 발생한 단계 확인
클라이언트 창이 열렸다고 코어까지 실행된 것은 아닙니다. v2rayN은 관리 인터페이스이며, 인바운드와 라우팅, 아웃바운드 처리는 실행된 코어 프로세스가 담당합니다. 시작할 때는 보통 설정을 읽고 프로토콜 및 라우팅 객체를 구성한 다음 로컬 포트를 엽니다. 어느 단계에서든 실패하면 이후 프록시 요청을 처리할 수 없습니다.
시작 직후 로그에 Failed to start가 표시되면 뒤쪽에서 더 구체적인 원인을 찾으세요. 포트 리스닝이 성공했다는 기록이 있는데 대상에 접속할 때만 시간 초과, 인증 실패 또는 TLS 핸드셰이크 실패가 발생한다면 대개 연결 단계의 문제입니다. 이 경우 JSON의 쉼표를 반복해서 수정해도 해결되지 않으며, 인터페이스에 표시된 “연결 실패”만으로 코어가 시작되지 않았다고 판단해서는 안 됩니다.
- 파싱 단계:
invalid character,unexpected EOF등의 메시지를 확인하고 먼저 파일 내용을 점검하세요. - 구성 단계: 프로토콜 이름, 전송 설정, 라우팅 태그 및 리소스 파일 경로를 확인하세요.
- 리스닝 단계:
bind,address already in use및 권한 관련 메시지를 확인하세요. - 연결 단계: 코어가 실행된 뒤 서버 주소, DNS, 시스템 시간 및 서버 측 매개변수를 확인하세요.
2. 전체 로그와 실제로 불러온 설정 확인
마지막 줄의 “프로세스 종료”만 잘라서 보지 마세요. 실제 원인은 같은 오류 체인의 끝부분에 있는 경우가 많으며, > 같은 구분자로 연결되기도 하고 종료 메시지보다 앞에 나타날 수도 있습니다. 코어 버전과 실행 명령부터 종료 원인까지 이번 시작 기록을 연속된 텍스트로 보관하고, 이전 연결 오류와 이번 시작 오류가 섞이지 않도록 하세요.
-
현재 상태 보관
로그 패널에서 이번 시작 기록을 복사하고 현재 사용자 지정 설정을 백업하세요. 로그를 다른 사람에게 전달하기 전에는 구독 주소, 사용자 식별 정보, 비밀번호, 개인 키, 서버 주소 등 민감한 내용을 삭제하세요. 로컬 원본 파일은 그대로 보관합니다.
-
코어 확인
시작 로그에서 실행 파일 이름, 버전, 설정 경로를 확인하세요. v2rayNG는 Xray 코어를, v2flyNG는 V2Fly 코어를 사용합니다. v2rayN은 클라이언트 이름만으로 추측하지 말고 현재 시작 기록을 기준으로 판단하세요.
-
설정 확인
데스크톱 v2rayN에서는 「설정」→「매개변수 설정」에서 로컬 리스닝 관련 항목을 확인할 수 있습니다. 버전에 따라 하위 페이지 이름이 다를 수 있으므로 실제 인터페이스를 기준으로 확인하세요. 인터페이스의 포트와 생성된 설정의
inbounds를 대조합니다. -
별도 테스트
먼저 클라이언트 프록시 서비스를 중지해 중복 프로세스의 영향을 없애세요. 로그에 표시된 설정 파일을 해당 코어의 설정 테스트 명령으로 검사하세요. 다른 디렉터리에 있는 동명의
config.json파일을 대신 사용하지 마세요.
아래는 현재 흔히 사용하는 명령 형식이며 코어가 있는 디렉터리에서 실행합니다. 첫 번째 명령은 Windows의 Xray용이고, 두 번째는 test 하위 명령을 지원하는 V2Fly용입니다. 구버전은 명령 매개변수가 다를 수 있으므로 먼저 해당 실행 파일의 help 또는 -h로 확인하세요. 파일 이름에 공백이 있으면 반드시 따옴표로 묶어야 합니다.
.\xray.exe run -test -config ".\config.json"
./v2ray test -c ./config.json
3. JSON 문법 오류: 먼저 문제 문자 위치를 찾고 필드 확인
문법 파싱은 프로토콜 검사보다 먼저 진행됩니다. 노드 주소와 포트가 올바르더라도 이 단계에서 실패하면 코어가 설정을 읽을 수 없습니다. 오류 문자 주변의 따옴표, 쉼표, 중괄호와 대괄호를 우선 확인하세요. 오류 위치는 파서가 멈춘 곳일 뿐, 실제로 빠진 쉼표는 바로 앞 줄에 있을 수 있습니다.
오류: invalid character '}' looking for beginning of object key string
원인: 객체 끝에 불필요한 쉼표가 남아 있어 파서가 다음 키 이름을 기다리고 있을 수 있습니다. 해결: 닫는 중괄호 바로 앞 줄을 확인하고 마지막 쉼표를 삭제한 뒤 다시 테스트하세요.
오류: unexpected EOF
원인: 파일이 중간에 끝났습니다. 복사 누락이나 닫는 괄호 누락이 흔한 원인입니다. 해결: 파일 끝을 확인하고 편집기의 괄호 짝 찾기 기능으로 닫히지 않은 객체나 배열을 찾아보세요.
오류: invalid character 'h' looking for beginning of value
원인: 읽어 들인 내용이 따옴표 없는 텍스트로 시작할 수 있습니다. 예를 들어 구독 링크를 JSON으로 잘못 사용한 경우입니다. 해결: 파일 첫 줄을 확인해 코어 설정이 맞는지, 구독 주소나 다운로드 오류 페이지 또는 공유 링크가 아닌지 살펴보세요.
아래는 엄격한 JSON 형식의 인바운드 예시입니다. 문자열, 숫자, 괄호 구조만 보여 주는 조각으로 완전한 설정이 아니며 원본 파일을 대신해 단독으로 사용할 수 없습니다. JSON에는 영문 큰따옴표를 사용합니다. 키 이름에 한글 따옴표를 쓸 수 없으며, 문자열 안의 Windows 경로는 역슬래시를 이스케이프해야 합니다.
{
"inbounds": [
{
"tag": "local-socks",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"udp": true
}
}
]
}
- 엄격한 JSON에서는 마지막 쉼표를 허용하지 않습니다. 파서에 따른 차이를 줄이려면 문제 해결 중에는 주석 없는 표준 JSON을 사용하세요.
"port": 10808처럼 숫자로 작성하세요. 모든 숫자를 문자열로 바꾸지 마세요.- 경로는
"C:\\proxy\\access.log"처럼 쓸 수 있습니다. 단, 해당 디렉터리가 실제로 존재하고 프로세스에 쓰기 권한이 있어야 합니다. - 민감한 설정은 로컬 편집기에서 확인하고 온라인 포맷터에 업로드하지 마세요.
4. 포트 충돌: 반복해서 재시작하지 말고 프로세스 확인
설정 테스트를 통과해도 실행 시 포트를 반드시 바인딩할 수 있는 것은 아닙니다. 이전 코어 프로세스가 종료되지 않았거나 클라이언트 두 개를 동시에 실행했거나, HTTP와 SOCKS 인바운드가 같은 주소와 TCP 포트를 사용하면 충돌할 수 있습니다. Windows에서는 Only one usage of each socket address라는 오류가 표시될 수 있으며, 다른 시스템에서는 address already in use가 흔히 나타납니다.
이 숫자들은 설명용일 뿐 모든 버전의 기본값은 아닙니다. 먼저 「설정」→「매개변수 설정」에서 실제 포트를 확인한 다음 조회하세요. Windows PowerShell에서는 아래 예시 포트 두 개의 리스닝 프로세스를 확인할 수 있습니다. 조회 결과가 없더라도 해당 시점에 TCP 리스닝을 찾지 못했다는 뜻일 뿐, 권한이나 주소 설정 문제까지 배제할 수는 없습니다.
Get-NetTCPConnection -State Listen -LocalPort 10808,10809 |
Select-Object LocalAddress,LocalPort,OwningProcess
# 이전 단계에서 확인한 프로세스 ID를 -Id에 입력하세요. 4560은 예시입니다
Get-Process -Id 4560
Linux에서는 아래 명령으로 리스닝 주소, 포트 및 프로세스를 확인할 수 있습니다. 다른 사용자의 프로세스 정보를 보려면 추가 권한이 필요할 수 있습니다. 0.0.0.0 또는 ::에서 리스닝 중인 프로세스도 확인하세요. 로컬 주소에 새로 리스닝하려는 프로세스와 충돌할 수 있습니다.
ss -ltnp 'sport = :10808 or sport = :10809'
- 이전 코어 프로세스인 경우: 해당 클라이언트에서 서비스를 정상적으로 중지하고 프로세스가 종료된 것을 확인한 뒤 다시 시작하세요.
- 다른 앱이 사용 중인 경우: 정체를 알 수 없는 프로세스를 바로 종료하지 마세요. 프록시에 비어 있는 포트를 지정하고 시스템 프록시 또는 앱의 프록시 설정도 함께 변경할 수 있습니다.
- 포트를 바꾼 뒤에도
permission denied가 표시되면 시스템 정책과 예약 포트를 확인하세요. 방화벽을 끄는 것을 일반적인 해결책으로 삼지 마세요. - 코어가 리스닝에 성공하지 못했다면 브라우저 프록시, DNS 또는 원격 노드를 변경해도 로컬 바인딩 오류는 보통 해결되지 않습니다.
5. 알 수 없는 프로토콜 및 필드: 코어 지원 여부 확인
JSON 문법이 올바르다는 것은 파일을 파싱할 수 있다는 뜻일 뿐, 필드 조합까지 유효하다는 뜻은 아닙니다. Xray와 V2Fly는 공통된 기반을 갖지만 프로토콜, 전송 방식, 보안 설정을 이름만 보고 서로 바꿔 쓸 수는 없습니다. 특히 REALITY 또는 Xray 전용 흐름 제어 매개변수가 포함된 설정은 해당 기능을 명시적으로 지원하는 코어와 버전에서 사용해야 합니다.
| 로그 또는 설정 단서 | 우선 확인할 항목 | 해결 방법 |
|---|---|---|
unknown config id | protocol에 해당하는 구현이 있는지 | 철자와 대소문자, 코어 지원 여부를 확인하세요. 프로토콜 이름만 바꾸지 마세요. |
unknown field | 필드가 있는 계층과 파서 요구사항 | 실행 중인 버전의 필드 구조와 대조해 클라이언트 설정 필드를 잘못 넣은 것은 아닌지 확인하세요. |
streamSettings.security가 reality로 설정됨 | 실행 중인 프로세스가 해당 기능을 지원하는 Xray인지 확인 | 설정에 맞는 코어를 선택하고 전송 및 보안 매개변수 전체를 확인하세요. |
라우팅에서 outboundTag 참조 | 이름이 아웃바운드의 tag와 일치하는지 | 태그를 수정하세요. 일부 불일치는 요청을 라우팅할 때에야 드러날 수 있습니다. |
알 수 없는 필드가 모두 오류로 표시되는 것은 아닙니다. 일부 파싱 과정에서는 인식하지 못하는 키를 무시합니다. 따라서 “unknown field” 메시지가 없다고 해서 해당 설정이 적용되었다고 볼 수는 없습니다. 구독 그룹이나 자동 업데이트 간격 같은 클라이언트 옵션을 코어 JSON에 임의로 추가하지 말고 클라이언트의 해당 설정에서 관리하세요.
6. geo 파일 누락: 리소스 이름, 경로, 권한 확인
라우팅의 geoip: 및 geosite: 규칙에는 일반적으로 해당 지리 데이터 리소스가 필요합니다. 로그에 failed to load GeoIP 또는 failed to load geosite가 표시되면 오류 체인을 더 확인하세요. 파일을 찾을 수 없는 경우, 읽기에 실패한 경우, 분류 태그를 찾을 수 없는 경우는 서로 다른 문제입니다.
오류: no such file or directory
원인: 오류 체인에 표시된 geo 파일 경로를 확인하세요. 프로세스가 실제 리소스 디렉터리에서 데이터 파일을 찾지 못했을 수 있습니다. 해결: 로그에 표시된 디렉터리를 확인하고 클라이언트의 리소스 업데이트 기능을 사용하거나 프로그램 디렉터리 전체를 복구하세요.
오류: permission denied
원인: 프로세스에 리소스 파일 또는 상위 디렉터리를 읽을 권한이 없을 수 있습니다. 해결: 실행 계정과 디렉터리 권한을 확인하세요. 오류가 로그 파일을 가리킨다면 로그 디렉터리의 쓰기 권한을 확인해야 합니다.
- 파일 이름 확인: 흔히 사용하는 이름은
geoip.dat,geosite.dat입니다. 확장자가 숨겨진 상태에서 확장자를 중복으로 붙이지 않았는지 확인하세요. - 리소스 디렉터리 확인: 리소스 검색 위치는 클라이언트 실행 방식, 코어 및 환경 설정에 따라 달라집니다. 터미널의 현재 디렉터리와 항상 같다고 가정해서는 안 됩니다.
- 분류 확인: 파일은 있지만 규칙에 지정된 분류가 없다면 데이터 세트를 업데이트하거나 규칙의 분류 이름을 수정하세요. 같은 파일을 반복해서 복사하는 것만으로는 해결되지 않습니다.
- 업데이트 결과 확인: 업데이트에 실패하면 빈 파일이나 잘못된 내용이 남을 수 있습니다. 클라이언트에서 호환되는 리소스를 다시 받아 테스트하세요. 파일 이름만 바꾸는 방법으로 해결하려 하지 마세요.
문제 범위를 좁히려면 백업한 복사본에서 geo 데이터 관련 라우팅 규칙을 잠시 제거한 다음 설정 테스트를 실행할 수 있습니다. 복사본이 테스트를 통과해도 원인이 리소스나 규칙으로 좁혀졌다는 뜻일 뿐입니다. 실제 실행 전에 원래 규칙을 수정해야 합니다. 그렇지 않으면 트래픽 분기 방식이 달라집니다.
7. 수정 후 재검사: 설정 통과와 프록시 사용 가능 여부 구분
한 번에 변수 하나만 변경하고 수정 전후의 오류 줄을 기록하세요. 설정 테스트가 성공하면 코어를 실행해 리스닝 여부를 확인하고, 마지막으로 앱 요청이 해당 인바운드에 도달하는지와 예상한 아웃바운드로 라우팅되는지 검증하세요. 웹페이지가 한 번 열렸다고 해서 모든 라우팅 규칙이 올바르다는 뜻은 아닙니다.
설정 테스트는 통과했는데 클라이언트가 계속 시작되지 않는 이유는 무엇인가요?
먼저 두 작업이 같은 파일과 코어를 사용하는지 확인하세요. 다음으로 실행 단계의 포트 바인딩, 로그 쓰기, 실행 권한을 점검합니다. 테스트 명령만으로 포트 사용 가능 여부나 원격 서버 연결 여부를 확인할 수는 없습니다.
config.json을 수정했는데 다시 시작하면 왜 원래대로 돌아가나요?
클라이언트가 임시로 생성한 파일일 수 있습니다. 노드 편집, 라우팅 설정 또는 사용자 지정 설정 원본에서 수정한 뒤 다시 생성하세요. 시작 로그의 실제 파일 경로를 우선하고, 직접 찾은 동명의 파일을 기준으로 판단하지 마세요.
항상 관리자 권한으로 실행해야 하나요?
모든 시작 오류에 관리자 권한 실행을 일괄 적용해서는 안 됩니다. 권한 오류가 파일, 포트, 네트워크 장치 중 무엇을 가리키는지 먼저 확인하세요. 일반적인 로컬 고포트 프록시는 디렉터리와 리스닝 설정을 먼저 점검하고, TUN 등 시스템 기능이 필요한 경우에만 클라이언트 안내에 따라 권한을 부여하세요.
코어는 실행됐는데 웹페이지가 열리지 않으면 어떻게 해야 하나요?
먼저 앱이 올바른 프록시 유형과 포트를 사용하고 있는지 확인하세요. 앱 요청이 실제로 인바운드에 도달한다면 아웃바운드 연결 로그, 노드 매개변수 및 시스템 시간을 점검합니다. 이 단계에서는 연결 문제 해결로 전환하고 모든 문제를 JSON 문법 탓으로 돌리지 마세요.
문제를 제보할 때는 클라이언트 이름, 실제 코어 버전, 시스템 플랫폼, 민감 정보를 삭제한 전체 시작 오류 체인, 문제를 재현할 수 있는 최소 설정 조각을 함께 첨부하세요. 기본 사용법은 빠른 시작 가이드를 참고하세요. 인바운드, 아웃바운드 및 라우팅 필드는 전체 설정 가이드에서 확인할 수 있습니다.