연결 문제 해결 · Clash 기술 블로그

Clash Verge Rev 포트가 사용 중일 때 해결 방법

Clash Verge Rev에서 address already in use가 나오나요? mixed-port를 사용하는 프로세스와 예약된 포트를 확인하고 남아 있는 코어나 다른 프로그램을 처리하세요. 시스템 프록시와 종료 후 직접 연결을 검증하세요.

  • Clash Verge Rev
  • address already in use
  • mixed-port
  • 포트 점유
  • 서비스 모드
이 글의 목차

창을 닫아도 프록시 코어나 다른 로컬 프로그램이 같은 포트를 사용하고 있을 수 있습니다. 새 프로그램이 시작되지 않는다고 구독이 손상된 것은 아닙니다. 실제 포트와 이를 점유한 프로세스를 연결해 확인한 뒤 작동 중인 연결은 유지하고 확인된 충돌만 처리하세요.

address already in use: 실제로 어느 포트를 바인딩하지 못했나요?

로그의 address already in use, Bind failed 또는 Start Mixed(http+socks) server error 메시지를 보관하고 해당 로컬 포트를 기록하세요. 이런 오류가 발생하면 새 프로그램이 포트 바인딩을 완료하지 못한 것입니다.

포트는 프로그램이 요청을 받는 입구 번호입니다. 자신의 로그에 나온 mixed-port, DNS 또는 external-controller 값을 사용하세요. 보고서의 7890과 1053은 예시일 뿐입니다.

Mihomo 문서에서 mixed-port는 HTTP(S)와 SOCKS 요청을 모두 받는 로컬 진입점입니다. 새 코어가 바인딩하지 못했다면 그 코어가 해당 진입점을 사용하지 못한 것입니다. 기존 수신 프로세스는 여전히 요청을 처리할 수 있으므로 실제로 포트를 점유한 프로세스와 연결 기록을 확인해야 합니다.

Clash Verge Rev issue #7861에는 macOS 서비스 모드에서 GUI가 비정상 종료된 뒤 root 사용자로 실행된 verge-mihomo가 mixed-port와 DNS 포트를 계속 점유한 사례가 기록되어 있습니다. Issue #6741에는 Linux에 다시 로그인할 때 새 코어와 이전 코어가 mixed-port를 두고 충돌한 사례가 기록되어 있습니다.

두 건 모두 현재 open issue이며, 원인 분석은 보고자의 판단이므로 유지보수 담당자가 확인한 일반적인 결론처럼 서술해서는 안 됩니다.

첫 번째 bind 오류에서 실제 포트를 먼저 기록
Start Mixed(http+socks) server error: listen tcp :7890: bind: address already in use
Start DNS server(TCP) error: listen tcp 0.0.0.0:1053: bind: address already in use
Start DNS server(UDP) error: listen udp 0.0.0.0:1053: bind: address already in use

첫 번째 오류에 따라 분기

로그 또는 증상가능성이 더 높은 원인다음 단계
mixed-port에만 address already in use 오류 발생이전 클라이언트, 다른 프로그램, 남아 있는 코어 또는 Windows 예약 포트실제 수신 프로세스 확인
mixed-port와 DNS 포트가 동시에 실패다른 코어가 전체 포트 묶음을 동시에 점유했을 가능성이 큼프로세스 소유자와 시작 시간 확인
external-controller 포트만 충돌제어 인터페이스 또는 Dashboard가 같은 포트를 사용제어 포트만 별도로 확인
로그에 connection refused만 있고 bind 오류는 없음대상 포트가 수신 중이 아니므로 포트 점유 문제가 아님코어 시작 및 설정 점검
특정 웹사이트 하나만 열리지 않음규칙, DNS 또는 노드 문제이 글의 절차로 프로세스를 종료하지 않기

클라이언트 종료 후 포트가 해제됐나요?

TUN과 시스템 프록시를 끄고 Clash Verge Rev 없이도 연결되는지 확인한 뒤 트레이에서 완전히 종료하세요. 구독이나 규칙을 업데이트하지 말고 현재 Profile, 포트 설정과 첫 오류 로그를 보관하세요. 공개 피드백 전 구독 URL, 비밀번호와 secret을 가리세요.

종료 후 몇 초 기다렸다가 포트를 다시 확인하세요. 수신이 사라졌다면 클라이언트를 한 번만 시작해 관찰하세요. 포트가 계속 점유된 경우에만 점유 프로세스를 계속 조사합니다.

PID, 실행 계정, 경로로 포트를 점유한 프로그램 확인하기

프로세스 이름만으로 포트를 점유한 프로그램을 판단하지 마세요. PID(프로세스 번호)를 찾은 뒤 프로세스 이름, 소유자(실행 계정), 시작 시간과 프로그램 경로를 확인해야 현재 정상 작동하는 코어, 종료 후 남은 이전 코어, 무관한 프로그램을 구분할 수 있습니다.

아래의 7890, 1053, 12345는 모두 예시입니다. 실행하기 전에 로그의 포트와 방금 확인한 PID로 바꾸세요. 읽기 전용 조회에서 결과가 나오지 않더라도 결과를 얻으려고 임의로 프로세스를 종료하지 마세요.

Windows PowerShell: TCP 및 UDP 수신 프로세스 조회
$Port = 7890
$Tcp = Get-NetTCPConnection -LocalPort $Port -State Listen -ErrorAction SilentlyContinue
$Tcp | Select-Object LocalAddress, LocalPort, OwningProcess
$Tcp | ForEach-Object {
  Get-Process -Id $_.OwningProcess | Select-Object Id, ProcessName, Path
}
Get-NetUDPEndpoint -LocalPort 1053 -ErrorAction SilentlyContinue |
  Select-Object LocalAddress, LocalPort, OwningProcess
macOS: 수신 프로세스 조회 및 프로세스 확인
PORT=7890
sudo lsof -nP -iTCP:${PORT} -sTCP:LISTEN
sudo lsof -nP -iUDP:1053
ps -o user,pid,ppid,lstart,command -p 12345
Linux: 수신 프로세스 조회 및 프로세스 확인
sudo ss -ltnp 'sport = :7890'
sudo ss -lunp 'sport = :1053'
ps -o user,pid,ppid,lstart,cmd -p 12345

다른 프로그램이나 남아 있는 코어가 포트를 점유하면 어떻게 처리하나요?

포트가 다른 Clash, VPN, 개발 서버 또는 로컬 프록시에 속함

해당 프로그램의 자체 인터페이스에서 정상 종료하거나 두 프로그램에 서로 다른 포트를 지정하세요. 알 수 없는 시스템 프로세스는 종료하지 마세요.

Clash Verge Rev가 종료됐는데도 포트가 verge-mihomo에 속함

남아 있는 코어의 특징에 해당합니다. PID와 소유자를 기록한 뒤 아래의 운영체제별 방법으로 해당 PID만 종료하세요. 이름이 같은 다른 프로세스는 종료하지 마세요.

프로세스가 root 또는 관리자 소유이고 종료 후 즉시 다시 나타남

반복해서 강제 종료하지 말고 클라이언트의 서비스 모드 복구 또는 재설치 절차로 이동하세요.

다시 로그인하거나 클라이언트를 빠르게 재시작한 뒤 간헐적으로 충돌

기존 코어가 완전히 종료되기 전에 새 코어가 시작되었을 수 있습니다. 중복 자동 시작 항목을 끄고 클라이언트를 한 번만 시작해 확인하세요.

Windows에서 수신 프로세스를 찾을 수 없지만 여전히 바인딩할 수 없음

포트가 Windows excluded port range에 포함되는지 확인합니다.

PID가 클라이언트 종료 후 남은 verge-mihomo에 해당하는지 확인한 뒤에만 프로세스를 종료하고 포트를 다시 확인하세요. macOS/Linux에서는 TERM을 먼저 보냅니다. Windows의 Stop-Process는 프로세스를 바로 종료하며 -Confirm은 확인 메시지만 추가합니다. 범위가 넓은 pkill을 사용하거나 정상적으로 트래픽을 전달하는 코어를 종료하지 마세요.

macOS / Linux: 방금 확인한 단일 PID만 종료
# 把 12345 换成刚才确认的 PID
sudo kill -TERM 12345
Windows PowerShell: 확인 후 단일 PID 종료
# 把 12345 换成刚才确认的 PID
Stop-Process -Id 12345 -Confirm

Windows에서 수신 프로세스가 없으면 예약 포트 확인

Issue #6947의 Windows 사례에서는 포트를 변경하고 시스템 프록시를 다시 시작한 뒤 정상화되었습니다. 프로젝트 협력자는 먼저 Mihomo 로그에서 Bind failed를 확인하고 Windows 또는 Hyper-V의 예약 포트를 점검하라고 안내했습니다. 이 분기는 수신 프로세스가 검색되지 않지만 로그에는 바인딩 실패가 명확히 나타나는 경우에만 적용됩니다.

현재 mixed-port가 예약 범위에 포함되면 Clash Verge Rev의 포트 설정에서 수신 중이지 않고 예약 범위에도 포함되지 않는 새 포트를 선택한 다음 홈 화면으로 돌아가 시스템 프록시를 다시 켜세요. 점유 프로세스를 확인하지 않고 포트만 바꾸면 계속 실행 중인 남은 코어 문제는 해결되지 않습니다.

Windows TCP 및 UDP 예약 포트 읽기 전용 조회
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv4 show excludedportrange protocol=udp
netsh interface ipv6 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=udp
후보 포트를 사용하기 전에 수신 프로세스가 없는지 확인
# 17890 只是示例,不能保证每台电脑都可用
Get-NetTCPConnection -LocalPort 17890 -ErrorAction SilentlyContinue
Get-NetUDPEndpoint -LocalPort 17890 -ErrorAction SilentlyContinue

남은 코어가 반복해서 나타나면 서비스 모드 복구

Clash Verge Rev v2.5.2 소스 코드는 서비스 설치, 제거, 재설치 및 repair 명령을 제공합니다. repair 경로는 강제 재설치를 수행하고 서비스 IPC가 복구될 때까지 기다립니다. 운영체제와 빌드에 따라 버튼 이름이 다를 수 있으므로, 서비스 파일을 직접 삭제하지 말고 현재 클라이언트 설정의 서비스 모드 항목을 사용하세요.

v2.5.2 릴리스 노트에는 더 견고한 서비스 수명 주기 관리가 언급되어 있지만, 이후 보고된 잔류 코어와 포트 경합 문제가 안정 버전에서 완전히 수정됐다는 증거는 아닙니다. 이 글은 장애 복구 절차를 제공하며 버전 수정 공지가 아닙니다.

서비스 모드 복구 순서

  1. 직접 연결 유지

    시스템 프록시와 TUN을 끄고 클라이언트가 중지된 상태에서도 시스템이 인터넷에 연결되는지 확인합니다.

  2. 진단 결과 저장

    포트, PID, 프로세스 소유자, 클라이언트 버전 및 첫 번째 bind 오류를 기록합니다.

  3. 클라이언트 항목 사용

    현재 클라이언트의 서비스 모드 설정에서 기존 서비스를 비활성화하거나 제거할 수 있습니다. Windows에서는 서비스 구성 요소가 공식 보안 권고의 수정 요건을 충족한다고 확인한 경우에만 복구, 재설치 또는 활성화하세요. 확인하지 못했다면 비활성화 상태를 유지합니다. 다른 시스템은 클라이언트의 제거, 복구 또는 재설치 메뉴를 사용하고 권한 요청과 작업이 완료될 때까지 기다리세요.

  4. 필요하면 시스템 재시작

    관리자 권한 코어가 계속 포트를 점유하면 재시작한 뒤 먼저 포트가 해제됐는지 확인하고 클라이언트를 시작합니다.

  5. 기능 하나만 복구

    먼저 기존 Profile과 시스템 프록시를 시작하고 정상 작동을 확인한 뒤 필요한 경우 TUN을 복구합니다.

수정 후 포트, 프록시 및 종료 시 해제 여부 검증

현재 mixed-port를 통한 실제 요청 검증
# 把 7890 换成当前 mixed-port
curl -I -x http://127.0.0.1:7890 https://example.com

완료 기준

  • 시작 전 대상 포트에 알 수 없는 수신 프로세스가 없음
  • 시작 후 mixed-port를 예상한 verge-mihomo 하나만 수신
  • 새 로그에 address already in use 또는 Bind failed가 더 이상 나타나지 않음
  • mixed-port를 통한 curl 요청이 HTTP 응답을 받음
  • 시스템 프록시가 현재 실제 포트를 가리키고 Connections에 테스트 요청이 표시됨
  • 클라이언트를 정상 종료하면 포트가 해제되고 시스템 프록시도 복구됨
  • 다시 시작하거나 로그인한 뒤 두 번째 잔류 코어가 나타나지 않음

시스템 프록시로 실제 HTTPS 요청이 성공한 뒤에만 필요에 따라 TUN을 켜세요. TUN을 켠 뒤에만 연결이 안 되고 바인딩 오류가 없다면 DNS와 경로를 확인하고 mixed-port를 계속 바꾸지 마세요.

포트 변경이나 서비스 재설치로 해결되지 않으면 직접 연결을 복원하고 증거 보존하기

포트를 변경하거나 서비스를 재설치한 뒤 문제가 더 심해지면 시스템 프록시와 TUN을 끄고 기기를 직접 연결 상태로 유지하세요. 이전 포트가 해제된 경우에만 원래 포트로 되돌리세요. 서비스 재설치에 실패하면 서비스 모드를 끈 상태로 두고 시스템 파일을 계속 직접 삭제하지 마세요.

공식 채널에 제보할 때는 로컬에서 확인한 내용을 관찰 결과로 적고, 관리자를 대신해 원인을 단정하지 마세요. 전체 설정, 구독 URL, 노드 비밀번호, 컨트롤러 secret 또는 마스킹하지 않은 로그를 업로드하지 마세요.

공식 issue를 제출하기 전에 보관할 정보

  • Clash Verge Rev의 전체 버전과 설치 출처
  • 운영체제 버전 및 CPU 아키텍처
  • 서비스 모드, TUN 및 시작 시 자동 실행 사용 여부
  • GUI가 정상 종료됐는지, 충돌했는지 또는 강제 종료됐는지
  • 첫 번째 address already in use 로그와 실제 포트
  • 수신 프로세스의 PID, 소유자, 시작 시간 및 프로그램 경로
  • 클라이언트 종료 후 포트가 해제되는지와 서비스 복구 후 재현되는지

참고 자료