먼저 지원 중단이 어느 계층에서 발생했는지 판단하기
Clash 관련 프로젝트는 크게 세 계층으로 나뉩니다: 코어, GUI 클라이언트, 설정과 규칙 세트. 코어는 프로토콜 파싱, DNS, TUN 라우팅을 담당하고, 클라이언트는 인터페이스, 구독 관리, 시스템 프록시 스위치를 담당합니다. 설정 계층은 profile 파일과 규칙 세트 파일입니다. 세 계층은 YAML 설정과 로컬 포트로 통신하므로 인터페이스만 그대로라면 어느 계층이든 따로 교체할 수 있습니다.
지원 중단이 어느 계층에서 일어났는지 먼저 확인한 뒤 설정을 건드릴지 결정하세요. 판단 기준은 release 태그의 게시 시각과 기본 브랜치의 마지막 커밋 시각이며, star 수나 다운로드 수와는 무관합니다.
| 계층 | 대표 신호 | 실제 영향 | 대응 방식 |
|---|---|---|---|
| 코어 | 저장소가 아카이브됨, 마지막 release가 12개월 이상 지남; 원본 Clash는 v1.18.0(2023년 8월)에서 멈춤 | 새 프로토콜과 DNS 기능이 더 이상 병합되지 않고, 새 규칙 세트 형식을 파싱할 수 없음 | 코어 교체, profile 대부분 재사용 가능 |
| 클라이언트 | 9개월 이상 새 release 없음, 이슈에 장기간 응답 없음 | 인터페이스와 구독 관리가 구버전에 머물고, TUN이 새 OS 버전과 호환되지 않을 수 있음 | 클라이언트 교체, 구독과 profile은 그대로 가져오기 |
| 규칙 세트 | 규칙 저장소에 6개월간 커밋 없음 | 도메인 목록과 IP 목록이 점차 낡아 분기 정확도 하락 | 규칙 소스 교체, rule-providers의 url 변경 |
- 클라이언트 '설정' → '버전 정보' 또는 '정보'에서 인터페이스 버전과 코어 버전 두 가지를 기록합니다. 예: v1.18.0, v1.19.5.
- 해당 저장소의 releases 페이지를 열어 최신 tag의 날짜를 확인하고, 정말로 업데이트가 멈췄는지 점검합니다.
- profile 디렉터리를 열어 설정이 구독 링크에서 온 것인지 로컬 파일인지 확인합니다. 전자는 재생성할 수 있지만 후자는 반드시 먼저 백업해야 합니다.
클라이언트 계층만 지원 중단된 경우 변경이 가장 적습니다
기존 profile과 규칙 세트를 그대로 두고 유지보수 중인 인터페이스로 바꾸면 됩니다. 코어, 구독, 규칙 세트는 손댈 필요가 없고 마이그레이션 시간은 보통 10분 이내입니다.
마이그레이션 전에 설정 자산 내보내기
설정 자산은 세 종류입니다: 구독 링크, 로컬 profile 파일, 클라이언트에서 직접 수정한 항목(포트, TUN 스위치, 자동 시작, 규칙 재정의). 앞의 두 가지는 완전히 내보낼 수 있지만 세 번째는 항목별로 기록하는 수밖에 없습니다. 내보내기는 프록시를 끈 상태에서 해야 중간에 네트워크가 끊겨 구독 업데이트가 실패하는 일을 피할 수 있습니다.
플랫폼별 profile 기본 디렉터리
| 플랫폼 | 클라이언트 설정 디렉터리 | 코어 기본 디렉터리 |
|---|---|---|
| Windows | %APPDATA%\io.github.clash-verge-rev.clash-verge-rev\profiles\, 구버전 Verge는 %APPDATA%\clash-verge\ | %USERPROFILE%\.config\clash\ |
| macOS | ~/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/profiles/ | ~/.config/mihomo/ |
| Linux | ~/.config/io.github.clash-verge-rev.clash-verge-rev/profiles/ | ~/.config/mihomo/ 또는 /etc/mihomo/ |
| Android | 앱 내 '프로필' 메뉴의 내보내기 항목, 내보낸 파일은 보통 /sdcard/Download/에 저장됩니다 | 앱 전용 디렉터리로, root 권한 없이는 직접 읽을 수 없습니다 |
내보내기 단계
- 시스템 프록시와 TUN 끄기: '설정' → '시스템 프록시' 끄기, '설정' → 'TUN 모드' 끄기.
- '구독' 페이지에서 대상 profile을 마우스 오른쪽 버튼으로 클릭 → '구독 링크 복사'를 실행하고 로컬 텍스트 파일에 붙여넣어 저장합니다.
- 로컬 파일형 profile: providers 하위 디렉터리를 포함해 profiles 디렉터리 전체를 백업 드라이브로 복사합니다.
- 포트 기록: 혼합 포트 7890, 컨트롤 포트 127.0.0.1:9090, DNS 리스닝 1053.
- 규칙 세트 출처 기록: rule-providers 각 항목의 url, interval, path.
최소한으로 이전 가능한 설정 예시
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
unified-delay: true
tcp-concurrent: true
dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- https://223.5.5.5/dns-query
- https://1.1.1.1/dns-query
proxy-providers:
main:
type: http
url: "https://sub.example.com/link/8f3c1a2b?flag=meta"
interval: 3600
path: ./providers/main.yaml
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 300
여기서 unified-delay와 tcp-concurrent는 mihomo 필드라 원본 Clash가 읽으면 바로 파싱 오류가 납니다. 마이그레이션 시 대상 코어 버전에 따라 유지하거나 삭제하고, 나머지 필드는 양쪽에서 공통으로 쓸 수 있습니다.
코어 교체: 원본 Clash에서 mihomo로
원본 Clash 코어는 v1.18.0에서 멈췄고, Clash.Meta 브랜치는 2024년에 mihomo로 이름을 바꾸며 v1.19 계열까지 진행되었습니다. TUN 스택, DNS, 규칙 세트 형식은 지금도 업데이트되고 있습니다. 두 코어는 대부분의 설정 필드 이름이 같고, 차이는 최근 2년간 추가된 기능에 집중됩니다.
| 설정 필드 | 원본 Clash v1.18.0 | mihomo v1.19.x | 마이그레이션 작업 |
|---|---|---|---|
mixed-port | 지원 | 지원 | 변경 불필요 |
tun.stack | system / gvisor 지원 | mixed 값 추가 | 기존 값 유지 가능 |
sniffer | 미지원 | 지원 | 새로 추가 가능, fake-ip로 가려진 도메인 복원에 사용 |
rule-providers의 format: mrs | 미지원 | 지원 | 메모리 사용량을 줄이려면 mrs로 변경 가능 |
geodata-mode、geox-url | 미지원 | 지원 | geo 파일이 필요하면 추가 |
proxy-groups의 lazy | 미지원 | 지원 | 선택 사항, 유휴 상태에서 헬스 체크 감소 |
sub-rule(1.19 신규) | 미지원 | 지원 | 구버전 코어에서 파싱 오류 발생 |
역방향 호환은 대체로 성립합니다: mihomo는 원본 Clash의 profile을 그대로 읽지만, 반대 방향은 추가된 필드 때문에 파싱에 실패합니다. 따라서 마이그레이션 방향은 구버전 코어에서 mihomo로 가는 한 방향뿐이고 반대로는 갈 수 없습니다.
Linux에서 코어 교체 명령줄
# 기존 코어 서비스 중지
sudo systemctl stop clash
# mihomo 코어 다운로드 및 설치 (amd64 예시)
curl -LO https://github.com/MetaCubeX/mihomo/releases/download/v1.19.5/mihomo-linux-amd64-v1.19.5.gz
gunzip mihomo-linux-amd64-v1.19.5.gz
sudo install -m 0755 mihomo-linux-amd64-v1.19.5 /usr/local/bin/mihomo
# 교체 적용 확인
mihomo -v
# 기존 설정으로 포그라운드 시험 실행, 필드 파싱 오류 확인
mihomo -d /etc/mihomo -f /etc/mihomo/config.yaml
시험 실행 중에는 포그라운드 출력을 유지하고, 로그에 parse error 같은 필드 오류가 없는지 확인한 뒤 종료하고 systemd에 맡깁니다. 비 root 사용자로 실행하려면 네트워크 권한을 추가로 부여해야 합니다:
[Unit]
Description=mihomo
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
LimitNOFILE=1048576
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
같은 경로에 서로 다른 코어의 바이너리를 반복해서 덮어쓰지 마세요
구버전 코어 프로세스가 백그라운드에서 계속 실행되며 9090 포트를 점유하고 있을 수 있고, 이 경우 교체 후 '설정이 적용되지 않은' 것처럼 보입니다. 프로세스가 종료되었는지 먼저 확인한 뒤 바이너리를 덮어쓰세요.
플랫폼별 대체 클라이언트 선택
대체 클라이언트를 고를 때는 세 가지 기준을 봅니다: 코어 다운로드와 업데이트 채널이 내장되어 있는지, profile 디렉터리를 직접 가져올 수 있는지, 시스템 프록시와 TUN 두 모드를 모두 제공하는지. 세 가지를 모두 충족하는 인터페이스가 마이그레이션 비용이 가장 낮습니다. 구독과 포트 습관을 그대로 옮길 수 있기 때문입니다.
| 플랫폼 | 선택 가능 클라이언트 | 코어 | 설정 가져오기 방식 |
|---|---|---|---|
| Windows | Clash Verge Rev、FlClash、Clash Nyanpasu | mihomo | 구독 링크를 붙여넣거나 yaml 파일을 창에 끌어다 놓기 |
| macOS | Clash Verge Rev、FlClash、Mihomo Party | mihomo | 위와 동일, TUN을 처음 켤 때는 시스템 설정에서 승인 필요 |
| Android | FlClash、Clash Meta for Android | mihomo | 앱 내에서 구독을 붙여넣거나 로컬 파일에서 가져오기 |
| iOS | App Store에서 Network Extension을 제공하는 클라이언트, 예: Shadowrocket, Stash, Loon | 자체 코어 | 대부분 구독 링크만 받고 전체 yaml은 파싱하지 않음 |
| Linux | Clash Verge Rev(AppImage / deb / rpm)、mihomo + systemd | mihomo | 설정 파일이 /etc/mihomo에 바로 저장됨 |
iOS는 지역 차이를 주의해야 합니다: 이런 클라이언트는 중국 본토 App Store에서는 사용할 수 없으므로 다른 지역 계정으로 전환해 내려받아야 합니다. 또한 대부분 전체 yaml을 파싱하지 않고 구독 링크만 받으므로, 로컬에서 직접 작성한 규칙은 미리 구독 쪽에 정리해 두어야 합니다. 그렇지 않으면 마이그레이션 후 규칙이 빠집니다.
구버전 클라이언트에서 설정 옮기는 순서
- 새 클라이언트를 먼저 설치하고, 언제든 비교할 수 있도록 구버전은 아직 삭제하지 않습니다.
- 구독 링크를 가져와 profile 생성이 끝나고 노드 목록이 나타날 때까지 기다립니다.
- 백업 기록과 대조하며 항목별로 되돌립니다: 혼합 포트, 컨트롤 포트, TUN 스택 유형, 자동 시작, 시스템 프록시 모드.
- 새 클라이언트가 연결되면 구버전 클라이언트를 중지하고 백그라운드 서비스를 삭제합니다. Windows의 서비스 모드, macOS의 권한 helper는 각각 따로 삭제해야 하며, 그렇지 않으면 포트가 계속 점유된 채 남습니다.
마이그레이션 후 검증 체크리스트
아래 열 가지를 순서대로 진행하면 대부분의 마이그레이션 잔여 문제를 확인할 수 있습니다. 명령에 쓰인 포트는 기본값 기준이며, 포트를 바꿨다면 실제 값으로 대체하세요.
- 코어 버전:
curl -s http://127.0.0.1:9090/version의 응답에서 version 필드가 설치한 tag와 일치해야 합니다. - 프록시 경로:
curl -I -x http://127.0.0.1:7890 https://www.gstatic.com/generate_204가HTTP/2 204를 반환하면 연결이 정상입니다. - DNS 확인: Windows는
nslookup www.google.com 127.0.0.1, macOS와 Linux는dig @127.0.0.1 -p 1053 www.google.com을 사용합니다. 198.18.0.0/16 대역 주소가 반환되면 fake-ip가 동작하는 것입니다. - 규칙 매칭: 인터페이스의 '연결' 페이지를 열고 국내 사이트에 접속해 DIRECT로 가는지, 해외 사이트에 접속해 프록시 그룹으로 들어가는지 확인합니다.
- TUN 라우팅: Windows는
route print -4로 TUN 어댑터와 198.18.0.0 대역을 확인하고, Linux는ip route show table all | grep 198.18을 실행합니다. - 포트 점유: Windows는
netstat -ano | findstr :9090, macOS와 Linux는lsof -i :9090으로 확인해 프로세스 하나만 리스닝하는지 봅니다. - 구독 업데이트: 수동으로 한 번 업데이트를 실행했을 때 로그에 403, 404 또는 TLS 핸드셰이크 실패가 나타나지 않아야 합니다.
- 규칙 세트 저장: 규칙 세트 디렉터리 파일 크기가 0이 아니고 수정 시각이 방금인지 확인합니다.
- 자동 시작: 시스템을 한 번 재부팅해 클라이언트가 자동으로 실행되고 시스템 프록시 상태가 재부팅 전과 같은지 확인합니다.
- 폴백 경로: 프록시 노드를 끊고 DIRECT 규칙에 해당하는 사이트가 여전히 접속되는지 확인합니다. 분기가 전부 프록시 그룹으로 몰리지 않았다는 뜻입니다.
자주 발생하는 마이그레이션 문제와 대처
구독 업데이트가 403 또는 404를 반환
대부분 User-Agent 불일치입니다. 일부 서버는 UA에 따라 다른 형식을 반환하는데, 새 코어의 기본 UA가 구버전 클라이언트와 다르면 패널이 바로 거부합니다. 먼저 클라이언트의 구독 설정에서 UA 드롭다운 항목을 찾아 clash로 바꿔 보세요. 그다음으로 링크 자체가 만료된 경우이므로 패널에서 다시 복사합니다.
규칙 세트 다운로드 실패
geodata-mode: true일 때는 geoip.dat, geosite.dat 또는 해당 mmdb 파일이 필요합니다. mihomo가 작업 디렉터리로 자동 다운로드를 시도하지만 네트워크가 제한되면 실패합니다. 파일을 직접 작업 디렉터리에 넣거나 geox-url을 접근 가능한 주소로 바꾸세요.
TUN 모드가 시작되지 않음
- Windows: 서비스 모드를 먼저 설치해야 하며, 처음 설치할 때 wintun.dll도 함께 설치됩니다. 구버전 서비스를 설치한 적이 있다면 설정에서 먼저 삭제한 뒤 다시 설치하세요.
- macOS: 처음 켤 때 시스템 설정에서 네트워크 확장 또는 권한 helper를 승인해야 합니다. 한 번 거부하면 설정에서 권한을 재설정한 뒤 다시 시도해야 합니다.
- Linux: 비 root로 실행하려면 바이너리에 네트워크 권한을 부여합니다.
sudo setcap cap_net_admin,cap_net_bind_service+ep /usr/local/bin/mihomo
실행 직후 종료되거나 설정이 적용되지 않음
먼저 9090 포트를 구버전 프로세스가 점유하고 있는지 확인하고, 설정 파일의 들여쓰기와 인코딩을 점검합니다. YAML을 Tab으로 들여쓰면 바로 파싱에 실패하므로 파일은 UTF-8(BOM 없음)로 저장하세요. 로그 레벨을 log-level: debug로 올리면 로그에 구체적인 줄 번호가 표시되어 설정 파일을 한 줄씩 대조하는 것보다 훨씬 빠릅니다.
마이그레이션의 본질은 세 가지를 새 껍데기로 옮기는 것입니다: 구독 링크, profile 파일, 포트와 모드 습관. 이 세 가지가 있으면 클라이언트를 몇 번 바꿔도 일상적인 사용에 영향이 없습니다. 반대로 인터페이스의 스위치 위치만 외워 두면 다음에 지원 중단을 만났을 때 처음부터 다시 헤매야 합니다.