연결 문제 해결 · 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, Bind failed 또는 Start Mixed(http+socks) server error가 명확히 나타나는 경우만 다룹니다. 문제 보고서의 7890과 1053은 예시일 뿐이므로 점검할 때는 자신의 로그에 나온 mixed-port, DNS 또는 external-controller 포트를 사용해야 합니다.

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, 포트 설정과 오류 로그를 저장하고, 원인을 찾는 동안 구독을 동기화하거나 규칙을 변경하지 마세요.

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

점검을 시작하기 전에

  1. 실제 포트 기록

    첫 번째 bind 오류에서 mixed-port, DNS 또는 external-controller의 구체적인 포트를 기록합니다.

  2. 기본 네트워크 복구

    TUN과 시스템 프록시를 끄고 클라이언트가 중지된 상태에서도 기기가 직접 연결되는지 확인합니다.

  3. 클라이언트 정상 종료

    먼저 트레이에서 완전히 종료하고 몇 초 기다리세요. 바로 강제 종료하지 마세요.

  4. 설정 및 로그 저장

    현재 Profile, 포트 값과 첫 오류를 보관하고, 공개적으로 제보하기 전에 구독 URL, 비밀번호 및 secret을 숨깁니다.

운영체제별로 어떤 프로세스가 수신 중인지 확인

포트 점유는 프로세스 이름을 맞히는 문제가 아닙니다. 먼저 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임을 확인한 경우에만 단일 프로세스를 종료하세요. 먼저 정상 종료를 사용한 뒤 포트를 다시 조회하세요. 범위가 넓은 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. 클라이언트 항목 사용

    서비스 모드 설정에서 서비스를 제거, 복구 또는 다시 설치하고 권한 안내와 작업이 완료될 때까지 기다립니다.

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

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

  5. 기능 하나만 복구

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

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

Clash Verge Rev를 시작하기 전에 대상 포트가 비어 있는지 확인한 뒤, 시작 후에는 예상한 코어 하나만 수신 중인지 확인하세요. 그런 다음 예시 포트를 현재 mixed-port로 바꾸고 로컬 프록시를 통해 실제 HTTPS 요청을 보낸 후 Connections에서 기록을 확인합니다.

시스템 프록시 경로 검증이 끝난 뒤에만 TUN을 켜세요. TUN을 켤 때만 인터넷이 끊기고 로그에 바인딩 오류가 없다면 mixed-port를 계속 바꾸지 말고 TUN, DNS 및 라우팅을 점검해야 합니다.

현재 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에 테스트 요청이 표시됨
  • 클라이언트를 정상 종료하면 포트가 해제되고 시스템 프록시도 복구됨
  • 다시 시작하거나 로그인한 뒤 두 번째 잔류 코어가 나타나지 않음

실패하면 되돌리고 유효한 증거 제출

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

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

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

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

참고 자료