v2rayN 로컬 포트 충돌 해결: 포트 점유 프로세스 확인 및 수신 포트 변경

시스템 명령어로 10808 등 포트를 점유한 프로세스를 찾고, 클라이언트의 수신 포트를 변경한 뒤 브라우저와 시스템 프록시 설정을 함께 업데이트하세요.

이 글에서 다루는 내용

v2rayN에서 코어 시작에 실패하거나 로그에 주소 사용 중 오류가 표시되는 경우, 포트를 바꾼 뒤에도 브라우저가 연결되지 않는 경우에 적용할 수 있습니다. 먼저 포트 충돌과 권한 제한을 구분한 다음 Windows 및 macOS 명령어로 수신 프로세스를 찾습니다. 포트를 바꿔야 한다면 10808을 20808로 변경하는 예시를 따라 클라이언트 수신 포트, 시스템 프록시, 수동 프록시 주소를 함께 수정하고 실제 수신 여부와 요청 결과를 확인하세요.

로그부터 확인: 포트 충돌은 노드 장애와 다릅니다

로컬 수신 포트는 앱이 프록시 코어에 연결하는 입구이며, 노드 서버 포트가 아닙니다. 브라우저가 127.0.0.1:10808에 연결하면 요청은 먼저 로컬 코어로 전달된 뒤 라우팅 규칙에 따라 직접 연결되거나 프록시를 통해 나갑니다. 코어가 수신 주소에 바인딩하지 못한 경우 구독을 바꾸거나 VMess 또는 VLESS 노드를 바꿔도 보통 해결되지 않습니다.

앱의 프록시 설정 로컬 수신 포트 라우팅 규칙 적용 직접 연결 또는 프록시 대상 사이트

먼저 v2rayN 메인 화면의 로그 영역을 열고 실패한 항목에 표시된 주소, 포트, 오류 메시지를 기록하세요. 127.0.0.1:10808, 0.0.0.0:10808, [::1]:10808은 서로 완전히 같은 주소가 아니며 수신 범위나 주소 체계가 다릅니다. 특히 모든 IPv4 주소에 바인딩된 프로세스는 로컬 루프백 주소에만 바인딩하려는 프로세스와 충돌할 수 있습니다.

bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

원인 및 해결: Windows에서 흔히 발생하는 주소 사용 중 오류입니다. 로그에 표시된 포트로 수신 프로세스를 조회하고, 해당 프로세스가 무엇인지 확인한 뒤 중복 실행된 인스턴스를 종료하거나 현재 클라이언트에 사용 가능한 포트를 지정하세요.

bind: address already in use

원인 및 해결: macOS 등에서 흔히 발생하는 바인딩 충돌입니다. lsof로 같은 포트를 수신 중인 프로세스를 확인하세요. 문제를 원격 서버 탓으로만 돌리지 마세요.

bind: An attempt was made to access a socket in a way forbidden by its access permissions.

원인 및 해결: Windows에서 바인딩이 거부되었다면 시스템에서 제외한 포트나 보안 정책이 원인일 수 있습니다. 수신 프로세스가 없어도 발생할 수 있으므로 제외 범위를 추가로 확인하고, 관련 없는 프로세스를 반복해서 종료하지 마세요.

Windows: 포트로 PID와 프로그램 경로 찾기

PowerShell에서 아래 명령을 실행하세요. 여기서는 로그에 표시된 10808을 예로 들었습니다. 오류에 다른 포트가 표시되면 숫자만 바꾸면 됩니다. 로컬 포트와 수신 상태를 기준으로 검색하므로 숫자가 포함된 행을 모두 찾는 방식보다 정확합니다.

Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
  Select-Object LocalAddress, LocalPort, State, OwningProcess

OwningProcess는 프로세스 PID입니다. 조회 결과가 6420이라고 가정하고 아래 두 명령을 실행하세요. 이 숫자는 예시일 뿐이므로 현재 컴퓨터에서 확인한 PID로 바꿔야 합니다.

Get-Process -Id 6420 | Select-Object Id, ProcessName, Path

Get-CimInstance Win32_Process -Filter "ProcessId = 6420" |
  Select-Object ProcessId, ExecutablePath, CommandLine

경로와 명령줄을 보면 현재 v2rayN이 실행한 코어인지, 다른 폴더에 압축을 풀어 둔 이전 인스턴스인지, 다른 프로그램인지 구분하는 데 도움이 됩니다. 일부 프로세스 정보는 관리자 권한이 있어야 모두 확인할 수 있습니다. 일반 권한으로 결과가 충분하지 않다면 터미널을 관리자 권한으로 다시 여세요. 프로세스 이름이 같다는 이유만으로 종료해도 된다고 판단하지 마세요.

PowerShell 조회 결과가 없을 때

netstat -ano -p tcp | findstr :10808
tasklist /FI "PID eq 6420"
  • netstat 출력의 ‘로컬 주소’ 열에서 포트가 10808이고 상태가 LISTENING인지 확인하세요.
  • findstr는 텍스트를 필터링할 뿐이므로 원격 주소나 같은 숫자가 포함된 다른 포트도 검색될 수 있습니다. 표시된 모든 행을 로컬 포트 점유로 보면 안 됩니다.
  • TIME_WAIT는 프록시 프로세스가 계속 수신 중이라는 뜻이 아닙니다. 이를 근거로 프로그램을 일괄 종료하지 마세요.
  • 오류가 UDP와 관련 있다고 명시된 경우에만 Get-NetUDPEndpoint -LocalPort 10808으로 확인하세요. UDP 조회에는 TCP의 수신 상태 필드가 없습니다.

macOS: 수신 프로세스 확인 및 중복 인스턴스 구분

‘터미널’을 열고 macOS에 기본으로 포함된 lsof로 TCP 수신 포트를 조회하세요. -nP 옵션을 사용하면 주소와 포트가 숫자로 표시되어 로그와 항목별로 대조하기 쉽습니다.

lsof -nP -iTCP:10808 -sTCP:LISTEN

결과에서 COMMAND는 프로세스 이름, PID는 프로세스 번호, NAME은 수신 주소를 나타냅니다. 일반 조회 결과가 비어 있어도 다른 계정의 프로세스가 점유했을 가능성이 있다면 sudo lsof -nP -iTCP:10808 -sTCP:LISTEN으로 다시 확인하세요. 결과가 없다고 해서 포트를 반드시 사용할 수 있는 것은 아닙니다. 실패 로그가 방금 실행한 시작 시도에서 나온 것인지도 확인하세요.

  1. PID를 확인했다면 ps -p 6420 -o pid,ppid,command를 실행하세요. 예시 PID를 실제 값으로 바꿔 시작 명령과 부모 프로세스를 확인하면 됩니다.
  2. 다른 v2rayN 인스턴스가 원인이라면 해당 인스턴스의 메뉴 막대나 앱 메뉴에서 먼저 종료한 뒤, 계속 사용할 인스턴스를 실행하세요.
  3. 사용 중인 다른 프로그램이 점유하고 있다면 해당 프로그램은 그대로 두고 v2rayN에 다른 로컬 수신 포트를 지정하세요.
  4. 프로세스가 무엇인지 확인하고 정상 종료도 되지 않을 때만 ‘활성 상태 보기’에서 종료를 고려하세요. 코어를 종료하면 기존 연결이 끊길 수 있습니다.

수신 포트 변경: 10808을 20808로 바꾸는 예시

점유 중인 프로세스를 계속 사용해야 한다면 로컬 수신 포트를 변경하는 편이 간단합니다. 아래 설명은 v2rayN 7.x에서 흔히 볼 수 있는 화면을 기준으로 합니다. 버전이나 데스크톱·클래식 인터페이스에 따라 메뉴 그룹 이름은 다를 수 있으므로 현재 버전의 ‘로컬 수신 포트’ 항목을 기준으로 확인하세요. 설정을 변경하기 전에 20808을 이미 수신 중인 프로세스가 있는지 조회하세요. 예시 포트가 모든 컴퓨터에서 비어 있는 것은 아닙니다.

  1. 기존 설정 기록

    ‘설정’ → ‘매개변수 설정’에서 로컬 수신 관련 항목을 찾아 기존 포트, 혼합 수신 사용 여부, 수신 주소, LAN 연결 옵션을 기록하세요. 노드 편집 화면의 원격 서버 포트는 변경하지 마세요.

  2. 새 포트 확인

    Windows에서는 앞서 사용한 조회 명령의 포트를 -LocalPort 20808로 바꾸고, macOS에서는 lsof -nP -iTCP:20808 -sTCP:LISTEN을 실행하세요. 이미 점유 중이라면 다른 숫자로 바꿔 다시 확인하세요.

  3. 수신 포트 변경

    ‘설정’ → ‘매개변수 설정’에서 해당 ‘로컬 수신 포트’를 20808로 바꾸고 저장한 다음 화면 안내에 따라 코어를 다시 시작하세요. 저장 후 설정이 다시 로드되지 않았다면 v2rayN을 정상 종료한 뒤 다시 실행하면 됩니다.

  4. 프록시 설정 다시 적용

    메인 화면이나 트레이 메뉴의 ‘시스템 프록시’에서 먼저 ‘시스템 프록시 해제’를 선택한 다음 ‘시스템 프록시 자동 설정’을 선택하세요. 수동 프록시를 사용하는 앱은 별도로 업데이트해야 합니다. 이 단계만으로 모든 앱의 설정이 바뀌지는 않습니다.

  5. 최신 로그 확인

    20808을 다시 조회해 예상한 코어가 수신 중인지 확인하고, 이번 시작 시도에서 바인딩 오류가 발생했는지도 로그에서 확인하세요. 포트 숫자만 바꾸고 코어 시작에 실패했다면 브라우저는 여전히 연결되지 않습니다.

프록시 주소도 함께 변경: 앱이 이전 포트에 계속 연결하지 않도록 설정

포트를 변경한 뒤에도 ‘연결이 거부되었습니다’라는 오류가 난다면 앱이 여전히 이전 수신 주소에 연결하고 있을 수 있습니다. 시스템 프록시, 브라우저 확장 프로그램, 터미널 환경 변수는 서로 다른 설정입니다. 한 앱에서 연결이 복구되었다고 해서 모든 앱의 설정이 업데이트된 것은 아닙니다.

설정 항목확인 위치수정할 내용
v2rayN 시스템 프록시‘시스템 프록시’ 메뉴‘시스템 프록시 자동 설정’을 다시 실행하고 로컬 포트가 올바르게 설정됐는지 확인하세요.
Windows 수동 프록시‘설정’ → ‘네트워크 및 인터넷’ → ‘프록시’수동 설정을 사용한다면 주소와 포트가 여전히 이전 수신 주소를 가리키는지 확인하세요.
macOS 네트워크 프록시‘시스템 설정’ → ‘네트워크’ → 현재 연결 → ‘세부사항’ → ‘프록시’실제로 사용하는 웹 프록시 또는 SOCKS 프록시를 확인하세요. 두 프로토콜을 임의로 바꾸면 안 됩니다.
브라우저 개별 프록시브라우저 네트워크 설정 또는 프록시 확장 프로그램 설정이전 포트를 직접 지정했다면 새 수신 주소로 수동 변경하세요. 시스템 설정을 따르도록 구성된 경우에는 시스템 프록시를 확인하세요.
터미널 및 개발 도구환경 변수, 도구 자체의 네트워크 설정HTTP_PROXY, HTTPS_PROXY, ALL_PROXY 환경 변수와 고정 프록시 매개변수를 확인하세요.

아래 PowerShell 예제는 현재 수신 포트가 HTTP 프록시를 지원하는 경우에만 사용할 수 있습니다. 현재 터미널 프로세스의 환경 변수만 변경하므로 이미 열려 있는 다른 터미널에는 자동으로 적용되지 않으며 시스템 설정에도 영구 저장되지 않습니다.

$env:HTTP_PROXY = "http://127.0.0.1:20808"
$env:HTTPS_PROXY = "http://127.0.0.1:20808"

HTTPS_PROXY 값에 http://를 사용하는 것은 모순이 아닙니다. 이는 로컬 HTTP 프록시에 연결하는 방식을 나타내며, HTTPS 대상에는 보통 CONNECT 터널을 사용합니다. SOCKS 수신 포트를 사용한다면 해당 도구가 지원하는 프로토콜을 입력하세요. 프로토콜 이름만 바꾸면 도구가 인식할 것이라고 가정하면 안 됩니다.

점유 프로세스가 없을 때: 제외 범위와 결과 확인

Windows에서 권한 관련 바인딩 오류가 발생했지만 TCP 수신 조회 결과가 비어 있다면 시스템에서 제외한 포트 범위를 확인할 수 있습니다. 가상화, 컨테이너, 네트워크 공유 관련 구성 요소가 이러한 예약 범위와 관련될 수 있습니다. 구체적인 연관성이 있는지는 해당 컴퓨터의 조회 결과를 기준으로 판단하세요.

netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp

오류가 발생한 포트가 제외 범위에 속한다면 해당 범위 밖에 있고 다른 프로세스가 수신 중이지 않은 포트를 우선 선택하세요. 프록시 포트를 쓰기 위해 시스템 예약 항목을 임의로 삭제하지 말고, 항상 관리자 권한으로 실행하는 것을 일반적인 해결책으로 삼지 마세요. 포트가 제외 범위 밖이라면 보안 프로그램의 차단 기록과 코어 로그를 확인하세요. 먼저 보안 기능 전체를 끌 필요는 없습니다.

세 단계로 결과 확인

  • 수신 단계: 새 포트를 예상한 코어 프로세스가 수신 중인지 확인하세요. Windows에서는 Test-NetConnection 127.0.0.1 -Port 20808으로 TCP 연결을 확인할 수 있지만, 성공하더라도 프록시 프로토콜이나 원격 연결까지 정상이라는 뜻은 아닙니다.
  • 프록시 단계: HTTP를 지원하는 수신 포트에서는 아래 명시적 프록시 요청을 실행해 시스템 프록시 설정으로 인한 혼선을 피하세요. SOCKS 수신 포트에는 두 번째 명령을 사용합니다. 수신 포트 유형에 맞는 명령 하나를 선택하세요.
  • 앱 단계: 명시적 프록시 요청이 성공하면 브라우저로 같은 사이트에 접속해 보세요. 명령은 성공하지만 브라우저에서 실패한다면 브라우저 개별 프록시, 확장 프로그램, 이전 포트가 저장된 설정을 먼저 확인하세요.
curl --proxy http://127.0.0.1:20808 --connect-timeout 5 --max-time 15 -I https://example.com/

curl --proxy socks5h://127.0.0.1:20808 --connect-timeout 5 --max-time 15 -I https://example.com/

Windows PowerShell에서는 일부 환경에서 같은 이름의 별칭이 매개변수 해석에 영향을 주지 않도록 curl 대신 curl.exe를 사용할 수 있습니다. 여기서 5초는 연결 시간 초과 한도이고 15초는 전체 요청 시간 제한입니다. 성능 측정값이 아닙니다. HTTP 응답을 받았다는 것은 요청에 결과가 돌아왔다는 뜻이지만, 해당 도메인이 라우팅 규칙에 따라 직접 연결된다면 프록시를 통한 외부 연결이 정상이라는 증거는 아닙니다. 실제 연결 경로는 코어 로그와 함께 확인하세요.

자주 묻는 질문: 재부팅 후 재발과 포트 변경 범위

컴퓨터를 재부팅한 뒤 10808 포트가 다시 점유되면 어떻게 하나요?

PID와 프로그램 경로를 다시 확인해 v2rayN이 두 개 실행 중인지, 다른 프로그램이 자동으로 시작되는지 살펴보세요. Windows에서는 ‘설정’ → ‘앱’ → ‘시작 프로그램’을, macOS에서는 ‘시스템 설정’ → ‘일반’ → ‘로그인 항목’을 확인하세요. 필요한 시작 항목만 남기고, 이전에 기록한 PID를 그대로 사용해 프로세스를 종료하지 마세요.

포트를 점유한 프로세스를 바로 강제 종료해도 되나요?

먼저 경로와 용도를 확인한 뒤 해당 앱에서 정상적으로 종료하세요. 점유 프로세스가 작동 중인 서비스이거나 다른 사용자의 프로그램일 수 있습니다. 계속 사용해야 한다면 v2rayN의 포트를 변경하는 편이 낫습니다. 코어를 강제 종료한 뒤에도 시스템 프록시가 종료된 수신 주소를 가리킬 수 있으므로 프록시를 해제하거나 다시 설정해야 합니다.

로컬 포트를 바꾸면 구독이나 노드에도 영향이 있나요?

로컬 수신 포트 항목만 변경하면 구독 링크, 노드 서버 주소, 노드 서버 포트는 바뀌지 않습니다. 함께 수정해야 하는 것은 로컬 수신 포트에 연결하는 앱의 설정입니다. 노드 편집 화면의 포트를 잘못 변경했다면 서버에서 제공한 설정값으로 복구하세요. 20808을 원격 포트 대신 사용하면 안 됩니다.

모든 주소에서 수신하도록 바꾸면 충돌을 피할 수 있나요?

127.0.0.1을 0.0.0.0으로 바꾸는 것은 해결책이 아닙니다. 수신 범위가 넓어지면 기존 바인딩과 오히려 충돌할 수 있습니다. 로컬에서만 사용할 때는 루프백 주소를 유지하세요. LAN에서 접속해야 하는 경우에만 접근 제어와 방화벽 규칙을 별도로 설정하세요.

새 포트가 수신 중인데도 웹페이지가 열리지 않나요?

먼저 명시적 프록시 명령으로 테스트한 뒤 수신 프로토콜, 시스템 프록시, 브라우저 설정을 확인하세요. 요청이 코어에 전달된 뒤 원격 연결 시간 초과, 인증 실패, 도메인 이름 확인 오류가 발생한다면 로컬 포트를 계속 바꾸기보다 노드 설정, DNS, 라우팅을 점검해야 합니다.

클라이언트 다운로드