v2rayN에 “시간 초과”가 표시되어도 문제의 위치가 반드시 노드 서버인 것은 아닙니다. 속도 측정, Xray 코어, 원격 포트, 전송 핸드셰이크, 로컬 수신 포트와 시스템 프록시는 서로 다른 계층에 있습니다. 어느 한 계층에서든 연결이 끊기면 웹페이지가 열리지 않거나 테스트가 시간 초과로 끝날 수 있습니다. 노드를 계속 바꿔 보는 것만으로는 실제 원인이 가려지기 쉽습니다.
보다 안정적인 방법은 정해진 순서로 범위를 좁혀 가는 것입니다. 먼저 PC 시간을 확인하고, 구독 데이터를 검증한 다음 기본 네트워크와 원격 포트를 점검합니다. 이어서 로컬 포트와 코어 실행 상태를 확인하고 프로토콜 매개변수를 대조한 뒤, 마지막으로 트래픽이 실제로 v2rayN을 거치는지 확인합니다. 비용이 적고 영향 범위가 큰 항목부터 점검하므로 시스템 프록시 문제가 확인되기 전에 노드 설정을 반복해서 바꾸는 일도 줄일 수 있습니다.
1단계: PC 시간, 시간대와 동기화 상태 보정
VMess, TLS, REALITY 연결 과정에는 모두 시간 검증이 포함됩니다. 시스템 시간이 크게 어긋나면 VMess 요청이 허용된 시간 범위를 벗어나 거부될 수 있고, TLS 인증서도 아직 유효하지 않거나 이미 만료된 것으로 판단될 수 있습니다. 이런 문제는 보통 모든 노드에서 동시에 나타나며, 시스템 절전 모드 해제, 메인보드 전원 차단, 가상 머신 일시 중지 후 복귀 또는 수동 시간대 변경 이후에 특히 자주 발생합니다.
먼저 작업 표시줄의 시간이 정확한지 확인한 다음 시스템의 날짜 및 시간 설정으로 이동하세요. 시간대가 현재 위치와 일치하는지 확인하고 즉시 동기화를 한 번 실행합니다. 시계를 ‘대략 맞아 보이게’ 수동으로 조정하는 것만으로는 충분하지 않습니다. 분 단위가 맞더라도 날짜, 연도 또는 시간대가 틀리면 핸드셰이크에 영향을 줄 수 있습니다. 동기화가 완료되면 v2rayN을 종료했다가 다시 시작하여 새 연결에 보정된 시간이 사용되도록 하세요.
이 단계에서는 다음과 같은 로그 메시지를 중점적으로 확인할 수 있습니다. 코어 버전에 따라 문구는 조금씩 다르지만 의미는 비슷합니다.
invalid user
authentication failed
certificate has expired
certificate is not yet valid
TLS handshake error
rejected common/drain
invalid user는 UUID 입력 오류만을 뜻하지 않습니다. VMess 환경에서는 PC 시간 오차 때문에 인증이 실패할 수도 있습니다. 원래 작동하던 여러 VMess 노드에서 같은 시각에 동일한 오류가 발생했다면 노드를 하나씩 편집하기 전에 시간을 먼저 확인하세요. 로그에 인증서 날짜 범위 오류가 명확히 표시된다면 전송 보안 설정을 바로 끄지 말고 시스템 날짜와 시간대도 함께 점검해야 합니다.
2단계: 구독 유효성, 업데이트 성공 여부와 최신 그룹의 현재 노드 확인
구독 주소를 저장할 수 있다고 해서 그 안의 노드 데이터가 여전히 유효한 것은 아닙니다. 구독 권한 만료, 업데이트 요청 거부, 빈 구독 내용, 서버 측 포트 변경, 업데이트 후에도 이전 그룹의 동일한 이름의 노드가 선택된 경우가 흔합니다. 이때 v2rayN 메인 화면에는 서버 기록이 남아 있어도 해당 기록 자체는 이미 만료되었을 수 있습니다.
먼저 현재 선택된 구독 그룹을 확인한 뒤 대상 구독을 업데이트하세요. 목록에 내용이 남아 있는지만 보지 말고, 업데이트 결과에 서버가 추가·삭제 또는 갱신되었다고 명확히 표시되는지 확인합니다. 업데이트 후 서버 수, 포트 또는 노드 이름이 바뀌었다면 해당 그룹에서 노드를 다시 선택해 활성 서버로 지정하세요. 이전 기록과 새 기록의 이름이 같은 경우 이름만으로는 현재 사용 중인 항목을 구분할 수 없습니다.
구독 업데이트에 실패하면 로그 또는 알림 영역에 다음과 같은 키워드가 자주 표시됩니다.
subscription update failed
unauthorized
forbidden
not found
timeout
empty subscription
failed to parse
unauthorized 또는 forbidden은 보통 구독 권한 상태나 주소 매개변수가 더 이상 유효하지 않다는 뜻입니다. not found는 요청 경로가 변경되었을 가능성을 나타내며, failed to parse는 반환된 내용이 클라이언트가 예상한 구독 데이터가 아님을 의미합니다. 업데이트 자체가 시간 초과로 끝나면 먼저 현재 직접 연결된 네트워크에서 구독 도메인을 해석하고 접속할 수 있는지 확인하세요. 주소에 접근 자격 증명이 포함될 수 있으므로 전체 구독 주소를 공개 로그나 공개 페이지에 붙여 넣지 마세요.
같은 구독의 다른 노드는 연결되는데 특정 노드 하나만 시간 초과된다면 구독 전체는 정상적으로 가져온 경우가 많고, 문제는 해당 노드의 원격 포트나 매개변수에 있을 가능성이 큽니다. 그룹 전체가 동시에 작동하지 않는다면 먼저 구독 상태와 서버 변경 공지를 확인하세요. 구독 노드를 수동으로 수정하는 것은 임시 검증 용도로만 사용해야 합니다. 다음 업데이트에서 수정 내용이 덮어써질 수 있으므로 최종 매개변수는 구독 원본과 일치해야 합니다.
3단계: 도메인 해석, 원격 포트와 현재 네트워크를 나누어 점검
노드 주소는 보통 도메인 또는 IP입니다. 연결 전에는 최소한 두 가지 기본 검사가 필요합니다. 도메인이 주소로 해석되는지, 그리고 현재 네트워크에서 대상 TCP 또는 UDP 포트에 도달할 수 있는지 확인해야 합니다. 지연 시간 테스트가 시간 초과로 끝났다는 사실만으로는 테스트 경로가 제한 시간 안에 완료되지 않았다는 뜻일 뿐, 프로토콜 설정 오류라고 단정할 수 없습니다.
노드가 도메인을 사용한다면 먼저 해석 결과를 조회하세요. Windows에서는 다음 명령을 사용할 수 있습니다.
nslookup node.example.net
macOS 또는 Linux에서도 nslookup을 사용할 수 있습니다. 해당 시스템 도구가 있다면 dig로 레코드를 확인할 수도 있습니다. 주소를 조회하지 못하거나 명확한 오류가 반환되거나 네트워크에 따라 결과 차이가 크다면 먼저 DNS 문제를 해결하세요. VMess, VLESS 등의 서버 포트는 일반 웹페이지를 제공하지 않는 경우가 많으므로 브라우저에서 노드 도메인을 직접 여는 것은 신뢰할 수 있는 테스트가 아닙니다.
도메인이 정상적으로 해석되면 원격 TCP 포트를 확인하세요. Windows PowerShell에서는 다음을 실행할 수 있습니다.
Test-NetConnection node.example.net -Port 443
macOS 또는 Linux에서는 다음을 실행할 수 있습니다.
nc -vz node.example.net 443
명령의 도메인과 포트는 실제 노드 값으로 바꿔야 합니다. TCP 검사에 성공했다는 것은 원격 포트와 기본 연결을 수립할 수 있다는 뜻일 뿐, UUID, TLS, WebSocket 경로 또는 REALITY 매개변수가 올바르다는 의미는 아닙니다. 검사가 계속 시간 초과된다면 원격 서비스가 포트를 수신 대기하지 않거나, 현재 네트워크가 해당 포트를 제한하거나, 방화벽이 연결을 삭제하거나, 노드 주소가 도달할 수 없는 위치로 해석되었을 가능성이 있습니다.
| 테스트 결과 | 가능성이 높은 문제 계층 | 다음 조치 |
|---|---|---|
| 도메인 해석 불가 | 로컬 DNS, 네트워크 DNS 또는 도메인 레코드 | 신뢰할 수 있는 DNS로 바꾼 뒤 다시 조회하고 노드 도메인 철자를 확인 |
| 도메인 해석 가능, 포트 시간 초과 | 원격 수신 대기 상태, 방화벽 또는 현재 네트워크 경로 | 네트워크를 바꿔 재테스트하고 서버 측 포트 상태 확인 |
| 포트 연결 가능, 핸드셰이크 실패 | 프로토콜, 보안 계층 또는 전송 매개변수 | 5단계로 이동해 매개변수를 항목별로 대조 |
| 다른 네트워크에서는 정상, 현재 네트워크에서 시간 초과 | 현재 접속 네트워크 또는 해당 DNS | 네트워크 정책, DNS와 외부 연결 제한 확인 |
네트워크를 바꿔 보는 것은 매우 유용한 비교 테스트입니다. 같은 기기에서 같은 노드와 같은 설정을 사용했는데 다른 접속 네트워크에서 즉시 복구된다면 클라이언트 설정 자체는 대체로 정상입니다. 점검 초점을 원래 네트워크의 DNS, 포트 정책, 라우팅 경로 또는 게이트웨이 설정으로 옮기세요. 반대로 여러 네트워크에서 같은 단계에서 실패한다면 로컬 코어와 노드 매개변수를 계속 확인해야 합니다.
4단계: 로컬 포트 충돌과 Xray 코어 실행 결과 확인
v2rayN은 로컬에서 SOCKS, HTTP 또는 혼합 프록시 포트를 수신 대기해야 합니다. 포트를 다른 프로세스가 이미 사용 중이면 Xray 코어가 실행되지 않거나, v2rayN 화면은 실행 중인 것처럼 보여도 로컬 애플리케이션이 프록시에 연결하지 못할 수 있습니다. 흔한 로그로는 address already in use, failed to listen, bind, permission denied가 있습니다.
먼저 v2rayN 설정에서 현재 로컬 수신 포트를 확인한 다음 어떤 프로세스가 해당 포트를 사용 중인지 확인하세요. 아래 명령은 10808을 예시로 사용했으며, 실제 점검에서는 화면에 표시된 포트로 바꿔야 합니다.
Windows:
netstat -ano | findstr :10808
macOS:
lsof -nP -iTCP:10808 -sTCP:LISTEN
Linux:
ss -lntp | grep 10808
포트를 사용 중인 프로세스가 현재 v2rayN이 실행한 코어가 아니라면 충돌하는 프로그램을 먼저 종료하거나 v2rayN에서 사용되지 않는 로컬 포트로 변경하세요. 포트를 바꾼 뒤에는 프록시 주소를 수동으로 설정한 브라우저, 다운로드 도구 또는 터미널 환경 변수도 함께 업데이트해야 합니다. v2rayN의 포트만 바꾸고 애플리케이션에 저장된 이전 포트를 그대로 두면 ‘코어는 정상인데 애플리케이션은 계속 시간 초과’라는 두 번째 문제가 생깁니다.
포트 충돌은 없지만 로그에 코어 설정 로드 실패가 표시된다면 오류가 실행 단계에서 발생했는지 연결 단계에서 발생했는지 확인하세요. 실행 단계에서 failed to load config, unknown field, failed to create server가 나타난다면 생성된 설정에 현재 코어가 인식하지 못하는 필드가 포함되었거나 포트, 파일 권한 또는 라우팅 규칙에 문제가 있을 가능성이 큽니다. 이때는 최근에 변경한 사용자 지정 설정을 먼저 되돌린 뒤 코어를 다시 시작하세요.
로컬 포트가 실제로 수신 대기 상태인지도 확인할 수 있습니다. v2rayN이 코어를 시작하면 포트 검사에서 해당 프로세스를 확인할 수 있어야 하며, 코어를 중지하면 수신 대기도 사라져야 합니다. 화면 조작과 포트 상태가 일치하지 않는다면 v2rayN을 완전히 종료하고 남아 있는 코어 프로세스가 끝났는지 확인한 다음 다시 실행하세요. v2rayN을 여러 인스턴스로 동시에 실행하면 동일한 포트와 시스템 프록시 설정을 서로 차지하려 할 수 있습니다.
5단계: 프로토콜, 전송과 보안 매개변수를 항목별로 대조
원격 포트에는 연결되지만 Xray 로그에 핸드셰이크 단계 오류가 나타난다면 가장 흔한 원인은 클라이언트와 서버 매개변수가 일치하지 않는 것입니다. 노드 이름과 서버 주소가 같다고 해서 나머지 필드까지 재사용할 수 있는 것은 아닙니다. 프로토콜, 보안 계층, 전송 방식과 인증 필드는 하나의 묶음으로 대조해야 합니다.
VMess에서는 서버 주소, 포트, 사용자 ID, 보안 설정과 전송 방식을 중점적으로 확인하세요. 최신 VMess 설정은 대체로 AEAD를 사용하므로 관련 매개변수는 구독에서 제공한 데이터를 기준으로 해야 합니다. VLESS는 주소, 포트와 사용자 ID 외에도 암호화 필드, 전송 보안과 flow를 대조해야 합니다. XTLS Vision을 사용하는 설정에는 보통 xtls-rprx-vision이 표시되며, 클라이언트 flow는 서버 설정과 일치해야 합니다. 다른 VLESS 노드가 연결된다고 해서 해당 값을 그대로 복사해서는 안 됩니다.
전송 계층에는 빠뜨리기 쉬운 조합 필드도 있습니다.
- WebSocket: 경로, Host, TLS 상태와 서버 이름을 확인하세요. 경로의 슬래시, 대소문자와 추가 쿼리 내용도 매칭에 영향을 줄 수 있습니다.
- gRPC: serviceName, 전송 보안과 서버 이름을 확인하세요. serviceName은 일반 웹 경로가 아니므로 임의로 바꿔 사용할 수 없습니다.
- TCP: 헤더 유형과 관련 필드가 서버 설정과 일치하는지 확인하세요. 일반 TCP와 특정 위장 헤더를 사용하는 설정은 서로 다른 매개변수 조합입니다.
- TLS: SNI, 인증서 도메인과 안전하지 않은 인증서 허용 여부를 확인하세요. 정상적인 배포에서는 인증서와 일치하는 서버 이름을 사용해야 합니다.
- REALITY: 서버 이름, 공개 키, shortId, 지문과 flow를 확인하세요. 어느 한 필드라도 빠졌거나 일부만 복사되면 핸드셰이크가 실패할 수 있습니다.
| 로그 키워드 | 일반적인 의미 | 확인할 항목 |
|---|---|---|
| connection reset by peer | 상대방이 핸드셰이크 중 연결을 능동적으로 종료 | 프로토콜, 전송 방식, TLS와 서버 수신 대기 설정 |
| bad certificate | 인증서 검증 또는 서버 이름 불일치 | SNI, 인증서 도메인, PC 시간 |
| websocket: bad handshake | WebSocket 업그레이드가 예상대로 완료되지 않음 | 경로, Host, TLS, 리버스 프록시 규칙 |
| authentication failed | 인증 필드 또는 시간 조건 불일치 | 사용자 ID, 키 관련 필드, PC 시간 |
| reality verification failed | REALITY 핸드셰이크 매개변수 불일치 | 공개 키, shortId, 서버 이름, 지문 |
| context deadline exceeded | 작업이 제한 시간 안에 완료되지 않음 | 원격 도달 가능성, 핸드셰이크 매개변수, 네트워크 품질 |
매개변수를 대조할 때는 기억에 의존해 다시 작성하지 말고 현재 노드와 구독 원본 기록을 필드별로 비교하는 것이 좋습니다. 먼저 프로토콜을 확인하고 주소와 포트를 대조한 다음 인증 필드를 확인하고 마지막으로 전송 및 보안 계층을 점검하세요. 한 번에 차이 하나만 수정한 뒤 재연결하면 어떤 항목이 실패를 일으켰는지 판단할 수 있습니다.
같은 서버에 서로 다른 프로토콜용 진입점이 여러 개 있더라도 포트를 서로 바꿔 사용할 수는 없습니다. 특정 포트가 TCP 테스트에 응답한다는 것은 그곳에 서비스가 있다는 뜻일 뿐, 현재 선택한 VMess 또는 VLESS 설정을 받고 있다는 의미는 아닙니다. VLESS 매개변수를 VMess 진입점으로 보내거나 WebSocket 설정을 일반 TCP 진입점으로 보내면 대개 핸드셰이크 단계에서 연결이 끊깁니다.
6단계: 시스템 프록시, 라우팅 모드와 애플리케이션 트래픽이 v2rayN으로 들어가는지 확인
앞의 다섯 단계에서는 ‘코어가 노드에 연결되는지’를 확인했습니다. 마지막 단계에서는 ‘애플리케이션이 트래픽을 코어에 전달하는지’를 확인합니다. 노드 지연 시간 테스트는 성공했는데 브라우저에서 페이지가 열리지 않는다면 노드를 계속 바꾸기보다 시스템 프록시, 애플리케이션 프록시 설정과 라우팅 규칙을 먼저 점검해야 합니다.
시스템 프록시 모드를 사용할 때는 v2rayN이 시스템 프록시 설정을 실제로 적용했는지 확인하고, 시스템 프록시 주소가 로컬 루프백 주소와 현재 수신 포트를 가리키는지 점검하세요. 이전에 포트를 바꿨다면 시스템 설정에는 여전히 이전 값이 남아 있을 수 있습니다. 시스템 프록시를 다시 설정한 뒤 대상 애플리케이션을 종료했다가 다시 열어 시작 시 읽은 오래된 프록시 설정이 계속 사용되지 않도록 하세요.
일부 프로그램은 시스템 프록시를 따르고, 일부는 자체 네트워크 설정을 사용하며, 일부 명령줄 도구는 HTTP 또는 SOCKS 프록시를 별도로 설정해야 합니다. 비교 테스트로 판단할 수 있습니다. 먼저 시스템 프록시를 확실히 따르는 브라우저에서 테스트한 다음 대상 프로그램의 프록시 설정을 확인하세요. 브라우저는 작동하지만 특정 프로그램만 시간 초과된다면 노드와 v2rayN 코어는 대체로 정상이며 문제는 해당 프로그램의 프록시 설정에 있습니다.
TUN 모드를 사용할 때는 TUN이 정상적으로 시작되었는지 확인하고, 인터페이스 생성, 라우팅 기록 또는 권한 관련 오류가 로그에 있는지 살펴보세요. permission denied, failed to create interface, operation not permitted는 대개 가상 인터페이스 또는 라우팅이 설정되지 않았다는 뜻입니다. 이 경우 노드 설정이 올바르더라도 트래픽이 예상대로 코어에 들어가지 않습니다. 권한과 인터페이스 실행 문제를 해결한 뒤 DNS가 현재 TUN 설정에 의해 처리되는지도 확인하세요.
라우팅 분할 때문에 ‘일부 웹사이트만 시간 초과되고 다른 사이트는 정상인’ 현상도 발생할 수 있습니다. v2rayN이 요청을 Xray에 전달하면 Xray는 위에서 아래 순서로 규칙을 적용해 직접 연결, 프록시 또는 차단 출구를 선택합니다. 대상 도메인이 직접 연결 규칙에 먼저 걸렸는데 현재 네트워크에서 직접 접속할 수 없다면 특정 사이트만 시간 초과될 수 있고, 차단 규칙에 걸리면 즉시 실패합니다. 점검할 때는 잠시 단순한 전역 프록시로 전환해 문제가 노드에 있는지 라우팅 규칙에 있는지 구분할 수 있습니다. 원인을 확인한 뒤에는 원래 모드로 복원하고 규칙 순서를 수정하세요. 테스트 모드에 계속 의존해서는 안 됩니다.
DNS도 라우팅 모드의 영향을 받습니다. 도메인이 도달할 수 없는 주소로 해석되거나, DNS 요청이 예상한 출구로 전달되지 않거나, 애플리케이션이 별도의 보안 DNS를 사용하면 트래픽이 설정된 경로를 우회할 수 있습니다. 로그에 대상 도메인에 해당하는 요청이 전혀 보이지 않는다면 트래픽이 아직 v2rayN에 들어오지 않았을 가능성이 있습니다. 요청은 보이지만 최종 출구가 direct 또는 block이라면 분할 라우팅 규칙을 확인하세요. 프록시 출구로 들어간 뒤에만 시간 초과된다면 3단계와 5단계로 돌아가 원격 경로와 핸드셰이크 매개변수를 다시 대조합니다.
마지막 전체 재테스트
- 네트워크 요청을 진행 중인 애플리케이션을 종료해 기존 연결이 결과에 미치는 영향을 제거하세요.
- v2rayN을 다시 시작하고 코어가 정상적으로 실행되며 로컬 포트가 수신 대기 중인지 확인하세요.
- 매개변수를 확인한 노드를 선택해 지연 시간 테스트를 한 번 실행하고 관련 로그를 확인하세요.
- 시스템 프록시를 다시 설정하거나 TUN 인터페이스와 라우팅이 생성되었는지 확인하세요.
- 대상 애플리케이션을 열고 테스트 요청을 하나만 보내 로그에 해당 도메인 또는 대상 주소가 나타나는지 확인하세요.
- 로그의 출구, 오류 발생 단계와 소요 시간을 바탕으로 문제가 애플리케이션, 로컬 프록시, 라우팅 또는 원격 노드 중 어디에 있는지 판단하세요.
6단계를 완료하면 문제는 대개 몇 가지 명확한 결론으로 좁혀집니다. PC 시간이나 로컬 포트 이상으로 모든 노드가 동시에 작동하지 않거나, 특정 구독 그룹이 만료되었거나, 현재 네트워크에서 원격 포트에 도달할 수 없거나, 특정 노드의 프로토콜 매개변수가 일치하지 않거나, 노드 연결은 정상이지만 애플리케이션이 시스템 프록시와 라우팅을 거치지 않는 경우입니다. 이때 원인에 맞는 조치를 취하는 편이 무작정 재설치하거나 여러 노드를 한꺼번에 수정하는 것보다 기존의 정상 설정을 보존하기 쉽습니다.