TROUBLESHOOTING MANUAL

V2Ray 문제 해결: 증상별로 전체 연결 경로 점검

클라이언트 프로세스, 로컬 수신 포트, 시스템 프록시, DNS, 라우팅 규칙, 원격 핸드셰이크를 단계별로 확인합니다. 한 번에 하나의 조건만 변경하고 로그나 명령으로 결과를 확인해 노드·모드·네트워크를 동시에 바꾼 뒤 판단 근거를 잃지 않도록 하세요.

애플리케이션 시스템 프록시 로컬 포트 라우팅 / DNS 노드 핸드셰이크 대상 사이트

아직 클라이언트 설치, 구독 가져오기, 첫 연결을 완료하지 않았다면 먼저 빠른 시작 가이드에 따라 작동하는 기본 연결을 구성하세요. 이 페이지는 설치 과정을 반복하는 문서가 아니라, 연결 설정을 마친 뒤에도 문제가 발생할 때 참고하는 종합 점검 문서입니다. 클라이언트 설치 파일을 바꿔야 한다면 클라이언트 다운로드 페이지로 이동하고, 짧은 질문은 자주 묻는 질문도 확인하세요.

01 / LOCAL CHAIN

연결됐지만 인터넷에 접속할 수 없음: 먼저 로컬 경로를 확인하세요

먼저 ‘인터넷에 연결되지 않음’을 검증 가능한 증상으로 나누세요

클라이언트에 ‘연결됨’으로 표시되는 것은 대개 설정이 코어에 전달되어 실행 중이라는 뜻일 뿐, 브라우저·터미널·다른 애플리케이션이 모두 노드를 통해 대상 주소에 접속할 수 있다는 의미는 아닙니다. 먼저 시스템 프록시를 끄거나 현재 설정을 중지한 뒤, 원래 네트워크로 평소 안정적인 웹사이트에 접속되는지 확인하세요. 직접 연결도 실패한다면 라우터, 무선 네트워크, 네트워크 어댑터 또는 통신사 네트워크 문제를 먼저 해결해야 합니다. 직접 연결은 정상이고 클라이언트를 켠 뒤 모두 실패한다면 로컬 프록시, 라우팅 규칙 또는 원격 노드로 범위를 좁힐 수 있습니다.

이후 브라우저와 명령줄을 각각 테스트하세요. 브라우저는 되지만 터미널이 실패한다면 두 애플리케이션이 프록시 설정을 읽는 방식이 다른 경우가 많습니다. 둘 다 실패하면 로컬 포트와 코어 로그를 계속 확인하세요. ‘모든 도메인이 열리지 않음’과 ‘일부 웹사이트만 실패’도 구분해야 합니다. 전자는 로컬 프록시나 노드 경로 중단에 가깝고, 후자는 분할 라우팅·DNS·대상 사이트의 네트워크 정책과 관련되는 경우가 많습니다. 연결 버튼을 반복해서 누르는 것보다 정확한 증상을 기록하는 편이 훨씬 유용합니다.

코어 프로세스와 로컬 수신 포트 확인

v2rayN, v2rayNG, v2flyNG는 모두 해당 코어를 실행하고 로컬 진입점을 만들어야 합니다. 데스크톱에서는 클라이언트 상태 영역에서 현재 설정이 실행 중인지 확인한 다음, 설정에서 HTTP·SOCKS 또는 혼합 프록시 포트를 확인하세요. 안내서에 자주 나오는 숫자를 추측해 사용하지 마세요. 실제 포트는 변경되었을 수 있고, 다른 프로그램이 사용 중이면 시작 자체가 실패할 수 있습니다. Windows에서는 다음 명령으로 포트를 확인할 수 있으며, 포트 번호는 클라이언트 화면에 표시된 실제 값으로 바꿔야 합니다:

netstat -ano | findstr LISTENING
Get-NetTCPConnection -State Listen | Sort-Object LocalPort

목록에 해당 포트가 없으면 클라이언트 로그에서 “address already in use”, “failed to listen” 또는 설정 로드 실패와 관련된 메시지를 찾으세요. 포트가 사용 중이면 해당 프로그램을 종료하거나 클라이언트 설정에서 사용하지 않는 포트로 변경한 뒤 코어를 완전히 중지하고 다시 시작하세요. 설정만 바꾸고 코어를 재시작하지 않으면 기존 프로세스가 원래 포트를 계속 점유할 수 있습니다. 반면 시스템 프록시는 새 포트를 가리키게 되어, 연결된 것처럼 보이지만 실제 트래픽은 흐르지 않는 불일치가 발생합니다.

시스템 프록시 대상과 라우팅 모드 확인

시스템 프록시를 켠 뒤에는 로컬 루프백 주소와 현재 수신 포트를 가리켜야 합니다. Windows에서 일반적인 대상은 127.0.0.1이며, 로컬 네트워크 어댑터 주소를 잘못 입력하면 안 됩니다. 클라이언트에 ‘자동 구성 스크립트’, ‘전역 프록시’, ‘시스템 프록시 해제’ 같은 옵션이 있다면 현재 어떤 방식을 사용하는지 명확히 하세요. 자동 구성 스크립트는 규칙으로 대상 주소를 판단하고, 전역 프록시는 시스템 프록시를 지원하는 요청을 로컬 진입점으로 일괄 전달하므로 증상이 다릅니다. 문제를 확인할 때는 규칙이 적은 모드로 잠시 전환해 기본 경로를 검증한 뒤 원래 분할 설정으로 돌아가세요.

사용자 지정 라우팅 규칙이 대상 트래픽을 잘못된 아웃바운드로 보낼 수도 있습니다. 특히 규칙 순서를 확인하세요. 코어는 일반적으로 먼저 일치하는 규칙을 적용하므로, 범위가 지나치게 넓은 직접 연결 규칙이 앞에 있으면 뒤의 프록시 규칙이 가려집니다. 반대로 로컬 네트워크 주소가 원격으로 전송되면 프린터, 라우터 관리 페이지, 내부 서비스를 이용하지 못할 수 있습니다. 새로 추가한 규칙을 잠시 비활성화하고 기본 규칙만 남겨 비교하되, 기존 설정을 바로 삭제하지 마세요. 테스트가 성공한 뒤 규칙을 하나씩 되돌려야 실제 원인을 찾을 수 있습니다.

로컬 프록시 요청으로 데이터가 코어에 들어가는지 확인

데스크톱에서는 시스템 프록시를 우회하고 클라이언트의 로컬 포트를 직접 지정해 요청을 보낼 수 있습니다. 이를 통해 ‘시스템 프록시가 적용되지 않음’과 ‘노드 자체를 사용할 수 없음’을 구분할 수 있습니다. 다음 예시는 HTTP 프록시 포트가 10809라고 가정하며, 실제 실행 시에는 클라이언트의 현재 포트를 사용해야 합니다:

curl.exe -I --proxy http://127.0.0.1:10809 https://example.com/
curl.exe -v --proxy http://127.0.0.1:10809 https://example.com/

프록시를 직접 지정했을 때 HTTP 응답을 받지만 브라우저는 계속 실패한다면 브라우저 프록시 정책, 확장 프로그램 충돌 또는 시스템 프록시 설정을 중점적으로 확인하세요. 명령이 즉시 127.0.0.1에 연결할 수 없다고 표시하면 로컬 포트가 수신 대기 중이 아니거나 포트 입력이 잘못된 것입니다. 로컬 포트에는 연결됐지만 기다린 뒤 시간 초과가 발생한다면 요청은 코어에 들어간 것이므로 노드 핸드셰이크, DNS, 라우팅 로그를 확인해야 합니다. 로그에서는 마지막 오류 한 줄만 보지 말고 인바운드, 라우팅 일치, 아웃바운드 오류를 함께 살펴보세요.

점검이 끝나면 시스템 프록시를 명확한 상태로 복원하세요. 당분간 클라이언트를 사용하지 않을 경우 먼저 클라이언트의 ‘시스템 프록시 해제’를 실행한 다음 종료합니다. 계속 연결할 경우 시스템 프록시 포트가 현재 코어와 일치하는지 확인하세요. 비정상 종료로 이전 프록시 주소가 남으면 다음 부팅 후 시스템 프록시를 읽는 모든 애플리케이션이 인터넷에 연결되지 않을 수 있습니다. 이때는 여러 시스템 패널에서 값을 반복해 수정하기보다 클라이언트를 다시 열고 시스템 프록시를 해제하는 편이 대체로 빠릅니다.

02 / REMOTE HANDSHAKE

노드 시간 초과와 핸드셰이크 실패: 중단된 계층 찾기

TCP 시간 초과·TLS 오류·프로토콜 거부 구분

‘노드 시간 초과’는 하나의 원인만 가리키지 않습니다. TCP 연결을 수립하기 전에 중단될 수도 있고, 서버에는 연결됐지만 TLS 핸드셰이크가 실패할 수도 있으며, TLS 성공 후 VMess·VLESS·Trojan 같은 프로토콜 계층에서 거부될 수도 있습니다. 세 가지 문제는 로그를 기준으로 구분해야 합니다. i/o timeout, context deadline exceeded 또는 대상 주소 연결 시간 초과가 나타나면 먼저 네트워크 도달성을 확인하세요. 인증서 도메인, 핸드셰이크 또는 serverName 관련 오류가 나타나면 시스템 시간과 TLS 매개변수를 점검합니다. 인증 실패, 잘못된 사용자 또는 비정상 프로토콜 응답이 나타날 때 포트·사용자 식별자·전송 설정을 확인하세요.

클라이언트 속도 측정 목록의 색상만으로 노드 상태를 판단하지 마세요. 측정이 TCP 연결만 확인할 수도 있고 전체 요청을 테스트할 수도 있어, 클라이언트와 측정 방식이 다르면 직접 비교할 수 없습니다. 더 신뢰할 수 있는 방법은 노드 하나를 선택하고 현재 네트워크와 라우팅 모드를 고정한 뒤 실제 요청을 한 번 보내면서 대상 주소 확인, 연결 수립, 핸드셰이크 완료까지의 전체 로그를 관찰하는 것입니다. 반복 테스트에서도 다른 조건을 유지해야 오류가 지속적인지 판단할 수 있습니다.

대상 호스트와 포트의 도달성부터 확인

Windows에서는 PowerShell의 Test-NetConnection으로 노드 도메인과 포트를 확인할 수 있습니다. 이 명령은 기본 네트워크 연결만 검증하며 상위 프로토콜 설정이 올바르다는 뜻은 아니지만, 포트에 전혀 접근할 수 없는 상황을 빠르게 배제할 수 있습니다:

Resolve-DnsName node.example.com
Test-NetConnection node.example.com -Port 443
Test-NetConnection node.example.com -InformationLevel Detailed

도메인을 확인할 수 없다면 DNS 절로 이동하세요. 주소로 해석되지만 TCP 테스트가 실패하면 다른 네트워크에서 다시 테스트해 보세요. 예를 들어 가정용 네트워크에서 모바일 네트워크로 전환할 수 있습니다. 특정 네트워크에서만 실패한다면 경로, 라우터 정책 또는 네트워크 출구가 다를 가능성이 큽니다. 모든 네트워크에서 실패한다면 노드 주소·포트·서버 상태를 확인해야 합니다. 테스트할 때 일반 웹사이트의 HTTPS 포트 결과를 노드 포트 결과로 간주해서는 안 되며, 동일한 대상 호스트와 동일한 포트여야 합니다.

노드가 도메인을 사용한다면 해석된 IP를 장기적인 설정으로 직접 입력하지 마세요. TLS 연결은 대개 인증서 검증과 SNI 일치를 위해 도메인이 필요하므로 IP로 바꾸면 원래 TCP 도달성 문제에 새로운 인증서 오류가 더해질 수 있습니다. IP를 임시로 사용하는 것은 DNS가 문제에 관여하는지 확인할 때만 적합하며, 테스트가 끝나면 원래 도메인과 해당 serverName으로 되돌려야 합니다.

시스템 시간·SNI·인증서 도메인 확인

TLS 검증은 기기 시간에 의존합니다. 시스템 날짜·시간대·자동 시간 동기화에 문제가 있으면 인증서가 아직 유효하지 않거나 이미 만료된 것으로 판단될 수 있습니다. 먼저 시스템 설정에서 자동 시간과 자동 시간대를 켠 뒤 한 번 수동 동기화하세요. 가상 머신, 듀얼 부팅, 장시간 절전 후의 기기는 특히 확인이 필요합니다. 시간 동기화 후에는 클라이언트 코어를 완전히 재시작해야 합니다. 일부 연결과 세션 상태에 이전 시간 조건이 남아 있을 수 있기 때문입니다.

serverName 또는 SNI는 서버 인증서가 포함하는 도메인과 일치해야 하며, 연결 주소 필드와 반드시 같을 필요는 없습니다. 구독을 가져온 뒤 노드를 수동 편집했다면 주소·포트·전송 방식·TLS 활성화·SNI·경로·호스트 헤더가 여전히 한 세트로 맞는지 원래 노드 매개변수와 대조하세요. 주소와 포트만 복사하고 전송 매개변수를 빠뜨리는 것이 핸드셰이크 실패의 흔한 원인입니다. 관련 점검은 TLS 핸드셰이크 실패와 인증서 오류 해결에서도 확인할 수 있습니다.

프로토콜 및 전송 매개변수를 항목별로 비교

프로토콜 계층 매개변수는 전체 조합이 일치해야 합니다. VMess는 올바른 사용자 식별자와 암호화·전송 조합이 필요하고, VLESS는 사용자 식별자·흐름 제어·보안 계층 설정을 확인해야 합니다. Trojan은 인증 정보와 TLS 진입점을, Shadowsocks는 암호화 방식과 인증 정보의 조합을 확인하세요. WebSocket·gRPC·TCP 같은 전송 방식에는 각각 경로·서비스 이름·Host·보안 계층 필드가 있습니다. 공백·줄바꿈·수동 교체로 어느 하나라도 손상되면 연결 직후 종료되는 증상이 나타날 수 있습니다.

가장 효과적인 비교 방법은 구독에서 별도 그룹으로 다시 가져오되 기존 수동 설정을 덮어쓰지 않고 새로 가져온 노드를 테스트하는 것입니다. 새 노드가 작동한다면 기존 노드를 편집하거나 이전하는 과정에서 매개변수가 달라진 것입니다. 새 노드와 기존 노드의 오류가 같다면 구독 소스·네트워크 환경·원격 상태를 확인하세요. 의미를 모르는 상태에서 인증서 검증 건너뛰기를 고정 설정으로 사용하지 마세요. 시간·도메인·인증서 배포 문제를 잠시 가릴 뿐 프로토콜 매개변수 불일치를 해결하지 못합니다.

로그 단계 일반적인 증상 우선 확인할 항목
해석 전 호스트를 찾을 수 없음, 해석 실패 DNS, 도메인 오타, 네트워크 연결
TCP 연결 수립 시간 초과, 연결 거부 노드 주소, 포트, 기본 도달성
TLS 핸드셰이크 인증서 도메인 또는 시간 오류 시스템 시간, SNI, TLS 활성화
프로토콜 인증 연결 직후 종료 사용자 매개변수, 흐름 제어, 전송 조합

같은 노드가 간헐적으로 성공하고 간헐적으로 시간 초과된다면 로컬 네트워크 패킷 손실, 무선 신호 전환, 기기 절전 복귀도 확인해야 합니다. 테스트는 소량만 연속 실행하고 발생 시각을 기록하세요. 고빈도 병렬 테스트로 추가 부하를 만들지 마세요. 오류가 안정적으로 반복되면 설정 중심으로, 네트워크 전환에 따라 달라지면 연결 경로 중심으로 점검하면 탐색 시간을 크게 줄일 수 있습니다.

03 / SUBSCRIPTION INPUT

구독 업데이트 실패: 주소·응답·노드 해석 순서로 확인

구독 주소가 완전하며 불필요한 문자가 섞이지 않았는지 확인

구독 실패는 먼저 ‘응답을 받지 못함’과 ‘응답은 받았지만 해석에 실패함’을 구분해야 합니다. 메신저·문서·QR 코드에서 주소를 복사할 때 끝에 마침표·공백·줄바꿈·전각 문자가 섞일 수 있습니다. 일부 주소에는 긴 쿼리 매개변수가 포함되어 있어 복사가 끊기면 서버가 로그인 페이지·오류 페이지·빈 내용을 반환할 수 있습니다. 클라이언트 구독 설정에 주소를 완전히 다시 붙여 넣고 프로토콜 헤더·도메인·경로·쿼리 매개변수가 이어져 있는지 확인하세요. 노드 공유 링크를 구독 주소 입력란에 넣은 것은 아닌지도 확인해야 합니다.

v2rayN은 일반적으로 구독 그룹으로 여러 소스를 관리하고, v2rayNG와 v2flyNG는 구독 설정에서 주소를 관리합니다. 구독을 수정한 뒤에는 설정을 저장하고 직접 업데이트를 실행해야 하며, 이름만 편집해서는 가져오기가 시작되지 않습니다. 이전 캐시의 영향을 피하려면 임시 그룹을 새로 만들고 같은 주소로 업데이트해 결과를 확인하세요. 새 그룹은 성공하고 기존 그룹만 실패한다면 기존 그룹의 업데이트 설정·필터 조건·캐시 상태를 중점적으로 점검합니다.

HTTP 상태와 응답 유형 확인

로그에 HTTP 상태 코드가 나타나면 응답 의미에 따라 처리하세요. 인증 실패나 접근 거부는 주소의 인증 매개변수·계정 상태·접근 출처 제한과 관련되는 경우가 많습니다. 리소스를 찾을 수 없다면 경로가 불완전하거나 주소가 변경된 것입니다. 서버 오류라면 잠시 후 다시 시도하고 해당 구독 소스만 이상한지 확인하세요. 성공 상태를 받았다고 해서 내용이 반드시 해석 가능한 것은 아닙니다. 응답이 구독 데이터가 아니라 웹페이지·로그인 안내·게이트웨이 안내일 수 있기 때문입니다.

데스크톱에서는 주소 내용을 노출하지 않고 명령으로 요청 과정을 확인할 수 있습니다. 구독 주소에는 민감한 인증 매개변수가 포함되는 경우가 많으므로 전체 주소를 공개 로그나 스크린샷에 붙여 넣지 마세요. 다음 명령의 주소는 예시이며, 실제 테스트에서는 로컬 터미널에서 자신의 구독 주소만 사용하세요:

curl.exe -I "https://subscription.example/subscription"
curl.exe -L --connect-timeout 15 "https://subscription.example/subscription" -o subscription.txt

-I는 응답 헤더만 읽으므로 리디렉션과 상태를 확인하는 데 적합합니다. 일부 구독 서비스는 헤더만 가져오는 방식을 지원하지 않으므로, 이때는 두 번째 명령으로 응답을 저장한 뒤 파일이 비어 있지 않은지와 콘텐츠 유형이 적절한지 확인하세요. 응답 파일에는 노드 주소와 인증 매개변수가 포함될 수 있으므로 그대로 공개하지 마세요. 요청이 여러 번 리디렉션된다면 클라이언트가 해당 흐름을 지원하는지, 최종 주소가 예상한 구독 진입점에 속하는지 확인해야 합니다.

업데이트 요청이 현재 프록시를 거쳐야 하는지 판단

구독 업데이트와 노드 연결은 서로 관련 있지만 다른 두 경로입니다. 일부 클라이언트는 ‘프록시를 통해 구독 업데이트’할 수 있는데, 이 옵션을 사용하려면 이미 작동하는 노드가 있어야 합니다. 유일한 노드가 만료된 상태에서 업데이트 요청까지 해당 노드로 강제하면 업데이트할 수 없는 순환이 생깁니다. 점검할 때는 먼저 프록시를 통한 업데이트를 끄고 원래 네트워크로 구독을 요청하세요. 원래 네트워크에 접근할 수 없고 작동하는 노드가 있다면 반대로 프록시 업데이트를 테스트합니다.

시스템 프록시가 남아 있어도 구독 요청에 영향을 줄 수 있습니다. 클라이언트가 종료된 뒤에도 시스템이 이전 로컬 포트를 가리키면 클라이언트를 다시 시작하기 전의 네트워크 요청이 모두 실패할 수 있습니다. 로컬 포트가 수신 대기 중인지 확인하거나 시스템 프록시를 해제한 뒤 업데이트하세요. 기업 네트워크와 로그인 페이지가 필요한 공용 네트워크에서는 첫 접속 시 인증 페이지가 반환될 수도 있습니다. 먼저 브라우저에서 현재 네트워크에 정상적으로 로그인한 다음 구독을 요청하세요.

형식·인코딩·노드 필터 문제 처리

구독 응답은 인코딩된 노드 모음일 수도 있고, 한 줄씩 된 공유 링크일 수도 있습니다. 클라이언트가 응답 형식을 인식해야 노드 목록을 생성할 수 있습니다. ‘해석 성공했지만 노드 수가 0’이라면 구독이 비었다고 바로 단정하지 말고 키워드 필터·중복 제거·특정 프로토콜만 유지·유효하지 않은 노드 삭제 등의 규칙이 켜져 있는지 확인하세요. 지나치게 엄격한 필터 표현식이 모든 항목을 제외할 수 있으며, 특히 그룹 이름이나 노드 메모가 바뀐 뒤 이런 일이 발생하기 쉽습니다.

로그에 특정 줄의 형식 오류가 명확히 표시된다면 전체 업데이트가 다른 유효한 노드도 가져왔는지 먼저 확인하세요. 일부 클라이언트는 단일 오류 기록을 건너뛰지만, 일부는 전체 처리를 중단합니다. 응답을 다시 받아 전송 중단 여부를 배제하고, 같은 위치에서 계속 실패한다면 구독 제공자가 해당 항목을 수정해야 합니다. 직접 디코딩한 구독 사본을 장기간 관리하지 마세요. 노드 매개변수가 업데이트될 때 사본은 동기화되지 않아 주소·인증서 도메인·전송 매개변수가 점점 어긋날 수 있습니다.

반복 가능한 구독 점검 절차 만들기

전체 절차는 다음과 같습니다. 시스템 시간과 기본 네트워크 확인, 구독 주소 대조, 업데이트가 프록시를 거치는지 확인, HTTP 응답 확인, 해석 로그와 필터 조건 점검, 새로 가져온 노드로 실제 연결 테스트를 진행하세요. 업데이트 후 노드 이름만 보인다고 사용할 수 있는 것은 아닙니다. 노드 매개변수가 완전한지 확인하고 한 번 실제 접속을 검증해야 합니다. 자세한 진입 작업은 v2rayN 및 v2rayNG 구독 가져오기 안내를 참고하세요.

자동 업데이트가 자주 실패한다면 기기 절전·백그라운드 제한·네트워크 전환도 확인해야 합니다. 데스크톱은 절전 중 예정된 업데이트를 실행하지 않으며, 복귀 후 클라이언트가 네트워크를 다시 구성해야 할 수 있습니다. Android 기기에서 백그라운드 활동이 제한되면 예약 작업도 지연될 수 있습니다. 자동 업데이트는 유지 관리 기능일 뿐 연결 성공의 유일한 전제는 아닙니다. 항상 최근에 작동한 설정을 보존하고, 업데이트 후 로그와 노드 변화를 확인하세요.

04 / THROUGHPUT

연결 속도 저하: 노드·경로·기기 부담을 분리해 확인

연결 수립이 느린지 지속 전송이 느린지 먼저 구분

웹페이지를 여는 데 오래 걸리지만 다운로드가 시작되면 속도가 정상이라면 DNS·첫 핸드셰이크·연결 재사용 문제가 많습니다. 웹페이지는 빠르게 표시되지만 대용량 파일 전송이 계속 느리다면 회선 대역폭·패킷 손실·서버 부하·기기 성능을 의심할 수 있습니다. 동영상·메신저·특정 애플리케이션만 느리다면 해당 앱이 TCP와 UDP 중 무엇을 사용하는지, 라우팅 규칙이 관련 도메인을 서로 다른 아웃바운드로 보내는지 확인하세요. 모든 상황을 ‘노드가 느리다’로 묶으면 핵심 차이를 놓치게 됩니다.

테스트 전에 환경을 고정하세요. 같은 노드·네트워크·대상 리소스·비슷한 시간대를 사용하고 대역폭을 차지하는 동기화와 다운로드 작업은 종료합니다. 여러 속도 측정 도구를 동시에 실행하지 마세요. 병렬 요청이 대역폭을 나누고 노드 부하를 바꾸기 때문입니다. 먼저 원래 네트워크를 측정한 다음 클라이언트를 켜고 테스트하세요. 두 결과를 비교하면 병목이 로컬 접속에 이미 존재하는지 판단할 수 있습니다. 원래 네트워크 자체가 크게 흔들린다면 무선 신호·랜선 연결·라우터 상태를 먼저 개선하세요.

반복 가능한 요청으로 단계별 소요 시간 관찰

curl은 DNS 조회·연결·TLS·전체 소요 시간을 각각 출력해 어느 단계가 느린지 판단하는 데 사용할 수 있습니다. 다음 예시는 로컬 HTTP 프록시를 통해 예시 도메인에 접속하며, 포트는 클라이언트의 실제 값으로 바꿔야 합니다:

curl.exe -o NUL -s -w "dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} start=%{time_starttransfer} total=%{time_total}\n" --proxy http://127.0.0.1:10809 https://example.com/

DNS 조회 시간이 길면 DNS를 확인하고, 연결 시간이 길면 원격 주소의 도달성과 경로 거리를 살펴보세요. TLS 시간이 비정상적으로 길다면 패킷 손실·인증서 체인 처리·네트워크 재전송과 관련될 수 있습니다. 연결 단계는 정상인데 첫 바이트가 늦다면 대상 사이트의 응답이나 원격 출구 부하일 수 있습니다. 한 번의 결과로 장기 성능을 판단하지 말고 간격을 두고 몇 차례 실행해 안정성을 확인하세요. 많은 표본을 만들 필요는 없습니다. 문제 해결의 목표는 시간이 어느 구간에 집중되는지 찾는 것이지 순위를 만드는 것이 아닙니다.

노드 비교에서는 노드 자체만 바꾸세요

같은 구독의 노드라도 지역·프로토콜·전송 방식·출구 회선이 다를 수 있습니다. 비교할 때는 클라이언트 모드·DNS·대상 주소를 고정하고 같은 요청을 수행하면서 노드를 하나씩 바꾸세요. 모든 노드가 느리면 로컬 네트워크·클라이언트 모드·DNS·기기 리소스를 먼저 확인합니다. 특정 노드만 느리다면 해당 노드의 경로나 원격 부하에 가깝습니다. 같은 노드가 네트워크에 따라 크게 다르면 두 접속 네트워크와 노드 사이의 라우팅 품질을 고려해야 합니다.

클라이언트의 지연 시간 테스트는 측정 방식이 포함하는 단계만 반영합니다. 지연 시간이 낮다고 대용량 전송 속도가 보장되는 것은 아니며, 지연 시간이 높다고 지속 처리량이 반드시 낮은 것도 아닙니다. 패킷 손실이 있으면 TCP가 전송 창을 줄여 속도가 주기적으로 떨어질 수 있습니다. 무선 간섭·모바일 네트워크 전환·지역 간 회선도 같은 현상을 일으킬 수 있습니다. 실제 사용에서는 연결 안정성·웹페이지 첫 바이트·지속 전송을 함께 보고 단일 지연 값만으로 노드를 선택하지 마세요.

같은 서비스가 서로 다른 경로를 타는지 라우팅 규칙 확인

현대 웹페이지는 주 도메인·정적 리소스 도메인·API 도메인·콘텐츠 전송 주소를 동시에 요청합니다. 규칙이 주 도메인만 일치시키면 부속 리소스가 직접 연결되거나 다른 아웃바운드로 전송되어, 본문은 빠르지만 이미지나 스크립트가 오래 기다리는 현상이 나타날 수 있습니다. 코어 접근 로그를 열고 같은 페이지 로드에서 각 도메인이 어떤 아웃바운드 규칙과 일치했는지 확인하세요. 경로가 분산되어 있다면 단일 도메인을 목록 끝에 계속 추가하기보다 서비스 도메인 그룹에 맞춰 규칙을 조정해야 합니다.

규칙 순서는 성능에도 영향을 줍니다. 정규식이 너무 많거나 범위가 넓은 도메인 일치와 중복 규칙이 많으면 판단이 복잡해지고 유지 관리도 어려워집니다. 명확한 도메인·접미사·IP 범위·내장 데이터셋 규칙을 우선 사용하고, 확실한 규칙을 앞에 배치하며 기본 규칙은 마지막에 두세요. 변경 후 DNS 캐시를 비우고 코어를 다시 시작해 이전 해석과 연결이 기존 경로를 계속 사용하지 않도록 하세요.

전송 방식·재사용·기기 리소스 평가

연결 재사용은 반복적인 연결 수립 비용을 줄일 수 있지만 모든 네트워크와 서버 조합에 적합한 것은 아닙니다. 소수 연결은 정상인데 동시 연결 후明显하게 끊긴다면 재사용을 켠 경우와 끈 경우를 비교하세요. 동시성 수를 무작정 높이지 마세요. 기기 성능이 제한적이면 동시 연결이 암호화·컨텍스트 전환·메모리 부담을 키웁니다. Android 기기는 절전 중이거나 온도가 높을 때 백그라운드 처리 능력이 낮아질 수 있고, 데스크톱에서는 CPU·메모리·디스크를 다른 작업이 장시간 점유하는지 확인해야 합니다.

전송 방식마다 캡슐화 오버헤드는 다르지만, 이론적인 오버헤드보다 올바른 설정과 안정적인 경로가 더 중요합니다. 속도를 높이려고 전송 필드 하나만 임의로 바꾸지 마세요. 클라이언트와 서버의 매개변수는 일치해야 합니다. 프로토콜 조합을 비교하려면 구독에 이미 제공되고 사용 가능한 것으로 확인된 완전한 노드를 사용하세요. 한 노드에서 주소만 복사해 다른 전송 매개변수를 임의로 조합하면 안 됩니다. 프로토콜 특성과 선택 기준은 VMess·VLESS·Trojan·Shadowsocks 비교에서 확인할 수 있습니다.

05 / NAME RESOLUTION

DNS 해석 이상: 도메인을 어디에서 해석하는지 확인

대표적인 DNS 증상 파악

DNS 문제는 도메인 입력이 실패하거나, IP로 직접 접속하면 응답이 있거나, 웹사이트를 처음 열 때 오래 기다리거나, 같은 도메인이 애플리케이션마다 다른 결과를 반환하거나, 클라이언트 모드를 바꾼 뒤 일부 사이트를 갑자기 사용할 수 없는 형태로 나타납니다. 노드 도메인을 해석하지 못하면 코어가 원격에 연결할 수 없고, 대상 사이트 도메인 해석 실패는 특정 접속만 영향을 줄 수 있습니다. 먼저 실패한 것이 ‘노드 주소’인지 ‘접속 대상’인지 확인해야 합니다. 두 주소는 서로 다른 해석 경로를 사용할 수 있습니다.

브라우저는 자체 보안 DNS를 사용하고 시스템은 다른 서버를 사용하며, 코어는 프록시 요청의 도메인을 설정에 따라 처리할 수 있습니다. 따라서 하나의 기기에서도 여러 DNS 경로가 동시에 존재할 수 있습니다. 브라우저가 성공했다고 시스템 해석이 정상이라는 뜻은 아니며, 시스템 명령이 성공했다고 코어가 같은 결과를 사용한다는 뜻도 아닙니다. 브라우저 설정·시스템 네트워크 설정·코어 로그를 함께 확인해 실제 해석 주체를 판단하세요.

시스템 해석 결과부터 확인

Windows에서는 Resolve-DnsName 또는 nslookup을 사용할 수 있고, macOS와 Linux에서는 dig 또는 nslookup을 사용할 수 있습니다. 먼저 노드 도메인을 테스트한 다음 문제가 발생한 대상 도메인을 테스트하고, 반환 유형과 주소를 기록하세요:

Resolve-DnsName node.example.com
nslookup node.example.com
nslookup example.com

# macOS 또는 Linux
dig node.example.com
dig example.com A
dig example.com AAAA

명령이 시간 초과를 반환하면 현재 DNS 서버가 제때 응답하지 않는다는 뜻입니다. 존재하지 않는다고 반환되면 도메인 오타와 레코드 상태를 확인하세요. 주소를 얻었는데도 연결할 수 없다면 문제는 해석에서 라우팅·포트·핸드셰이크 단계로 넘어간 것입니다. IPv4와 IPv6 주소가 함께 반환되는데 현재 네트워크의 IPv6 연결이 불완전하면, 애플리케이션이 도달할 수 없는 주소를 먼저 시도한 뒤 대체 경로를 기다릴 수 있습니다. A와 AAAA 레코드의 연결 결과를 임시로 비교할 수 있지만, 시스템 프로토콜 지원을 삭제해 네트워크 설정 문제를 장기적으로 가리지는 마세요.

캐시를 정리해 이전 결과의 영향을 차단

시스템·브라우저·클라이언트 코어가 모두 해석 결과를 캐시할 수 있습니다. DNS 설정을 바꿔도 기존 연결과 캐시가 즉시 사라지지 않으므로 관련 브라우저 탭을 닫고, 코어를 중지하고, 시스템 캐시를 정리한 다음 클라이언트를 다시 시작하세요. Windows에서는 다음을 실행할 수 있습니다:

ipconfig /flushdns
Clear-DnsClientCache
Get-DnsClientServerAddress

캐시 정리는 다음 요청이 다시 해석되도록 할 뿐, 잘못된 서버 주소·라우팅 규칙·도메인 설정을 고치지는 않습니다. 정리 직후에는 잠시 정상이고 다시 이상해진다면 어떤 구성 요소가 잘못된 결과를 다시 기록하는지 확인하세요. 예를 들어 시스템 네트워크 전환, 라우터가 전달하는 DNS, 브라우저 독립 해석, 클라이언트 규칙이 도달할 수 없는 서버로 요청을 보내는 경우가 있습니다.

로컬 해석·원격 해석·도메인 규칙 이해

애플리케이션이 도메인을 SOCKS 또는 HTTP 프록시에 전달할 때 도메인을 먼저 로컬에서 IP로 해석할 수도 있고, 도메인 형태를 유지한 채 코어로 전달해 코어가 DNS 서버를 선택하게 할 수도 있습니다. 두 방식은 라우팅 일치에 영향을 줍니다. 너무 일찍 IP로 변환하면 도메인 기반 규칙이 원래 도메인을 얻지 못할 수 있고, 도메인을 계속 유지하면 코어에 안정적인 DNS 아웃바운드 경로가 필요합니다. 설정할 때 어느 계층에서 해석할지 명확히 하고, 서로 덮어쓰는 옵션을 여러 개 겹쳐 사용하지 마세요.

코어 DNS 설정에는 일반적으로 서버 목록·일치 도메인·조회 정책이 포함됩니다. 규칙은 아웃바운드 경로와 함께 설계해야 합니다. 노드 도메인 해석에 사용하는 서버는 노드가 아직 연결되지 않았을 때도 접근할 수 있어야 합니다. 프록시 아웃바운드에 의존하는 DNS가 해당 프록시를 처음 연결하는 데 필요한 해석까지 담당하면 순환 의존이 생깁니다. 가장 안정적인 기본 구조는 원래 네트워크에서 노드 주소를 해석할 수 있는 경로를 하나 유지하고, 대상 도메인과 라우팅 요구에 따라 다른 조회를 배치하는 것입니다.

hosts·필터 규칙·브라우저 독립 설정 확인

시스템 hosts 파일의 정적 레코드는 일반 DNS 조회보다 우선하는 경우가 많습니다. 오래된 테스트 기록·잘못된 주소·중복 항목이 특정 도메인을 계속 만료된 대상으로 가리킬 수 있습니다. 확인할 때는 직접 추가한 것이 확실한 기록만 수정하고, 수정 전에 사본을 보관하세요. 보안 프로그램·라우터 필터·자녀 보호·기업 네트워크 정책도 특정 주소를 반환하거나 조회를 차단할 수 있으므로 다른 네트워크로 전환해 비교하세요.

브라우저의 독립 DNS 설정은 시스템 경로를 우회할 수 있습니다. 브라우저 하나만 이상하다면 깨끗한 설정이나 다른 브라우저로 테스트한 뒤 독립 해석·프록시 확장 프로그램·캐시 정책을 확인하세요. 모든 애플리케이션이 이상하면 시스템과 코어를 우선 점검합니다. 브라우저 확장 프로그램·시스템 프록시 도구·V2Ray 클라이언트가 같은 계층의 설정을 동시에 변경하지 않도록 하세요. 요청이 성공해도 실제로 어떤 경로를 거쳤는지 확인하기 어려워집니다.

증상 가능한 위치 검증 방법
노드 도메인을 해석할 수 없음 시스템 DNS, 기본 네트워크 클라이언트를 중지한 뒤 노드 도메인 조회
브라우저만 정상 브라우저 독립 DNS 또는 시스템 프록시 차이 명령줄과 브라우저 설정 비교
도메인 실패, IP 연결 가능 대상 도메인 해석 경로 A·AAAA 레코드 조회 및 코어 로그 확인
네트워크 전환 후 복구 현재 네트워크가 전달한 DNS 또는 라우팅 두 네트워크의 서버와 해석 결과 기록

수정이 끝나면 노드 도메인 해석·대상 도메인 해석·실제 접속을 각각 검증하세요. 조회 명령의 반환만 확인해서는 안 됩니다. DNS가 주소를 반환했다는 것은 해석 단계가 완료됐다는 뜻일 뿐이며, 이후 라우팅·연결·프로토콜 핸드셰이크가 남아 있습니다. 세 단계의 결과를 나눠 기록하면 네트워크 전환이나 규칙 변경 후 어느 계층이 다시 변했는지 쉽게 찾을 수 있습니다.

06 / APPLICATION ROUTING

시스템 프록시가 작동하지 않음: 브라우저와 터미널을 따로 확인

먼저 시스템 프록시의 적용 범위 이해

시스템 프록시는 애플리케이션이 읽는 연결 설정 모음이며, 모든 네트워크 트래픽을 자동으로 가로채지 않습니다. 브라우저와 일부 데스크톱 소프트웨어는 대개 시스템 프록시를 읽지만, 명령줄 도구·게임·백그라운드 서비스·자체 네트워크 스택을 구현한 애플리케이션은 무시할 수 있습니다. 따라서 브라우저는 클라이언트를 거치지만 터미널은 직접 연결되는 상황이 생길 수 있으며, 이것이 반드시 코어 오류를 의미하지는 않습니다. 먼저 대상 애플리케이션이 지원하는 프록시 방식을 확인한 뒤 시스템 프록시·환경 변수·애플리케이션 내부 프록시·TUN 모드 중 적절한 방법을 선택하세요.

자세한 상황별 비교는 브라우저와 터미널의 시스템 프록시 문제 해결에서 확인할 수 있습니다. 이 절의 핵심은 일관된 판단 방법을 세우는 것입니다. 먼저 로컬 포트를 검증하고, 시스템 프록시 값을 확인한 다음, 애플리케이션이 해당 값을 읽는지 점검하세요. 작업 표시줄 아이콘이나 클라이언트 메뉴 상태만으로 트래픽이 코어에 들어갔다고 판단하지 마세요.

프록시 주소·유형·포트 확인

HTTP 프록시·SOCKS 프록시·혼합 프록시는 서로 다른 개념입니다. 애플리케이션에 프록시를 입력할 때 유형이 클라이언트의 수신 진입점과 일치해야 합니다. SOCKS 포트를 HTTP만 지원하는 시스템 프록시 입력란에 넣으면 연결이 바로 실패할 수 있고, HTTP 포트를 SOCKS로 사용해도 핸드셰이크 오류가 발생합니다. 우선 클라이언트 설정에서 주소와 포트를 복사하고, 코어 재시작 후에도 계속 수신 중인지 확인하세요.

Windows에서는 현재 사용자 프록시 설정을 확인하고 프록시를 직접 지정해 비교할 수 있습니다:

netsh winhttp show proxy
Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
curl.exe -I --proxy http://127.0.0.1:10809 https://example.com/

WinHTTP와 일반 데스크톱 애플리케이션은 서로 다른 프록시 출처를 사용할 수 있습니다. netsh winhttp show proxy 결과가 브라우저도 같은 설정을 사용한다는 뜻은 아닙니다. 구체적인 프로그램에 따라 판단해야 합니다. 프록시를 직접 지정하면 성공하지만 애플리케이션은 여전히 직접 연결한다면 노드와 로컬 포트는 대체로 정상이며, 이후에는 애플리케이션 설정을 확인하세요. 직접 지정한 프록시도 실패한다면 로컬 수신 또는 노드 절로 돌아가 점검합니다.

터미널 도구의 환경 변수는 대소문자를 함께 처리

많은 명령줄 프로그램이 HTTP_PROXY·HTTPS_PROXY·ALL_PROXY를 읽지만, 도구마다 변수 대소문자와 프로토콜 지원이 다릅니다. 임시 설정은 한 번의 테스트에 적합하며 현재 터미널을 닫으면 자동으로 사라집니다. PowerShell 예시:

$env:HTTP_PROXY="http://127.0.0.1:10809"
$env:HTTPS_PROXY="http://127.0.0.1:10809"
curl.exe -I https://example.com/

Remove-Item Env:HTTP_PROXY
Remove-Item Env:HTTPS_PROXY

macOS 또는 Linux 셸에서는 다음을 사용할 수 있습니다:

export HTTP_PROXY="http://127.0.0.1:10809"
export HTTPS_PROXY="http://127.0.0.1:10809"
export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"
curl -I https://example.com/

unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy

SOCKS 진입점을 사용한다면 도구가 해당 문법을 지원하는지, 도메인을 로컬에서 해석하는지 프록시 측에서 해석하는지 확인하세요. 클라이언트가 항상 실행된다고 보장할 수 없는 시작 파일에 환경 변수를 영구적으로 남겨 두면, 클라이언트가 실행되지 않을 때 터미널 네트워크 전체가 빈 포트로 향할 수 있습니다. 영구 설정이 필요하다면 해제 방법도 함께 기록하고, 설정 전환에 따라 포트가 바뀌지 않도록 하세요.

자동 구성 스크립트와 우회 목록 확인

자동 프록시 구성은 URL이나 호스트 이름에 따라 직접 연결할지 프록시를 사용할지 결정합니다. 스크립트 주소를 불러오지 못하거나 캐시가 갱신되지 않거나 규칙에 빠진 항목이 있으면 일부 웹사이트가 클라이언트를 우회할 수 있습니다. 점검할 때는 명확한 수동 프록시 설정으로 잠시 전환해 로컬 포트와 노드가 작동하는지 확인한 뒤 자동 스크립트로 돌아가세요. 복원 후 브라우저를 다시 시작해 시스템 설정과 스크립트 내용을 새로 읽게 해야 합니다.

우회 목록에는 보통 로컬 주소·로컬 네트워크 호스트·지정 도메인이 포함됩니다. 범위가 너무 넓으면 잘못된 와일드카드 규칙이 모든 하위 도메인과 일치하는 등 많은 대상이 직접 연결됩니다. 반대로 로컬 네트워크 주소를 우회하지 않으면 내부 기기에 접근하지 못할 수 있습니다. 먼저 루프백 주소와 명확한 내부 네트워크 범위만 유지한 뒤 사용자 지정 항목을 하나씩 복원하세요. 시스템 설정·클라이언트 규칙·브라우저 확장 프로그램에 각각 우회 목록이 있을 수 있으므로 세 곳에서 중복 관리하지 않도록 하세요.

TUN 모드에서는 점검 기준이 다릅니다

TUN 모드는 가상 네트워크 인터페이스로 시스템 프록시를 읽지 않는 트래픽까지 처리할 수 있지만, 라우팅 테이블·DNS 인계·시스템 권한·다른 네트워크 소프트웨어와의 충돌이라는 새로운 변수가 생깁니다. 켠 뒤 인터넷이 완전히 끊기면 먼저 가상 인터페이스가 생성됐는지, 기본 경로가 추가됐는지, DNS가 유효한 진입점을 가리키는지, 클라이언트에 필요한 시스템 권한이 있는지 확인하세요. 클라이언트를 종료한 뒤에는 라우팅과 DNS가 복원됐는지도 확인해야 합니다.

시스템 프록시가 실패했을 때 TUN 모드를 첫 단계로 사용하지 마세요. 먼저 노드와 일반 로컬 프록시 포트가 작동한다는 것을 확인한 다음 TUN을 켜야 새 문제가 가상 인터페이스 계층에 한정됩니다. 기기에서 가상 머신 네트워크·컨테이너 네트워크·기업 접속 소프트웨어·라우팅을 인계하는 다른 프로그램을 동시에 실행 중이라면 하나씩 중지해 비교하세요. 충돌은 대개 노드 프로토콜 자체보다 라우팅 우선순위와 DNS 인계 순서에서 발생합니다.

최종 검증은 세 종류의 요청을 포함해야 합니다. 브라우저가 시스템 프록시를 읽는 요청, 명령줄에서 프록시를 명시한 요청, 시스템 프록시를 지원하지 않는 애플리케이션이 자체 설정이나 TUN으로 보내는 요청입니다. 세 경로가 각각 성공해야 설정 범위가 명확하다고 할 수 있습니다. 한 경로만 실패한다면 작동 중인 다른 부분을 초기화하지 말고 해당 진입점만 처리하세요.

07 / CLIENT RUNTIME

클라이언트 충돌 또는 코어 종료: 증거를 보존하고 단계별 복구

UI 종료·코어 종료·설정 로드 실패 구분

클라이언트 창이 사라지는 경우, UI는 남아 있지만 연결이 멈추는 경우, 시작을 눌렀는데 즉시 실행되지 않은 상태로 돌아가는 경우는 서로 다른 계층의 문제입니다. UI 프로세스가 충돌하면 시스템 트레이 아이콘도 사라질 수 있습니다. 코어가 종료되면 UI는 대개 남아 있고 오류 로그를 확인할 수 있습니다. 설정 로드 실패는 노드를 전환하거나 설정을 수정한 뒤 발생하며, 코어가 포트를 열기도 전에 종료됩니다. 먼저 어느 계층이 종료됐는지 기록한 뒤 애플리케이션 로그·코어 로그·시스템 이벤트 중 적절한 곳을 확인하세요.

문제가 발생했다고 즉시 반복 재설치하지 마세요. 먼저 오류 시각·조작 단계·로그 마지막 내용을 저장하고, 충돌 직전에 구독을 가져왔는지·라우팅을 편집했는지·코어 설정을 전환했는지·절전에서 복귀했는지·시스템을 업데이트했는지를 기록하세요. 안정적으로 재현되는 단계가 막연한 ‘가끔 튕김’보다 훨씬 쉽게 원인을 찾게 해 줍니다. 공개적으로 도움을 요청할 때는 노드 주소·구독 매개변수·사용자 식별자·기타 연결 자격 증명을 삭제하고 오류 유형과 호출 단계만 남기세요.

마지막 설정 변경부터 되돌리기

새 노드를 가져온 뒤 문제가 발생했다면 검증된 노드로 전환하세요. 라우팅을 수정한 뒤라면 새 규칙을 잠시 비활성화하고, 포트를 변경한 뒤라면 새 포트가 사용 중인지 확인하세요. TUN을 켠 뒤 발생했다면 일반 시스템 프록시 모드로 먼저 복원합니다. 한 번에 한 종류의 설정만 되돌리고 매번 클라이언트를 다시 시작하세요. 모든 설정을 바로 삭제하면 일시적으로 복구될 수 있지만 원인 분석 근거를 잃고, 다시 가져온 뒤 같은 오류가 재발할 수 있습니다.

설정 파일이 JSON일 때 흔한 오류는 후행 쉼표·누락된 따옴표·필드 계층 오류·숫자를 인식할 수 없는 텍스트로 작성하는 경우입니다. 다음은 배열·객체·쉼표 위치를 설명하기 위한 구조가 완전한 최소 라우팅 조각 예시입니다. 실제 설정은 클라이언트가 생성한 전체 구조와 결합해야 합니다:

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": [
          "geosite:private"
        ],
        "outboundTag": "direct"
      }
    ]
  }
}

전체 설정 구조에 익숙하지 않다면 클라이언트 UI에서 편집하고 조각을 전체 설정 파일에 바로 덮어쓰지 마세요. 클라이언트가 생성하는 필드는 인바운드와 아웃바운드 태그를 참조하며, 태그 이름이 일치하지 않아도 시작이 실패할 수 있습니다. 로그에 특정 필드나 줄 번호가 표시되면 오류 문자의 바로 그 부분만 고치지 말고 상위 객체를 중심으로 확인하세요.

포트·권한·실행 디렉터리 확인

코어가 시작하자마자 종료되는 흔한 원인 중 하나는 수신 포트가 사용 중인 것입니다. 포트 확인 명령으로 프로세스 번호를 찾은 뒤 해당 프로세스가 이전 코어인지, 다른 프록시 도구인지, 정상적인 시스템 서비스인지 확인하세요. 정체를 모르는 시스템 프로세스를 바로 종료하지 마세요. 관련 애플리케이션을 닫거나 클라이언트에 사용하지 않는 포트를 지정하는 편이 안전합니다. 이전 코어 프로세스가 남아 있다면 먼저 클라이언트에서 중지하고 프로세스가 종료될 때까지 기다린 후 다시 시작하세요.

TUN·라우팅 추가·일부 시스템 기능에는 필요한 권한이 있습니다. 일반 프록시는 작동하지만 TUN 시작이 실패한다면 권한 안내·가상 인터페이스 생성·시스템 보안 정책을 확인하세요. 설치 디렉터리에 쓰기 권한이 없으면 클라이언트가 설정·로그·실행 구성 요소의 압축을 저장하거나 해제하지 못할 수 있습니다. 현재 사용자가 읽고 쓸 수 있는 일반 디렉터리에 프로그램을 두고, 압축 파일 내부에서 직접 실행하지 마세요. 여러 디렉터리에서 같은 설정을 동시에 실행하는 것도 피해야 합니다.

구독 데이터·클라이언트 UI·코어 분리

v2rayN은 Windows·macOS·Linux용 데스크톱 클라이언트이고, v2rayNG는 Xray 코어를 사용하며, v2flyNG는 v2fly 코어를 사용합니다. 이들의 UI·설정 관리·코어 구현은 같은 계층이 아닙니다. 노드 가져오기는 성공했지만 코어를 불러올 수 없다면 노드 매개변수와 현재 코어 기능이 맞지 않을 수 있습니다. 코어는 독립적으로 실행되지만 UI가 충돌한다면 클라이언트 상태 파일·UI 실행 환경·시스템 로그를 중점적으로 확인하세요.

분리 테스트를 할 때는 새 빈 설정 디렉터리를 만들거나 클라이언트의 백업·복원 기능을 사용하되, 유일한 데이터를 덮어쓰지 마세요. 먼저 구독과 사용자 지정 라우팅이 없는 기본 환경을 시작하고, 알려진 설정 하나를 단계적으로 가져오세요. 빈 환경은 안정적이고 가져온 뒤 충돌한다면 설정이나 데이터가 원인입니다. 빈 환경도 충돌한다면 설치 파일·실행 환경·권한·시스템 호환성을 우선 확인하세요. 클라이언트를 다시 받아야 한다면 다운로드 페이지에서 플랫폼과 아키텍처에 맞는 설치 파일을 선택하세요.

로그 증가·절전 복귀·보안 소프트웨어 차단 처리

상세 로그를 장기간 켜 두면 디스크 쓰기와 파일 크기가 증가합니다. 디스크 공간이 부족하면 설정 저장·업데이트·로그 기록이 모두 실패할 수 있습니다. 점검이 끝나면 로그 수준을 일상 설정으로 되돌리고 클라이언트가 제공하는 방식으로 이전 로그를 정리하세요. 코어 실행 중에 기록 중인 로그 파일을 수동으로 잠그거나 이동하지 마세요. 새로운 오류가 발생할 수 있습니다.

기기가 절전에서 복귀하면 네트워크 어댑터 주소·DNS·기본 경로가 바뀔 수 있지만 코어는 복귀 전 연결을 계속 보유할 수 있습니다. 이때는 먼저 연결을 중지하고 시스템 네트워크가 안정될 때까지 기다린 다음 코어를 다시 시작하는 편이 기기 전체를 재부팅하는 것보다 빠릅니다. 매번 절전 후 재현된다면 복귀 시 네트워크 어댑터·라우팅·로그 변화를 기록해 네트워크 재구성 문제인지 클라이언트 프로세스 문제인지 확인하세요.

보안 소프트웨어가 새로 다운로드한 실행 파일의 포트 수신·가상 인터페이스 생성·네트워크 접근을 차단할 수 있습니다. 시스템 보안 기록에 해당 클라이언트와 코어 프로세스가 명확히 차단되었는지 확인하고 실제 경로를 기준으로 처리하세요. 장기적인 해결책으로 시스템 보호 기능 전체를 끄지 마세요. 이벤트 기록으로 구체적인 차단 대상을 확인해야 다른 규칙을 유지한 채 실행을 복구할 수 있습니다.

복구가 끝나면 전체 회귀 테스트를 한 번 진행하세요. 클라이언트 시작·포트 수신·노드 연결·시스템 프록시 전환·구독 업데이트·종료 시 정리를 순서대로 확인합니다. 창이 열리는 것만으로 문제가 사라졌다고 볼 수 없습니다. 문제가 계속 재현된다면 최소 재현 단계와 처리한 로그를 함께 기록하고 자주 묻는 질문의 관련 항목을 확인하세요.

08 / ANDROID RUNTIME

Android 전용 점검: 권한·백그라운드 연결 끊김·앱별 프록시

첫 연결 전에 시스템 권한 확인

v2rayNG와 v2flyNG는 Android에서 일반적으로 시스템 VpnService를 통해 로컬 가상 네트워크를 만듭니다. 첫 연결 시 시스템에 권한 안내가 표시되며, 사용자가 승인해야 클라이언트가 해당 트래픽을 처리할 수 있습니다. 연결을 눌렀는데 상태 아이콘이 나타나지 않거나 로그가 즉시 권한 없음으로 돌아가거나 화면이 계속 연결 안 됨 상태라면 권한이 취소되지 않았는지 확인하세요. 시스템에서 같은 종류의 인터페이스를 사용하는 다른 네트워크 애플리케이션이 실행 중인지도 살펴봐야 합니다.

시스템은 일반적으로 이러한 연결 하나만 동시에 활성화할 수 있습니다. 클라이언트를 전환하기 전 기존 연결을 중지하고 상태 아이콘이 사라질 때까지 기다린 다음 v2rayNG 또는 v2flyNG를 시작하세요. 이전 앱을 강제 종료했지만 정상적으로 연결 해제되지 않았다면 시스템이 잠시 기존 인터페이스를 유지할 수 있습니다. 이때 시스템 네트워크 설정에서 기존 연결을 끊거나 네트워크를 재시작한 뒤 다시 시도하세요. 여러 앱이 번갈아 자동 재연결하도록 두지 마세요. 연결이 만들어지자마자 다른 앱으로 교체될 수 있습니다.

백그라운드 연결 끊김은 배터리와 프로세스 제한부터 확인

화면을 잠근 뒤 몇 분 후 끊기거나, 다른 앱으로 전환하면 전송이 멈추거나, 시스템이 백그라운드를 정리한 뒤 자동 복구되지 않는다면 배터리 최적화·백그라운드 활동 제한·기기 제조사의 프로세스 관리가 원인일 수 있습니다. 사용하는 클라이언트를 시스템의 백그라운드 실행 허용 목록에 추가하고 필요한 백그라운드 네트워크 활동을 허용하세요. 작업 정리 화면에서 프로세스를 수동으로 종료하지도 마세요. Android 버전에 따라 설정 이름은 다르지만 기준은 같습니다. 화면이 잠겨도 클라이언트 프로세스와 VpnService가 계속 실행되어야 합니다.

배터리 최적화 한 곳만 끄는 것으로 충분하지 않을 수 있습니다. 일부 기기는 앱별 배터리 정책·자동 시작 관리·백그라운드 데이터·절전 앱·잠금 화면 정리를 동시에 제공합니다. 항목을 하나씩 확인하고 변경 후 화면을 잠근 채 잠시 실제 요청을 보내세요. 상태 표시줄 아이콘만 확인해서는 안 됩니다. 아이콘은 남아 있지만 요청이 실패한다면 무선에서 모바일 데이터로 전환됐는지, 코어가 연결을 성공적으로 재구성했는지도 확인해야 합니다.

Android의 절전 모드는 백그라운드 작업과 네트워크 접근을 지연시킬 수 있습니다. 구독 자동 업데이트·연결 유지·네트워크 복구가 영향을 받을 수 있습니다. 점검할 때는 먼저 시스템 절전 모드를 끄고 비교하세요. 문제가 사라진다면 클라이언트별 설정만 조정하면 되며 기기 전체의 배터리 설정을 장기적으로 바꿀 필요는 없습니다. 더 자세한 안내는 v2rayNG 권한·절전·앱별 프록시를 참고하세요.

무선 네트워크와 모바일 네트워크 전환 처리

무선 네트워크에서 모바일 네트워크로 전환하면 로컬 IP·기본 경로·DNS가 모두 바뀌며 기존 TCP 연결은 대개 재사용할 수 없습니다. 클라이언트가 네트워크 변화를 감지해 다시 연결해야 하지만 시스템 제한·약한 신호·코어 상태로 복구가 지연될 수 있습니다. 전환 후 접속할 수 없다면 먼저 시스템 네트워크 자체가 정상인지 기다린 다음 클라이언트에서 중지하고 다시 연결하세요. 스위치를 빠르게 반복해서 누르지는 마세요.

무선 네트워크는 되지만 모바일 네트워크가 실패한다면 같은 노드로 대상 포트의 도달성과 IPv4·IPv6 차이를 확인하세요. 반대라면 라우터 DNS·로컬 네트워크 필터·무선 네트워크 로그인 상태를 점검합니다. 공용 무선 네트워크는 먼저 웹 로그인 절차를 요구하는 경우가 많으므로, 가상 네트워크를 만들기 전에 클라이언트를 끄고 인증을 완료한 뒤 다시 연결하세요. 한 네트워크에서만 실패한다면 다른 네트워크에서 같은 설정이 작동한다는 뜻이므로 구독이나 노드 매개변수를 초기화하지 마세요.

앱별 프록시에서 ‘포함’과 ‘제외’를 명확히 구분

앱별 프록시는 일반적으로 선택한 앱만 프록시하거나 선택한 앱을 우회하는 두 가지 논리를 제공합니다. 이름은 비슷하지만 결과는 반대입니다. 켜기 전에 현재 모드를 확인하고 대상 앱이 목록에 있는지 살펴보세요. ‘프록시만’ 모드에서는 선택하지 않은 브라우저와 테스트 도구가 클라이언트를 거치지 않습니다. ‘우회’ 모드에서는 목록의 앱이 원래 네트워크를 직접 사용합니다. 문제를 확인할 때는 앱별 규칙을 잠시 끄고 전역 연결이 작동하는지 확인한 뒤 앱을 하나씩 추가하거나 제외하세요.

앱을 업데이트하거나 재설치하면 시스템 식별자가 바뀌어 기존 규칙이 더 이상 일치하지 않을 수 있습니다. 특정 앱이 이전에는 작동했지만 업데이트 후 갑자기 직접 연결되거나 네트워크가 끊긴다면 앱별 목록을 다시 열어 저장하세요. 시스템 구성 요소·내장 웹페이지·앱이 호출하는 외부 브라우저는 서로 다른 프로세스일 수 있으므로 주 앱만 선택해도 전체 로그인 흐름이 포함되지 않을 수 있습니다. 코어 접근 로그를 보면 요청이 실제로 클라이언트에 들어갔는지 확인할 수 있습니다.

Android DNS와 프라이빗 DNS의 중첩 관계

시스템 프라이빗 DNS·클라이언트 코어 DNS·애플리케이션 자체 해석이 동시에 존재할 수 있습니다. 연결 후 도메인만 실패하고 IP 직접 요청은 응답한다면 먼저 시스템 프라이빗 DNS가 자동·사용 안 함·지정 호스트 중 어떤 상태인지 확인한 다음 클라이언트 로그의 DNS 오류를 확인하세요. 지정한 프라이빗 DNS 호스트가 현재 네트워크에서 도달할 수 없으면 가상 네트워크를 만들기 전후의 해석 모두 영향을 받습니다. 시스템 자동 모드로 잠시 전환해 비교한 뒤 장기 설정을 결정하세요.

로컬 DNS 인계를 켤 때는 현재 아웃바운드를 통해 조회가 완료되는지, 노드 도메인에도 사용 가능한 초기 해석 경로가 있는지 확인하세요. 데스크톱과 마찬가지로 노드 해석에 필요한 DNS를 아직 연결되지 않은 노드에 완전히 의존하게 해서는 안 됩니다. 네트워크 전환 후에도 이전 결과가 계속 사용되면 연결을 중지하고 비행기 모드를 켰다가 끄어 네트워크를 재구성한 뒤 클라이언트를 다시 연결하세요. 이 작업은 현재 모든 네트워크 작업을 중단하므로 작업을 저장한 뒤 실행해야 합니다.

앱은 연결되지만 접속할 수 없을 때의 최단 절차

먼저 앱별 프록시를 끄고 검증된 노드를 선택한 뒤 시스템 권한이 있는지 확인하세요. 연결 로그에서 노드 핸드셰이크가 완료됐는지 확인하고 브라우저로 도메인 접속을 테스트합니다. 핸드셰이크가 실패하면 노드 시간 초과 절을 따르세요. 핸드셰이크는 성공했지만 접근 로그가 전혀 없다면 앱 트래픽이 가상 네트워크에 들어가지 않은 것이므로 권한과 앱별 설정을 확인합니다. 접근 로그는 있지만 DNS 오류가 발생하면 시스템 프라이빗 DNS와 코어 DNS를 처리하세요. 요청이 아웃바운드에 들어간 뒤 시간 초과되면 무선 네트워크와 모바일 네트워크를 비교합니다.

특정 앱만 실패한다면 해당 앱의 독립 프록시·프라이빗 DNS·백그라운드 데이터 제한·Wi-Fi에서만 다운로드 설정을 확인하세요. 클라이언트 데이터를 전부 삭제하면 구독과 라우팅 설정까지 지워지므로 첫 단계로 사용하지 마세요. 더 안전한 방법은 기존 설정을 내보내거나 기록하고 최소 설정을 새로 만들어 비교한 뒤 초기화 여부를 결정하는 것입니다. v2rayNG는 Xray 코어 설정에 우선 사용하고, v2flyNG는 v2fly 코어의 대안으로 사용할 수 있습니다. 클라이언트를 바꿔 테스트할 때는 매개변수가 완전한 동일 노드를 사용하고 두 클라이언트가 지원하는 코어 기능이 다를 수 있다는 점에 유의하세요.

Android 증상 우선 확인할 항목 처리 방법
연결을 누른 직후 중지됨 시스템 권한, 설정 로드 로그 권한을 다시 승인하고 노드 매개변수 확인
화면 잠금 후 연결 끊김 배터리 최적화, 백그라운드 활동 클라이언트의 지속적인 백그라운드 실행 허용
네트워크 전환 후 작동하지 않음 라우팅 재구성, DNS, 노드 도달성 기본 네트워크 확인 후 다시 연결
일부 앱만 실패 앱별 모드, 앱 자체 설정 필터를 끄고 확인한 뒤 항목별로 복원

모바일 문제는 시스템 수명 주기와 네트워크 전환이 함께 작용해 발생하는 경우가 많습니다. 안정적인 설정은 연결 상태 아이콘이 켜지는 것만으로 충분하지 않습니다. 화면 잠금 후 유지되고, 무선·모바일 네트워크 전환 후 복구되며, 대상 앱이 실제로 분할 라우팅 규칙과 일치해야 합니다. 조정할 때마다 해당 상황을 테스트해 전면에서 잠깐 성공한 뒤 점검을 끝내지 않도록 하세요.

NEXT CHECK

문제를 하나의 연결 단계로 좁히기

증상·현재 네트워크·클라이언트·노드·프록시 모드·로그 단계·수행한 작업을 기록하세요. 기본 설정을 아직 완료하지 않았다면 빠른 시작으로 돌아가고, 클라이언트를 교체해야 한다면 플랫폼에 맞는 다운로드 페이지로 이동하세요.