Clash YAML
설정 파일 참고서
최상위 구조부터 시작해 포트, 실행 모드, DNS, 프록시 노드, 정책 그룹, 분기 규칙과 오버라이드 병합을 항목별로 살펴봅니다. 예시는 mihomo 호환 문법을 사용하며 필드 간 의존 관계와 자주 발생하는 경계 사례도 설명합니다.
사용 가이드에서는 설치, 구독 가져오기, 노드 선택, 시스템 프록시 활성화까지의 기본 흐름을 다룹니다. 이 페이지에서는 설정을 왜 그렇게 작성하는지, 특정 필드에 문제가 생겼을 때 어디를 확인해야 하는지를 설명합니다. 처음 사용하는 경우 먼저 빠른 시작을 완료한 다음 실제 문제에 맞춰 이 가이드를 참고하세요. 클라이언트를 바꾸려면 다운로드 센터에서 플랫폼과 아키텍처를 확인할 수 있으며, 그래픽 클라이언트로는 Clash Plus를 우선 권장합니다.
설정 파일은 YAML 들여쓰기 규칙을 따릅니다. 이 문서의 예시에 사용된 서버 도메인, 비밀번호와 토큰은 모두 명확한 테스트 값이므로 복사한 뒤 반드시 자신의 유효한 정보로 바꿔야 합니다. 편집 전에 원본 파일을 보관하고, 한 부분을 수정한 뒤 즉시 설정을 검사하거나 다시 불러오세요. 서로 관련 없는 모듈을 한 번에 여러 개 바꾸지는 않는 것이 좋습니다.
YAML 구조와 들여쓰기 규칙
최상위 키로 이해하는 설정 로드 순서
실행 가능한 Clash 설정은 일반적으로 공통 설정, DNS, 프록시 노드, 프록시 제공자, 정책 그룹, 규칙 제공자와 규칙 목록으로 구성됩니다. 이 항목들은 모두 YAML 최상위에 있으며 이름으로 서로를 참조합니다. 커널은 파일을 읽을 때 먼저 YAML 문법을 해석하고, 이어서 노드와 정책 그룹을 구성한 뒤 규칙 대상이 존재하는지 확인합니다. 설정 순서는 보통 해석에 영향을 주지 않지만 ‘기본 설정, DNS, 노드, 정책 그룹, 규칙’ 순서로 배치하면 직접 점검하기 쉽고 아직 정의되지 않은 객체를 참조할 때의 혼란도 줄일 수 있습니다.
최소 설정이라고 해서 포트 하나만 있으면 되는 것은 아닙니다. 규칙 모드를 사용한다면 사용할 수 있는 정책 대상과 마지막 규칙도 최소한 필요합니다. 정책 그룹이 노드 이름을 참조한다면 해당 노드가 반드시 존재해야 하며, RULE-SET을 사용한다면 대응하는 rule-providers 항목도 있어야 합니다. 구독 생성기가 이 모듈을 자동으로 채우는 경우가 많지만, 수동 설정에서는 참조 관계가 완전히 연결되는지 직접 확인해야 합니다. 이름은 대소문자를 구분합니다. 한글, 공백과 기호를 사용할 수는 있지만 오버라이드 스크립트가 문자열을 찾지 못하는 일을 막으려면 일관되게 유지하세요.
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- https://dns.example/dns-query
proxies:
- name: "테스트 노드"
type: ss
server: proxy.example.com
port: 443
cipher: aes-128-gcm
password: "your-password"
proxy-groups:
- name: "노드 선택"
type: select
proxies:
- "테스트 노드"
- DIRECT
rules:
- DOMAIN-SUFFIX,example.com,노드 선택
- MATCH,DIRECT
들여쓰기, 목록과 데이터 형식
YAML은 공백으로 계층을 표현하며, 각 단계에 공백 두 칸을 사용하는 것을 권장합니다. 들여쓰기에 탭을 섞으면 안 됩니다. 같은 수준의 키는 정렬해야 하고 목록 항목은 하이픈과 공백으로 시작합니다. 위 예시에서 dns는 매핑, nameserver는 목록, proxies는 여러 노드 매핑으로 이루어진 목록입니다. 공백 하나가 더 들어가면 필드가 잘못된 객체 안으로 이동할 수 있고, 하이픈 하나가 빠지면 목록이 일반 문자열로 바뀔 수 있습니다. 편집기가 공백 표시를 지원한다면 문제 해결 시 해당 기능을 켜세요.
불리언 값은 true 또는 false로 작성하고 포트는 따옴표 없는 정수로 작성해야 합니다. 노드 이름, 정책 이름과 비밀번호는 큰따옴표로 감싸는 것이 좋습니다. 특히 콜론, 샵, 쉼표, 별표, 앞뒤 공백 또는 불리언 값처럼 보이는 단어가 포함된 경우에는 더욱 그렇습니다. 샵은 주석의 시작을 뜻하므로, 따옴표 없는 비밀번호에 샵이 들어가면 그 뒤쪽이 주석으로 해석됩니다. 숫자로만 된 비밀번호도 앞자리 0이 다르게 처리되는 일을 막기 위해 따옴표로 감싸는 편이 좋습니다. 값이 없는 항목을 임의로 빈 문자열로 작성하지 말고, 필요하지 않은 선택 필드는 보통 줄 전체를 삭제하세요.
따옴표, 앵커와 중복 키
큰따옴표는 백슬래시 이스케이프를 처리하고, 작은따옴표는 대체로 원문을 그대로 보존합니다. 일반적인 이름에는 큰따옴표가 가장 직관적입니다. 정규 표현식, Windows 경로 또는 백슬래시가 많은 내용은 이스케이프 결과를 특히 주의해서 확인해야 합니다. YAML 앵커로 매핑 일부를 재사용할 수 있지만 클라이언트마다 사전 처리 방식이 달라 앵커 동작이 바뀔 수 있습니다. 여러 클라이언트에서 사용할 구독 파일이라면 복잡한 앵커와 병합 키에 의존하기보다 필드를 완전하게 작성하세요.
같은 매핑 안에 중복 키가 있으면 위험합니다. 예를 들어 최상위에 dns를 두 번 작성했을 때 어떤 파서는 나중 값을 사용하고, 어떤 도구는 즉시 오류를 냅니다. 결과를 특정 동작에 의존해서는 안 됩니다. 구독 오버라이드에서 흔한 문제는 새 모듈을 파일 끝에 추가하면서 기존 모듈을 삭제하지 않는 것입니다. 검사할 때는 최상위 키가 한 번만 나오는지 검색한 뒤, 오버라이드 조각만 보지 말고 클라이언트가 최종 생성한 실행 설정을 확인하세요.
설정 파일 확장자는 보통 .yaml 또는 .yml이며 문법은 동일합니다. 파일 인코딩은 UTF-8을 사용하는 것이 좋습니다. 그래야 정책 그룹의 한글 이름이 운영체제에 따라 깨지지 않습니다. 줄바꿈 형식은 대체로 클라이언트가 처리하지만, Windows에서 편집한 파일을 Linux 서비스에서 실행할 때는 보이지 않는 제어 문자가 섞이지 않았는지 확인해야 합니다. 먼저 파일이 YAML로 해석되는지 보장한 다음 노드 연결성과 규칙 적중을 확인하세요. 이것이 전체 문제 해결의 첫 단계입니다.
공통 필드: 포트, 모드와 제어 인터페이스
수신 포트의 역할 구분
port는 HTTP 프록시 수신을 제공하고, socks-port는 SOCKS5 수신을 제공하며, mixed-port는 하나의 포트에서 HTTP와 SOCKS5를 동시에 받습니다. 데스크톱 그래픽 클라이언트는 보통 mixed-port 하나만 사용하며 시스템 프록시가 자동으로 이 포트를 가리킵니다. 다른 프로그램에서 SOCKS5 주소를 명시적으로 요구한다면 socks-port를 별도로 설정할 수 있습니다. 여러 수신 포트가 같은 포트 번호를 사용하거나 시스템의 다른 서비스와 충돌해서는 안 됩니다.
redir-port와 tproxy-port는 주로 Linux 게이트웨이, 라우터 또는 투명 프록시 규칙에 사용됩니다. 데스크톱 사용자는 ‘더 많은 트래픽을 처리한다’는 이유만으로 임의로 활성화하지 않는 것이 좋습니다. TUN 모드는 별도의 가상 네트워크 카드와 라우팅 처리 경로를 사용하며, 단순히 수신 포트를 하나 추가하는 것과도 다릅니다. 두 가지 트래픽 가로채기 방식을 비교하려면 TUN 모드와 시스템 프록시의 차이를 참고하고, 먼저 트래픽이 어디로 커널에 들어오는지 확인한 뒤 관련 필드를 선택하세요.
mixed-port: 7890
allow-lan: false
bind-address: "*"
mode: rule
log-level: info
ipv6: false
external-controller: 127.0.0.1:9090
secret: "your-controller-secret"
profile:
store-selected: true
store-fake-ip: true
| 필드 | 용도 | 일반 설정 | 확인할 점 |
|---|---|---|---|
mixed-port |
HTTP와 SOCKS5 요청을 모두 수신 | 데스크톱 클라이언트는 로컬 포트 하나만 유지 | 다른 프로세스가 사용 중인지 확인 |
allow-lan |
LAN 기기의 연결 허용 | 현재 기기에서만 사용할 때는 false로 설정 | 활성화 후 방화벽도 함께 확인 |
bind-address |
수신 주소 제한 | LAN 공유와 함께 사용 | 제어 인터페이스를 프록시 포트로 착각하지 않기 |
mode |
규칙, 전체 또는 직접 연결 처리 결정 | 일상적인 사용에는 보통 rule | 클라이언트 화면이 파일 값을 덮어쓸 수 있음 |
LAN 접근과 바인딩 주소
allow-lan은 다른 기기가 현재 기기의 프록시 포트를 통해 연결할 수 있는지 결정합니다. false로 설정하면 단일 기기 사용에 적합합니다. true로 설정한 뒤에는 운영체제 방화벽, 수신 주소와 LAN 격리 설정도 확인해야 합니다. LAN 접근을 허용한다고 해서 휴대폰이나 TV가 자동으로 프록시를 사용하게 되는 것은 아닙니다. 대상 기기에서 Clash가 실행 중인 기기의 LAN 주소와 수신 포트를 직접 입력해야 합니다. 주소가 바뀌면 연결이 끊길 수 있으므로 장기간 공유할 때는 호스트에 안정적인 LAN 주소를 지정하세요.
bind-address는 수신 범위를 제한합니다. 일부 클라이언트는 ‘LAN 연결 허용’ 스위치에 따라 이 필드를 자동으로 생성하므로, 시작할 때 파일의 값이 화면 설정으로 덮어써질 수 있습니다. 문제를 확인할 때는 실제 수신 주소를 확인해야 합니다. 127.0.0.1만 수신하면 다른 기기가 접근할 수 없고, 모든 인터페이스에서 수신하면 제어 인터페이스와 프록시 포트가 신뢰할 수 없는 네트워크에 직접 노출되지 않도록 해야 합니다. 프록시 수신과 외부 제어 인터페이스는 서로 다른 서비스이므로 혼동하지 마세요.
실행 모드, 로그와 상태 저장
mode: rule은 rules를 위에서부터 순서대로 매칭하는 일상 설정의 기본 모드입니다. global은 트래픽을 전체 정책으로 보내 특정 노드의 사용 가능 여부를 임시로 확인할 때 적합합니다. direct는 요청을 직접 연결해 문제가 프록시 경로 때문인지 확인할 때 사용합니다. 그래픽 클라이언트의 모드 버튼은 실행 중 상태를 바꾸는 경우가 많아 구독 원본 파일에 다시 기록되지 않을 수 있습니다. 따라서 파일의 mode만 보지 말고 클라이언트의 현재 화면도 확인하세요.
log-level은 보통 info를 사용하고, 문제를 해결할 때만 일시적으로 debug로 높인 뒤 복원하세요. 로그가 지나치게 많으면 판단을 방해할 수 있습니다. ipv6은 커널이 IPv6 관련 기능을 처리할지 결정하지만, 로컬 네트워크에 IPv6 라우팅이 없는 문제를 해결해 주지는 않습니다. 활성화 후 연결이 계속 대기한다면 DNS가 IPv6 주소를 반환하는지, 시스템에 사용 가능한 IPv6 출구가 있는지, 규칙이 해당 주소를 포함하는지 확인하세요.
external-controller는 화면과 커널이 통신할 제어 주소를 제공하며, 보통 로컬 루프백 주소에 바인딩합니다. secret은 제어 인터페이스의 접근 인증 정보이므로 예시 값은 반드시 바꿔야 합니다. 이는 프록시 노드 비밀번호가 아니며 원격 연결에도 사용되지 않습니다. profile.store-selected는 정책 그룹 선택을 저장하고, profile.store-fake-ip는 Fake-IP 매핑 상태를 저장합니다. 구독을 업데이트할 때마다 정책 선택이 초기화된다면 YAML만 수정하지 말고 클라이언트 자체의 영속화 옵션도 확인하세요.
DNS 설정: 해석 경로와 Fake-IP
먼저 누가 DNS 조회를 요청하는지 구분하기
DNS 설정은 도메인을 주소로 변환하는 방식과 규칙이 도메인을 올바른 단계에서 식별할 수 있는지에 영향을 줍니다. 브라우저가 시스템 DNS, 보안 DNS 또는 자체 캐시를 사용할 수 있고, 운영체제도 이전 결과를 캐시할 수 있습니다. TUN 모드에서는 더 많은 DNS 요청이 커널로 전달될 수 있습니다. ‘노드는 연결되지만 웹사이트가 열리지 않는’ 상황에서 즉시 모든 노드를 바꾸지 마세요. 먼저 요청이 Clash DNS로 들어오는지, 해석 결과에 접근할 수 있는지, 규칙이 최종적으로 어떤 정책을 선택했는지 확인해야 합니다.
dns.enable은 내장 DNS 모듈을 활성화합니다. listen은 DNS 서비스의 수신 주소를 지정하며, 일반적인 그래픽 클라이언트에서는 보통 클라이언트가 관리합니다. 수동으로 LAN에 개방하기 전에는 방화벽의 영향을 이해해야 합니다. nameserver는 주요 해석기로 일반 주소와 DoH 주소를 모두 입력할 수 있습니다. 목적 없이 해석기를 너무 많이 추가하면 응답 차이 때문에 문제 해결이 더 어려워질 수 있습니다.
dns:
enable: true
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
respect-rules: true
default-nameserver:
- 223.5.5.5
- 1.1.1.1
nameserver:
- https://dns.example/dns-query
proxy-server-nameserver:
- https://resolver.example/dns-query
direct-nameserver:
- 223.5.5.5
fake-ip-filter:
- "*.lan"
- "*.local"
- "time.*.com"
- "+.stun.*.*"
nameserver 유형별 역할
default-nameserver는 주로 DoH 또는 DoT 서버 자체의 도메인을 해석하며, 시작 단계의 기본 해석기로도 사용할 수 있습니다. ‘해석기를 사용하려면 먼저 해석기 도메인을 해석해야 하는’ 순환을 피하려면 보통 직접 접근할 수 있는 IP 주소를 입력합니다. 모든 업무 도메인의 기본 출구를 뜻하는 것은 아니므로, 주소를 많이 추가하는 것으로 올바른 기본 DNS 설정을 대신할 수 없습니다.
nameserver는 일반 도메인 조회를 담당합니다. proxy-server-nameserver는 프록시 노드 서버의 도메인을 별도로 해석해, 아직 프록시 연결이 수립되지 않은 상태에서 노드 도메인 해석이 그 연결에 의존하는 일을 막을 수 있습니다. 노드 주소가 IP 자체라면 영향이 작지만, 주소가 도메인이고 시작할 때 계속 해석 실패가 발생한다면 집중적으로 확인해야 합니다. direct-nameserver는 직접 연결 도메인의 해석에 사용할 수 있으며, 규칙을 따르는 DNS 경로와 함께 사용하면 직접 연결 대상과 프록시 대상에 서로 다른 해석 정책을 적용할 수 있습니다.
respect-rules는 DNS 조회가 분기 규칙을 더 밀접하게 따르도록 하지만 정책 그룹과 해석기 설정에 의존합니다. 잘못된 규칙 대상, 사용할 수 없는 프록시 해석기 또는 순환 참조로 인해 노드를 사용할 수 있기 전까지 DNS가 프록시를 기다릴 수 있습니다. 활성화한 뒤 모든 도메인의 해석이 멈추면 단순한 설정으로 되돌리세요. 접근 가능한 nameserver 하나만 남기고 복잡한 분기를 끈 다음 기본 해석이 복구되는지 확인하고 전용 해석기를 하나씩 추가하세요.
Fake-IP와 redir-host의 차이
enhanced-mode: fake-ip는 예약된 주소 범위의 임시 주소를 도메인에 반환하고, 커널이 ‘임시 주소와 원래 도메인’의 매핑을 관리하게 합니다. 장점은 커널이 도메인 정보를 일찍 보존해 규칙 판단이 직접적이고, 일부 앱이 도메인 규칙을 우회하는 현상도 줄일 수 있다는 점입니다. fake-ip-range에는 전용 예약 주소 범위를 사용해야 하며 실제 LAN, 회사 네트워크 또는 가상 머신 네트워크와 겹치면 안 됩니다. LAN 주소 충돌이 발생하면 일부 내부 네트워크 서비스만 열리지 않고 일반 인터넷 접속은 정상인 것처럼 보일 수 있습니다.
redir-host는 실제 해석 주소를 반환하므로 기존 경로와의 호환성이 높지만, 투명한 트래픽 가로채기 환경에서는 원래 도메인 정보를 더 일찍 잃을 수 있습니다. 어떤 모드를 선택할지는 특정 방식이 항상 더 빠르다고 가정하지 말고 앱 호환성과 가로채기 방식에 따라 결정해야 합니다. 데스크톱 클라이언트에서 Fake-IP를 사용한 뒤 프린터, LAN 기기, 시간 동기화 또는 게임의 LAN 검색만 이상하다면 먼저 fake-ip-filter를 보완하세요. DNS 모듈 전체를 바로 끌 필요는 없습니다.
fake-ip-filter에 포함된 도메인은 Fake-IP를 우회해 실제 주소를 반환합니다. 필터 범위는 최대한 정확하게 지정해야 합니다. 지나치게 넓은 와일드카드를 추가하면 많은 도메인이 Fake-IP 처리를 받지 못해 ‘규칙을 작성했지만 적중이 불안정한’ 상황이 생길 수 있습니다. 항목을 추가한 뒤에는 클라이언트 DNS 캐시를 삭제하거나 커널을 재시작하세요. 기존 매핑이 남아 있을 수 있기 때문입니다. 시스템과 브라우저에도 별도 캐시가 있으므로 필요하면 각각 새로고침해야 합니다.
DNS 장애의 단계별 점검
첫 번째 단계에서는 설정을 불러올 수 있는지 확인하고, 두 번째 단계에서는 현재 네트워크에서 해석기 주소에 접근할 수 있는지 확인합니다. 세 번째 단계에서는 노드 서버 도메인이 해석되는지, 네 번째 단계에서는 업무 도메인 규칙이 맞는지 확인한 뒤 마지막으로 앱 캐시를 점검하세요. 로그에 시간 초과가 표시되면 UDP DNS, DoH 연결 수립, 프록시 노드 연결 중 어느 단계인지 구분해야 합니다. 주소를 얻었지만 연결에 실패한다면 문제는 이미 해석 단계에서 라우팅, 규칙 또는 노드 단계로 넘어간 것입니다.
DNS를 동시에 바꾸고 TUN을 켜며 Fake-IP 범위를 수정하고 규칙 세트까지 교체하지 마세요. 작동하는 기준 설정을 하나 보존한 뒤 한 번에 모듈 하나만 바꾸는 것이 올바른 방법입니다. 연결 속도 저하를 단계별로 확인하는 방법은 Clash 속도 저하 문제 해결에서도 확인할 수 있습니다. DNS는 해석 경로만 담당하며 품질이 낮은 원격 회선의 성능을 높여 주거나 올바른 노드와 정책 선택을 대신하지 않습니다.
프록시 노드 필드와 프록시 제공자
노드 객체의 공통 구조
proxies는 정적 노드 목록입니다. 각 항목에는 최소한 이름, 유형, 서버 주소와 포트가 포함되어야 하며 프로토콜에 따라 인증 및 전송 필드를 추가합니다. name은 전체 설정에서 사용하는 참조 식별자이며 정책 그룹이 이를 통해 노드를 찾습니다. 이름이 중복되면 선택과 오버라이드 결과가 불확실해질 수 있으므로 구독을 병합한 뒤 이름이 고유한지 확인하세요. server는 도메인 또는 IP일 수 있고, port는 서버가 실제로 수신하는 포트와 일치해야 합니다.
프로토콜 유형에 따라 사용할 수 있는 필드가 달라지므로 한 프로토콜의 매개변수를 다른 프로토콜에 기계적으로 복사해서는 안 됩니다. 암호화 방식, 사용자 식별자, 전송 계층, TLS와 서버 이름은 모두 서버 설정과 일치해야 합니다. 클라이언트가 YAML을 불러올 수 있다는 것은 문법과 필드 구조가 기본적으로 유효하다는 뜻일 뿐, 원격 인증이 반드시 성공한다는 뜻은 아닙니다. 로그의 핸드셰이크 실패, 인증 실패, 연결 거부와 시간 초과는 서로 다른 단계를 가리키므로 오류가 발생한 단계에 맞춰 처리해야 합니다.
proxies:
- name: "SS 테스트 노드"
type: ss
server: ss.example.com
port: 443
cipher: aes-128-gcm
password: "your-password"
udp: true
- name: "Trojan 테스트 노드"
type: trojan
server: trojan.example.com
port: 443
password: "your-password"
sni: service.example.com
skip-cert-verify: false
udp: true
- name: "Hysteria2 테스트 노드"
type: hysteria2
server: hy2.example.com
port: 443
password: "your-password"
sni: service.example.com
skip-cert-verify: false
인증, TLS와 전송 필드
Shadowsocks 노드의 일반적인 필드에는 cipher, password와 udp가 있습니다. 암호화 방식은 서버와 동일해야 하며 이름이 비슷하더라도 서로 바꿔 사용할 수 없습니다. Trojan 계열 노드는 TLS에 의존하고 비밀번호 외에 sni가 필요한 경우가 많습니다. SNI는 핸드셰이크에 사용하는 서버 이름으로, 연결 주소와 같을 수도 있고 서비스 제공자가 별도로 지정할 수도 있습니다. 잘못 입력하면 TCP 연결은 성공해도 TLS 핸드셰이크가 실패할 수 있습니다.
skip-cert-verify는 인증서 검증을 제어합니다. 정상적인 설정에서는 false를 유지하고 서버 이름, 시스템 시간과 인증서 체인 문제를 먼저 수정해야 합니다. true로 바꾸는 것은 인증서 검증이 장애 지점인지 확인할 때만 사용해야 하며 일반적인 해결책으로 삼아서는 안 됩니다. 시스템 시간 오차, 제한된 네트워크의 가로채기와 잘못된 SNI 모두 인증서 관련 오류를 일으킬 수 있습니다. ‘연결 실패’라는 문구만으로는 원인을 판단할 수 없으므로 로그의 핸드셰이크 단계와 함께 확인해야 합니다.
VMess, VLESS, TUIC, Hysteria2 등의 유형에는 사용자 식별자, 네트워크 유형, WebSocket 경로, HTTP 헤더, 흐름 제어 또는 혼잡 제어 필드가 추가될 수 있습니다. 필드 구성은 커널 기능과 서버 배포 방식에 따라 달라집니다. 노드를 수동으로 옮길 때는 원본 구독과 현재 커널 문서를 기준으로 삼고, 다른 노드의 겉모양만 보고 필드를 추가하지 마세요. 원본 Clash, Meta와 mihomo의 이름 및 호환 관계는 커널 버전 선택 안내에서 확인할 수 있습니다.
proxy-providers를 활용한 필요 시 로드
노드가 많거나 원격 업데이트가 필요하다면 proxy-providers를 사용할 수 있습니다. 제공자는 노드 모음이며 정책 그룹이 use로 이를 참조합니다. 일반적인 유형은 HTTP 또는 로컬 파일이고, 원격 제공자에는 주소, 업데이트 간격, 저장 경로와 상태 확인 설정이 포함됩니다. 저장 경로는 클라이언트가 쓰기를 허용하는 위치여야 하며 컨테이너나 서비스 모드에서는 디렉터리 권한도 확인해야 합니다. 원격 주소의 쿼리 매개변수에 접근 인증 정보가 포함될 수 있으므로 공개 로그나 예시 파일에 기록하지 마세요.
proxy-providers:
provider-main:
type: http
url: "https://subscription.example/config?token=xxxx"
path: ./providers/provider-main.yaml
interval: 3600
health-check:
enable: true
interval: 600
url: https://www.gstatic.com/generate_204
proxy-groups:
- name: "구독 노드"
type: select
use:
- provider-main
proxies:
- DIRECT
interval은 새로고침 간격이며, 시작할 때마다 반드시 즉시 다운로드한다는 뜻은 아닙니다. 클라이언트에 자체 업데이트 버튼과 캐시 정책이 있을 수도 있습니다. health-check는 고정된 주소로 노드 접근 가능성을 확인하며 그 결과를 화면 표시나 자동 정책 선택에 사용합니다. 하지만 하나의 테스트 주소가 모든 웹사이트에 접근할 수 있음을 보장하지는 않습니다. 테스트가 실패하면 먼저 현재 네트워크에서 테스트 주소에 접근 가능한지 확인한 뒤 노드 장애 여부를 판단하세요.
proxies와 use는 같은 정책 그룹에 함께 사용할 수 있습니다. 전자는 고정 노드나 내장 동작을 나열하고, 후자는 제공자 모음을 가져옵니다. 오버라이드 도구는 이 두 필드를 다르게 처리할 수 있으며, 정적 노드를 추가해도 제공자에 자동으로 포함되지 않을 수 있습니다. 구독 업데이트 후 노드가 사라졌다면 원격 제공자가 정상적으로 새로고침되었는지, 저장 경로에 쓸 수 있는지, 정책 그룹이 여전히 올바른 제공자 이름을 참조하는지 확인하세요.
정책 그룹: 수동 선택과 자동 테스트
정책 그룹은 규칙과 노드 사이의 중간 계층입니다
proxy-groups는 여러 노드, 다른 정책 그룹과 내장 동작을 조합해 선택 가능한 대상을 만듭니다. 규칙은 보통 특정 노드를 직접 가리키지 않고 ‘노드 선택’, ‘스트리밍’ 또는 ‘다운로드’ 같은 정책 그룹을 가리킵니다. 이렇게 하면 노드를 바꿀 때 규칙을 다시 작성할 필요가 없습니다. 정책 그룹 이름도 대소문자를 구분하므로 규칙 대상, 상위 정책 그룹 참조와 화면 표시가 모두 일치해야 합니다.
그룹을 중첩할 수는 있지만 순환 구조를 만들면 안 됩니다. 예를 들어 A가 B를 참조하고 B가 다시 A를 참조하면 설정 검사에 실패하거나 실행 동작이 비정상적일 수 있습니다. 정책 계층은 단방향으로 설계하세요. 최상위 업무 그룹이 지역 그룹을 참조하고 지역 그룹이 실제 노드를 참조하도록 구성하며, 하위 그룹이 상위 업무 그룹을 거꾸로 참조하지 않게 해야 합니다. 계층이 지나치게 깊으면 선택이 어려워지므로 보통 2~3단계면 충분합니다.
proxy-groups:
- name: "노드 선택"
type: select
proxies:
- "자동 선택"
- "장애 조치"
- "SS 테스트 노드"
- DIRECT
- name: "자동 선택"
type: url-test
proxies:
- "SS 테스트 노드"
- "Trojan 테스트 노드"
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 50
lazy: true
- name: "장애 조치"
type: fallback
proxies:
- "SS 테스트 노드"
- "Trojan 테스트 노드"
url: https://www.gstatic.com/generate_204
interval: 300
lazy: true
select, url-test와 fallback
select는 수동 선택 그룹이며 클라이언트 화면에 노드와 하위 정책을 표시합니다. 어느 노드가 더 빠른지 자동으로 판단하지 않으므로 안정적인 출구를 직접 지정해야 할 때 적합합니다. DIRECT를 선택 그룹에 넣으면 임시 비교에 사용할 수 있지만 잘못 선택하면 관련 규칙이 모두 직접 연결된다는 뜻이기도 합니다. 자주 사용하는 기본 그룹은 상태 저장을 활성화하면 클라이언트를 다시 시작한 뒤에도 이전 선택을 유지할 수 있습니다.
url-test는 주기적으로 테스트 주소에 접속해 후보 노드 중 응답이 더 적절한 노드를 선택합니다. 측정 대상은 테스트 주소까지의 연결 상태이며 모든 업무의 실제 속도와 같지는 않습니다. interval은 테스트 주기를 제어하며 너무 짧으면 네트워크와 배터리 사용량이 늘어납니다. tolerance는 결과가 비슷할 때 잦은 전환을 줄입니다. 허용 오차가 너무 작으면 작은 변동에도 노드가 반복해서 바뀌고 장시간 연결에도 영향을 줄 수 있습니다.
fallback은 사용 가능성과 후보 순서를 더 중시합니다. 현재 노드를 사용할 수 없으면 목록 순서에 따라 전환하므로, 고정 출구를 우선 사용하다가 장애가 생길 때만 바꾸려는 경우에 적합합니다. 이는 ‘항상 지연이 가장 낮은 노드 선택’과는 다른 목표입니다. 업무에서 안정적인 출발지 주소가 중요하다면 잦은 속도 측정 전환보다 수동 선택이나 장애 조치가 더 제어하기 쉽습니다.
load-balance와 상태 확인의 한계
load-balance는 여러 사용 가능한 노드에 연결을 분산하며, 커널이 지원하는 정책에 따라 같은 대상의 일관성을 유지하거나 순환할 수 있습니다. 독립적인 연결이 많은 작업에는 적합하지만 전체 세션에서 항상 같은 출구를 사용해야 하는 서비스에는 적합하지 않습니다. 로그인 상태 이상, CAPTCHA 증가 또는 같은 업무에서 출구가 바뀌는 현상이 보이면 테스트 간격을 계속 줄이기보다 먼저 고정 노드로 바꿔 확인하세요.
자동 정책은 상태 확인 주소에 의존합니다. 테스트 주소는 안정적이고 응답 본문이 작으며 빈번한 접근을 허용해야 하고, 로컬 네트워크에서 특별히 처리되는 주소여서도 안 됩니다. 모든 노드가 갑자기 실패로 표시되지만 실제 접속은 정상이라면 테스트 주소 자체에 접근할 수 없는 것일 수 있습니다. 반대로 테스트 성공은 해당 주소에 접근할 수 있다는 뜻일 뿐 DNS, 대상 웹사이트, UDP 또는 특정 프로토콜이 모두 정상이라는 뜻은 아닙니다. 자동 선택은 보조 기능이지 완전한 품질 평가가 아닙니다.
| 정책 유형 | 주요 목적 | 적합한 상황 | 흔한 오해 |
|---|---|---|---|
select |
수동으로 고정 선택 | 안정적인 출구, 필요할 때 전환 | 자동으로 속도를 측정한다고 생각함 |
url-test |
테스트 결과에 따라 자동 선택 | 일상적인 웹 사용, 후보가 많을 때 | 테스트 지연 시간을 다운로드 속도와 동일시함 |
fallback |
우선 사용하고 장애 시 전환 | 주 회선과 대기 회선 | 목록 순서를 무시함 |
load-balance |
여러 노드에 연결 분산 | 다중 연결 작업 | 고정 출구가 필요한 세션에 사용 |
업무 그룹으로 규칙 유지 관리
유지 관리하기 쉬운 설정은 보통 전체 진입점 그룹 하나를 두고, 업무별로 소수의 정책 그룹을 추가합니다. 규칙은 업무 그룹을 가리키고 업무 그룹은 다시 전체 진입점, 자동 그룹 또는 특정 지역 그룹을 참조합니다. 이렇게 하면 구독 노드가 바뀌어도 그룹 구성원만 조정하면 됩니다. 도메인마다 정책 그룹을 만들면 화면에 중복 선택지가 가득 차고 오버라이드도 관리하기 어려워지므로 피하세요.
정책 그룹을 추가하거나 이름을 바꾼 뒤에는 파일 전체에서 이전 이름을 검색해야 합니다. 규칙, 다른 정책 그룹과 오버라이드 스크립트가 이를 참조하고 있을 수 있습니다. 클라이언트에 ‘정책이 없음’이 표시되면 먼저 이름의 공백, 전각 기호와 대소문자를 확인한 다음 오버라이드 순서 때문에 그룹이 삭제되지 않았는지 확인하세요. 노드 지연 시간 표시와 실제 체감이 크게 다르다면 노드, 회선과 로컬 설정 점검을 참고해 DNS, 핸드셰이크와 지속 전송을 각각 확인하세요. 한 번의 상태 확인 결과만으로 판단하지 마세요.
규칙 문법, 매칭 순서와 규칙 세트
규칙은 위에서 아래 순서로 매칭됩니다
rules는 순서가 있는 목록입니다. 요청이 첫 번째 일치 규칙을 만나면 이후 검사를 중단하므로 구체적인 규칙을 넓은 규칙보다 앞에 배치하고 마지막에는 MATCH로 나머지 트래픽을 처리해야 합니다. MATCH를 맨 위에 두면 뒤의 규칙은 절대 적용되지 않습니다. 넓은 도메인 접미사를 먼저 작성한 뒤 하위 도메인의 예외 규칙을 작성하면 하위 도메인도 앞의 규칙에 의해 먼저 처리됩니다.
규칙은 보통 ‘유형, 매칭 값, 정책 대상’으로 구성되며 일부 규칙에는 추가 매개변수를 붙일 수 있습니다. 쉼표는 필드 구분자이고 정책 이름은 proxy-groups에 존재하거나 DIRECT, REJECT 같은 내장 동작이어야 합니다. 규칙 행의 불필요한 공백이 값의 일부가 될 수 있으므로 수동 편집 시 형식을 일관되게 유지하세요.
rules:
- DOMAIN,api.example.com,노드 선택
- DOMAIN-SUFFIX,example.com,노드 선택
- DOMAIN-KEYWORD,example,노드 선택
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- PROCESS-NAME,example-app.exe,DIRECT
- GEOIP,CN,DIRECT
- RULE-SET,private-domain,DIRECT
- RULE-SET,service-domain,노드 선택
- MATCH,노드 선택
도메인, 주소와 프로세스 규칙
DOMAIN은 완전한 도메인만 매칭하므로 단일 호스트에 적합합니다. DOMAIN-SUFFIX는 지정된 도메인과 하위 도메인을 매칭하므로 사이트 전체 범위에 적합합니다. DOMAIN-KEYWORD는 도메인에 키워드가 포함되기만 해도 매칭될 수 있어 범위가 가장 넓고 오탐도 가장 쉽게 발생합니다. 완전한 도메인을 사용할 수 있다면 키워드를 사용하지 말고, 명확한 접미사를 사용할 수 있다면 너무 짧은 문자열을 작성하지 마세요.
IP-CIDR와 IP-CIDR6는 대상 주소 대역으로 매칭합니다. LAN, 컨테이너 네트워크와 회사 내부망은 보통 직접 연결을 우선하지만 주소 범위가 실제 네트워크와 일치해야 합니다. no-resolve는 매칭을 위해 IP를 얻으려고 도메인을 추가로 해석하지 않도록 하며 불필요한 DNS 조회를 줄일 수 있습니다. 이미 존재하는 IP 트래픽을 차단한다는 뜻도 아니고 앱이 이미 완료한 해석을 바꾸지도 않습니다.
PROCESS-NAME과 프로세스 경로 규칙은 플랫폼 기능, 권한과 트래픽 가로채기 방식에 의존합니다. 시스템 프록시 모드에서는 모든 트래픽의 프로세스 정보를 안정적으로 얻을 수 없고, 모바일 플랫폼도 같은 프로세스 규칙을 지원하지 않을 수 있습니다. 여러 플랫폼에서 사용할 설정이라면 도메인과 주소 규칙을 기반으로 삼고 프로세스 규칙은 특정 기기의 보조 기능으로 사용하세요. 데스크톱에서는 적중하지만 휴대폰에서는 적중하지 않는다면 먼저 해당 규칙 유형이 플랫폼 간 호환되는지 확인하세요.
GEOIP는 IP 데이터베이스에 따라 분류하고, GEOSITE 또는 규칙 세트는 도메인 모음에 따라 분류합니다. 실제 사용 가능 여부는 커널과 데이터 파일에 따라 달라집니다. 데이터베이스 규칙은 넓은 범위를 다루기 편하지만 분류 데이터에는 업데이트 주기가 있으므로 명확한 업무 규칙을 대신할 수 없습니다. 특정 도메인을 반드시 지정된 정책으로 보내려면 데이터베이스 규칙보다 앞에 정확한 규칙을 배치하세요.
rule-providers로 대규모 규칙 세트 관리
규칙이 많다면 rule-providers에 넣는 것이 적합합니다. 각 제공자에는 이름, 유형, 동작, 출처, 저장 경로와 업데이트 간격이 필요합니다. behavior는 콘텐츠 형식을 결정하므로 도메인 모음, IP 주소 대역과 기존 규칙 행을 서로 섞을 수 없습니다. 제공자 다운로드가 성공했다고 해서 자동으로 분기에 참여하는 것은 아닙니다. rules에서 같은 이름의 RULE-SET을 사용해야 합니다.
rule-providers:
private-domain:
type: http
behavior: domain
format: yaml
url: "https://rules.example/private-domain.yaml"
path: ./rules/private-domain.yaml
interval: 86400
service-domain:
type: file
behavior: classical
format: yaml
path: ./rules/service-domain.yaml
rules:
- RULE-SET,private-domain,DIRECT
- RULE-SET,service-domain,노드 선택
- MATCH,노드 선택
domain 동작은 도메인 또는 도메인 접미사 모음에 적합하고, ipcidr은 주소 대역에 적합하며, classical은 기존 규칙 표현식을 허용합니다. 원격 콘텐츠 형식은 선언과 일치해야 합니다. 제공자 파일 자체에 완전한 payload 구조가 포함되어 있다면 저장 후 커널이 해당 형식에 맞춰 읽습니다. 일반 구독 파일을 규칙 세트로 잘못 지정하면 해석 단계에서 오류가 발생합니다.
규칙 세트 새로고침이 실패하면 먼저 네트워크 요청 상태를 확인한 다음 저장 디렉터리 권한과 파일 형식을 확인하세요. 이전 캐시가 계속 작동할 수 있으므로 ‘현재 접속 가능하다’는 사실만으로 업데이트 성공을 증명할 수 없습니다. 서비스 모드에서 상대 경로는 실행 디렉터리나 클라이언트 설정 디렉터리를 기준으로 하며 YAML 파일이 있는 디렉터리를 기준으로 하지 않을 수 있습니다. 기기를 옮긴 뒤 규칙 제공자가 작동하지 않는다면 경로 차이가 흔한 원인입니다.
결과를 추측하지 말고 규칙 적중을 확인하기
클라이언트 연결 기록에는 보통 대상 도메인, 적중한 규칙과 최종 정책이 표시됩니다. 테스트할 때는 브라우저의 기존 연결을 끊거나 새 요청을 사용해야 합니다. 연결을 재사용하면 이전 정책이 계속 적용될 수 있습니다. 규칙을 수정한 뒤 설정을 다시 불러오고 새 연결이 새 규칙에 적중하는지 확인하세요. 웹페이지가 열리는지만 봐서는 직접 연결인지 프록시인지 구분할 수 없습니다.
사용자 지정 규칙은 소수의 정확한 항목부터 시작하세요. 먼저 명확한 도메인 규칙 하나를 작성해 적중을 확인한 다음 접미사나 규칙 세트로 범위를 단계적으로 넓히세요. 새 규칙 때문에 많은 웹사이트에 문제가 생기면 너무 짧은 키워드, 지나치게 넓은 주소 대역 또는 앞쪽에 배치된 MATCH가 있는지 즉시 확인하세요. 규칙 분기의 핵심은 개수가 아니라 순서가 명확하고 대상이 존재하며 범위를 설명할 수 있는지에 있습니다.
구독 오버라이드, YAML 병합과 업데이트 범위
원본 구독과 실행 설정은 같은 파일이 아닙니다
그래픽 클라이언트에서 구독을 가져오면 보통 다운로드, 해석, 오버라이드, 클라이언트 설정 주입과 커널 로드 단계를 거칩니다. 화면에 표시되는 구독 내용은 원본 파일일 수도 있고 처리된 캐시일 수도 있습니다. 커널이 실제로 실행하는 설정에는 클라이언트가 자동으로 기록한 포트, 제어 인터페이스와 TUN 설정이 포함될 수도 있습니다. 따라서 오버라이드 문제를 해결할 때는 지금 확인하는 파일이 어느 단계의 파일인지 명확히 해야 합니다.
구독 업데이트는 원격 콘텐츠를 다시 다운로드합니다. 캐시 파일을 직접 편집한 내용이 다음 업데이트에서 사라지는 것은 정상이며 클라이언트가 저장에 실패했다는 뜻이 아닙니다. 장기간 유지해야 하는 로컬 규칙, 정책 그룹 또는 DNS 설정은 클라이언트가 지원하는 오버라이드, 확장 스크립트 또는 로컬 설정 계층에 넣어야 합니다. 클라이언트마다 오버라이드 기능과 필드 이름이 완전히 같지는 않으므로 옮길 때는 최종 설정을 먼저 내보내 대조하세요.
매핑, 목록과 스칼라의 병합 차이
YAML 자체는 데이터 구조를 정의하지만 구독 도구가 깊은 병합을 어떻게 처리해야 하는지 통일해 규정하지는 않습니다. mode 같은 스칼라 필드는 보통 나중 값이 이전 값을 대체합니다. dns 같은 매핑은 키별로 병합될 수도 있고 전체가 대체될 수도 있습니다. rules와 proxy-groups 같은 목록은 덮어쓰기, 추가, 앞에 삽입 또는 이름 기준 처리 방식이 서로 다를 수 있습니다. 모든 클라이언트가 같은 알고리즘을 사용한다고 가정해서는 안 됩니다.
규칙 오버라이드는 특히 순서에 의존합니다. 사용자 지정 규칙이 원격 규칙의 끝에 추가되고 원격 설정에 이미 MATCH가 있다면 새 규칙은 적중하지 않습니다. 이때는 일반적인 추가가 아니라 ‘앞에 삽입’해야 합니다. 정책 그룹을 전체 교체하면 구독에서 생성한 노드 참조가 사라질 수 있고, 같은 이름의 그룹을 단순히 추가하면 이름이 중복될 수 있습니다. 데이터 유형마다 병합 결과를 별도로 확인해야 합니다.
# 기본 설정의 조각
mode: rule
dns:
enable: true
enhanced-mode: fake-ip
rules:
- DOMAIN-SUFFIX,example.com,노드 선택
- MATCH,노드 선택
# 앞에 삽입할 로컬 규칙 조각
rules:
- DOMAIN,internal.example.com,DIRECT
# 병합 후 올바른 순서는 다음과 유사합니다
rules:
- DOMAIN,internal.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,노드 선택
- MATCH,노드 선택
YAML 앵커 안전하게 사용하기
앵커를 사용하면 중복 필드를 줄일 수 있습니다. 예를 들어 여러 자동 정책 그룹이 테스트 주소와 간격을 공유한다면 공통 매핑을 정의한 뒤 병합 키로 펼칠 수 있습니다. 하지만 앵커는 같은 YAML 문서 안에서만 유효합니다. 원격 구독과 로컬 오버라이드를 해석이 끝난 후 병합한다면 오버라이드 조각에서 원본 파일의 앵커를 참조할 수 없을 수 있습니다. 일부 변환 도구는 앵커를 먼저 펼치거나 삭제하기도 하므로 파일 간 앵커에 핵심 호환성을 의존해서는 안 됩니다.
group-test-common: &group-test-common
type: url-test
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 50
proxy-groups:
- name: "자동 선택"
<<: *group-test-common
proxies:
- "SS 테스트 노드"
- "Trojan 테스트 노드"
앵커 이름은 YAML 해석에만 사용되며 Clash 설정 필드가 되지 않습니다. 클라이언트의 엄격한 검사가 추가 최상위 키를 허용하지 않는다면 도구가 지원하는 위치에 공통 구조를 배치하거나 필드를 직접 펼치세요. 여러 기기에서 사용하려면 최종 내보내기 설정은 이미 펼쳐져 독립적으로 로드할 수 있는 완전한 파일인 것이 좋습니다. 중복을 줄이는 것도 편리하지만 가독성과 호환성을 더 우선해야 합니다.
되돌릴 수 있는 오버라이드 절차 만들기
첫 번째 오버라이드에서는 로그 수준이나 정확한 규칙 하나처럼 검증하기 쉬운 필드 하나만 수정하세요. 다시 불러온 뒤 최종 설정과 연결 기록을 확인해 오버라이드 계층이 실제로 적용되었는지 확인합니다. 두 번째 단계에서 DNS나 정책 그룹을 추가하세요. 포트, DNS, 그룹과 규칙을 한 번에 교체하면 장애가 발생했을 때 어느 계층이 원인인지 판단할 수 없습니다.
로컬 확장에는 명확한 이름을 사용하세요. 예를 들어 정책 그룹은 안정적인 이름을 통일해 사용하고, 규칙 제공자는 구독과 충돌하지 않는 접두사를 사용합니다. 구독을 업데이트하기 전후로 최종 설정의 최상위 키 개수, 정책 그룹 이름과 규칙 순서를 비교하세요. 노드 수가 달라지면 무관한 차이가 많이 생기므로 단순히 파일 줄 수만 비교해서는 안 됩니다. 로컬 필드가 여전히 존재하는지, 참조가 모두 연결되는지, 마지막 기본 규칙이 하나뿐인지가 핵심입니다.
클라이언트 간에 옮길 때는 새 클라이언트에 원본 구독을 먼저 가져온 다음 로컬 오버라이드를 이식하세요. 실행 디렉터리 전체를 바로 복사하지 않는 것이 좋습니다. Clash Plus, Clash Verge Rev, FlClash, Clash Nyanpasu 같은 그래픽 클라이언트는 설정 관리 화면과 저장 방식이 다를 수 있습니다. 커널 호환성이 같다고 해서 화면 설정까지 완전히 같은 것은 아닙니다. 클라이언트 선택에서 클라이언트별 특징을 확인한 뒤 다운로드 센터에서 해당 플랫폼의 설치 패키지를 받으세요.
구독 업데이트 후 문제 위치 확인
업데이트 후 설정을 불러올 수 없다면 먼저 로컬 오버라이드를 일시적으로 끄고 원본 구독을 확인하세요. 원본 구독은 정상인데 오버라이드 후 실패한다면 문제는 병합 계층에 있습니다. 원본 구독도 실패한다면 원격 콘텐츠, 구독 상태 또는 커널 호환성을 확인해야 합니다. 설정은 불러와지지만 정책 그룹이 비어 있다면 노드 제공자 이름과 필터 조건을 확인하세요. 사용자 지정 규칙이 사라졌다면 오버라이드 유형이 교체인지 추가인지 확인하고, 포트가 기본값으로 돌아갔다면 클라이언트 설정이 파일 필드보다 우선하는지 확인하세요.
최근 정상적으로 작동한 최종 설정을 하나 보관하면 ‘상위 구독의 변화’와 ‘로컬 편집의 변화’를 빠르게 구분할 수 있습니다. 되돌린 뒤 즉시 전체를 다시 덮어쓰지 말고 차이가 가장 작은 모듈부터 복구하세요. 최초 설치와 구독 가져오기에 관한 일반적인 주의 사항은 플랫폼 간 초기 설정과 흔한 오류에서도 확인할 수 있습니다.
설정 검사, 로드 절차와 장애 단계 구분
먼저 문법을 확인한 다음 네트워크를 확인하기
설정 장애는 파일 인코딩과 YAML 문법, 필드 구조와 참조, 수신 포트, DNS, 노드 연결, 정책 그룹, 규칙 적중, 앱 가로채기 순서로 처리해야 합니다. 이전 단계가 통과되지 않았다면 다음 단계로 넘어가지 마세요. 문법 오류는 전체 설정을 로드하지 못하게 하지만 노드 오류는 해당 연결에만 영향을 주고, 규칙 오류는 트래픽을 잘못된 정책으로 보낼 수 있습니다. 장애 범위를 구분해야 모든 설정을 목적 없이 바꾸는 일을 피할 수 있습니다.
그래픽 클라이언트에는 보통 설정 검사 또는 다시 불러오기 버튼이 있습니다. 서버와 명령줄 환경에서는 현재 커널이 제공하는 테스트 매개변수를 사용할 수 있지만, 실행 파일 이름과 매개변수는 설치 패키지의 안내를 기준으로 해야 합니다. 검사 명령은 실제 설정 디렉터리를 가리켜야 합니다. 상대 경로가 잘못되면 같은 이름의 다른 파일을 검사할 수 있습니다. ‘설정이 유효함’이 표시된 뒤에도 시작 로그를 확인하세요. 포트 충돌, 디렉터리 권한과 네트워크 연결은 실행 단계의 문제이기 때문입니다.
# 실제 설정 디렉터리로 이동한 다음 현재 커널의 설정 검사 매개변수를 호출하는 예시
cd /path/to/clash-config
mihomo -t -d .
# 로컬 포트가 이미 사용 중인지 확인할 때는 운영체제에 맞는 도구를 사용
# Linux
ss -lntup
# Windows PowerShell
Get-NetTCPConnection -State Listen
해석 오류가 자주 발생하는 위치
오류에 줄 번호가 포함되어 있다면 해당 줄과 그 위의 몇 줄을 함께 확인하세요. YAML 파서는 계속 해석할 수 없게 된 시점에 오류를 표시하는 경우가 많아 실제 원인은 이전 줄의 닫히지 않은 따옴표, 콜론 뒤의 공백 누락 또는 목록 들여쓰기 중단일 수 있습니다. 매핑 키가 중복되었다는 메시지가 나오면 같은 수준의 동일한 필드를 검색하세요. 유형이 맞지 않는다는 메시지가 나오면 원래 목록이어야 할 위치에 하이픈이 빠졌는지, 정수가 객체로 잘못 작성되지 않았는지 확인하세요.
채팅 앱이나 서식 있는 텍스트에서 복사한 내용에는 전각 콜론, 굽은 따옴표, 줄 바꿈 없는 공백과 보이지 않는 문자가 포함될 수 있습니다. 가장 안전한 방법은 일반 텍스트 편집기에서 문제가 된 줄을 다시 입력하는 것입니다. 한글 정책 그룹 이름은 정상적으로 사용할 수 있지만 구두점은 일반적인 반각 YAML 구분 기호를 사용해야 합니다. 주석은 샵으로 시작해야 하며 유효한 값과 적절한 공백을 두어야 합니다.
설정을 해석할 수 있지만 대상이 없다는 메시지가 나오면 노드 이름, 제공자 이름, 정책 그룹 이름과 규칙 세트 이름을 확인하세요. 정책 그룹이 구독 업데이트로 이름이 바뀐 노드를 참조하거나, 규칙이 오버라이드로 삭제된 그룹을 가리키거나, RULE-SET 이름과 제공자 키가 일치하지 않는 경우가 흔합니다. 이름을 검색할 때는 따옴표 안의 전체 텍스트를 포함하고 끝의 공백과 비슷하게 생긴 문자를 주의하세요.
포트, 시스템 프록시와 TUN 확인 경로
클라이언트는 실행 중으로 표시되지만 앱이 인터넷에 연결되지 않는다면 먼저 수신 포트가 존재하는지 확인한 뒤 시스템 프록시 주소를 대조하세요. YAML의 mixed-port를 새 값으로 바꿨는데 시스템 프록시가 여전히 이전 값을 가리키면 브라우저 연결은 즉시 실패합니다. 시스템 프록시를 따르지 않는 앱만 연결되지 않는다면 기본 프록시는 정상일 가능성이 있으므로 노드 프로토콜을 계속 수정하기보다 TUN 사용을 검토해야 합니다.
TUN을 켠 뒤 인터넷이 완전히 끊기면 권한, 가상 네트워크 카드, 라우팅, DNS 가로채기와 다른 네트워크 프로그램의 충돌을 확인해야 합니다. 먼저 TUN을 끄고 시스템 프록시 경로가 작동하는지 확인한 뒤 TUN을 별도로 처리하세요. 클라이언트를 종료한 뒤에도 인터넷이 되지 않으면 시스템 프록시가 켜진 채 남아 있는지, 가상 네트워크 카드의 라우팅이 복구되었는지 확인합니다. 같은 테스트에서 여러 프록시 클라이언트를 동시에 켜지 마세요. 시스템 프록시, 포트와 라우팅을 서로 차지하려 할 수 있습니다.
노드 사용 가능성과 규칙 적중 확인
노드 테스트가 실패하면 DNS 해석 실패, TCP 연결 시간 초과, 연결 거부, TLS 핸드셰이크 실패와 인증 실패를 먼저 구분하세요. 해석 실패는 노드 서버 도메인과 proxy-server-nameserver를 확인하고, 시간 초과는 네트워크와 원격 주소를 확인해야 합니다. 거부는 보통 대상 포트가 연결을 받지 않는다는 뜻이고, 핸드셰이크 실패는 시스템 시간, SNI와 인증서를 확인해야 하며, 인증 실패는 비밀번호, 사용자 식별자와 프로토콜 필드를 확인해야 합니다. 오류가 다르면 해결 방법도 달라야 합니다.
노드 테스트는 성공하지만 대상 웹사이트에 접속할 수 없다면 연결 기록에서 적중 규칙과 정책을 확인하세요. DIRECT에 적중했다면 규칙 순서나 모드에 문제가 있을 수 있습니다. 예상한 노드에 적중했다면 대상 도메인 해석, 노드 출구와 웹사이트 측 제한을 계속 확인하세요. 전체 모드로 임시 전환하면 규칙 문제인지 구분하는 데 도움이 되지만 테스트 후에는 규칙 모드로 되돌려야 합니다. 전체 모드에서 접속된다고 해서 원래 규칙이 올바르다는 뜻은 아니며, 특정 프록시 경로가 사용 가능하다는 뜻일 뿐입니다.
| 증상 | 우선 확인할 항목 | 다음 단계 |
|---|---|---|
| 설정을 불러올 수 없음 | 들여쓰기, 중복 키, 필드 유형 | 해석 가능한 최소 설정으로 줄이기 |
| 클라이언트는 실행되지만 브라우저 연결이 끊김 | 수신 포트와 시스템 프록시 포트 | 로컬 포트 충돌 여부 확인 |
| 도메인은 실패하지만 IP는 연결됨 | DNS 수신, 해석기와 캐시 | DNS를 단순화한 뒤 항목별로 복구 |
| 전체 모드에서는 작동하지만 규칙 모드에서 실패 | 규칙 순서와 정책 대상 | 연결 기록의 적중 항목 확인 |
| 구독 업데이트 후 로컬 규칙이 사라짐 | 오버라이드 방식과 병합 순서 | 최종 실행 설정 대조 |
최소 작동 설정 만들기
복잡한 설정에서 원인을 찾기 어렵다면 포트 하나, 노드 하나, 수동 정책 그룹 하나와 규칙 두 개로 시작하세요. 설정을 불러오고 연결할 수 있는지 확인한 뒤 DNS, 자동 정책, 규칙 제공자와 TUN을 차례로 추가합니다. 계층을 하나 추가할 때마다 작동하는 사본을 저장하세요. 수천 줄의 구독 설정에서 계속 추측하는 것보다 빠르고, 클라이언트와 커널이 실제로 지원하는 필드도 명확히 알 수 있습니다.
최소 설정 테스트에 사용하는 노드는 정보가 완전한지 확인해야 하며 테스트 도메인도 안정적이어야 합니다. 최소 설정에서도 실패한다면 문제는 규칙 세트보다 노드, 시스템 네트워크, 권한 또는 클라이언트 설치에 있을 가능성이 큽니다. 이때는 사용 가이드로 돌아가 초기화 절차를 확인하거나 구독, 모드와 연결 상태에 관한 10가지 질문을 참고하세요. 다시 설치해야 한다면 다운로드 센터에서 해당 플랫폼을 선택하고, 데스크톱과 모바일 모두 Clash Plus를 우선 확인하세요.
문제 해결이 끝나면 임시로 사용한 debug 로그, 넓은 테스트 규칙과 인증서 검증 변경을 정상 설정으로 되돌리세요. 더 이상 사용하지 않는 포트, 중복 정책 그룹과 만료된 제공자를 삭제하고 사용자 지정 부분에는 짧은 주석을 남기세요. 설정의 장기적인 유지 관리성은 필드 수가 아니라 각 모듈의 역할이 명확한지에 달려 있습니다. 각 규칙이 존재하는 이유, 각 그룹이 참조하는 대상, 각 DNS 해석기의 역할을 설명할 수 있어야 지속적으로 업데이트할 수 있는 설정입니다.
작동하는 설정에서 계속하기
아직 클라이언트를 설치하지 않았다면 먼저 플랫폼에 맞는 설치 패키지를 받으세요. 설치는 완료했지만 화면 조작이 익숙하지 않다면 빠른 시작 절차에 따라 구독을 가져오고 정책을 선택한 뒤 연결을 확인하세요.