config.yaml 구조 개요

완전한 설정 파일은 여러 개의 최상위 필드로 구성되어 있으며, 이 표를 이해하면 이후 각 절에서 설명하는 내용이 그중 한 필드의 세부 작성 방법임을 알 수 있습니다:

필드역할
port / socks-port로컬 HTTP / SOCKS5 프록시 포트
allow-lanLAN 기기의 로컬 프록시 연결 허용 여부
mode실행 모드: rule(규칙 기반 라우팅), global(전역 프록시), direct(전역 직접 연결)
log-level로그 상세도: silent / error / warning / info / debug
external-controllerRESTful API 수신 주소, 대시보드형 클라이언트와 함께 사용
dnsDNS 라우팅 및 유출 방지 관련 설정
proxies직접 작성한 노드 목록(구독 노드는 여기에 작성하지 않아도 됨)
proxy-groups정책 그룹 정의
proxy-providers원격 노드 제공자(구독 링크의 기반 메커니즘)
rule-providers원격 규칙 세트 제공자
rules최종 적용되는 라우팅 규칙 목록, 위에서 아래로 순서대로 매칭
안내: 구독 링크는 본질적으로 클라이언트가 일정한 주기로 이 config.yaml(또는 그 안의 proxies/rules 조각)을 요청해서 로컬 설정에 병합하는 것입니다. 이 구조를 이해하면 구독 문제를 직접 진단하기가 훨씬 쉬워집니다.

프록시 프로토콜 파라미터 상세

노드를 수동으로 추가해야 하는 경우(구독에만 완전히 의존하지 않는 경우), 아래는 주요 프로토콜의 proxies 필드 핵심 파라미터입니다:

Shadowsocks

핵심 필드는 cipher(암호화 방식, 예: aes-256-gcm, chacha20-ietf-poly1305)와 password입니다. 일부 노드는 트래픽 난독화를 위해 plugin(예: obfs 또는 v2ray-plugin)을 함께 사용합니다.

VMess

uuidalterId(신버전은 보통 0)가 필요하며, cipher는 일반적으로 auto입니다. 노드에서 TLS를 활성화한 경우 tls, servername(즉 SNI) 등의 필드도 입력해야 합니다.

Trojan

핵심 필드는 passwordsni입니다. Trojan은 기본적으로 TLS를 강제 사용해 일반 HTTPS 트래픽으로 위장하므로, sni가 인증서 도메인과 일치하는지가 사용 가능 여부에 직접적인 영향을 줍니다.

Hysteria2

QUIC 프로토콜을 기반으로 하며, 핵심 필드는 passwordup / down(업로드/다운로드 대역폭 힌트 값)입니다. 네트워크가 불안정하거나 지연이 높은 환경에서 일반적으로 기존 TCP 프로토콜보다 더 안정적입니다.

WireGuard

필드 형식이 앞의 프로토콜들과 다릅니다: private-key, 상대측 public-key, 그리고 ip(WireGuard 내부망에서 본 기기의 주소)가 필요합니다. 설정이 비교적 저수준이라 일반적으로 노드 제공자가 완전한 조각을 그대로 제공합니다.

여러 프로토콜의 필드 예시 보기
proxies:
  - name: "ss-node"
    type: ss
    server: example.com
    port: 443
    cipher: aes-256-gcm
    password: "your-password"

  - name: "trojan-node"
    type: trojan
    server: example.com
    port: 443
    password: "your-password"
    sni: example.com

  - name: "hy2-node"
    type: hysteria2
    server: example.com
    port: 443
    password: "your-password"
    up: "50 Mbps"
    down: "200 Mbps"

규칙 문법 완전 참조

규칙 형식은 규칙 유형,매칭 내용,대상 정책으로 통일되어 있으며, 위에서 아래로 순서대로 매칭하고 일치하면 즉시 멈춥니다. 아래는 자주 사용하는 규칙 유형의 전체 목록입니다:

규칙 유형매칭 대상예시
DOMAIN완전히 일치하는 도메인DOMAIN,ad.example.com,REJECT
DOMAIN-SUFFIX도메인 접미사DOMAIN-SUFFIX,google.com,PROXY
DOMAIN-KEYWORD도메인에 포함된 키워드DOMAIN-KEYWORD,youtube,PROXY
DOMAIN-REGEX정규식으로 도메인 매칭DOMAIN-REGEX,^ad\d+\.com$,REJECT
GEOIPIP 소재지(GeoIP 데이터베이스와 함께 사용)GEOIP,KR,DIRECT
IP-CIDR / IP-CIDR6IPv4 / IPv6 주소 대역IP-CIDR,192.168.0.0/16,DIRECT
SRC-IP-CIDR요청을 보낸 로컬 소스 IP 대역SRC-IP-CIDR,192.168.1.100/32,DIRECT
SRC-PORT / DST-PORT소스 포트 / 대상 포트DST-PORT,22,DIRECT
PROCESS-NAME요청을 보낸 프로세스명(앱별 프록시의 기반 메커니즘)PROCESS-NAME,com.app.id,PROXY
RULE-SETRule Provider 규칙 세트 참조RULE-SET,reject,REJECT
MATCH기본 규칙, 매칭되지 않은 모든 트래픽 처리MATCH,PROXY
안내: 규칙이 구체적일수록, 자주 접속할수록 위쪽에 배치해야 합니다. 시간이 오래 걸리는 DOMAIN-REGEX나 대형 RULE-SET을 명백히 매칭되지 않을 위치보다 앞에 두면 매번 요청의 매칭 속도가 느려집니다.

Provider 메커니즘: Proxy Provider와 Rule Provider

Provider는 Clash가 「원격에서 자동 업데이트 가능한」 리소스를 관리하는 통합 메커니즘입니다. 구독 링크는 사실 Proxy Provider이고, 규칙 세트는 사실 Rule Provider입니다. 둘 다 파일을 수동으로 교체할 필요 없이 정기적으로 자동 업데이트를 지원합니다.

proxy-providers:
  my-sub:
    type: http
    url: "https://example.com/api/v1/subscribe?token=xxx"
    interval: 3600
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 300

rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/rules/reject.txt"
    path: ./rules/reject.txt
    interval: 86400

여기서 interval은 자동 업데이트 주기(초 단위)를 제어하고, health-check는 클라이언트가 Provider 아래 노드를 정기적으로 일괄 테스트하게 하며, behavior는 규칙 세트 안의 내용이 도메인 목록(domain), IP 대역(ipcidr), 또는 전체 규칙(classical)인지를 클라이언트에 알려줍니다.

정책 그룹 고급 파라미터

기본적인 typeproxies 외에도, 정책 그룹에는 알아두면 좋은 몇 가지 고급 파라미터가 있습니다:

  • lazyurl-test / fallback 그룹에서 활성화하면, 실제로 사용될 때만 백그라운드에서 속도를 테스트해 유휴 시 리소스 사용을 줄입니다;
  • tolerance — 지연 허용치(밀리초). 새 노드의 지연이 현재 노드보다 이 값 이상 낮아야만 전환이 발생하여, 테스트 변동으로 인한 빈번한 노드 전환을 방지합니다;
  • strategy(load-balance 그룹만 해당) — 로드 밸런싱 전략으로, 일반적으로 consistent-hashing(동일한 대상 주소는 항상 같은 노드로 고정, 세션 유지가 필요한 상황에 적합) 또는 round-robin(순차적으로 순환)이 있습니다;
  • disable-udp — 해당 정책 그룹 아래 노드의 UDP 포워딩을 비활성화합니다. 일부 노드나 회선이 UDP를 잘 지원하지 못할 때 끌 수 있습니다.

DNS 고급 설정

DNS 설정은 유출 방지 스위치 외에도 해석 동작을 세밀하게 제어할 수 있습니다:

dns:
  enable: true
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://dns.google/dns-query
    - https://1.1.1.1/dns-query
  fallback:
    - https://1.0.0.1/dns-query
    - https://dns.quad9.net/dns-query
  nameserver-policy:
    "geosite:private": [192.168.1.1]
  fallback-filter:
    geoip: true
    geoip-code: KR

enhanced-mode: fake-ip는 가장 일반적인 모드로, 클라이언트가 각 도메인에 가상 IP를 할당한 뒤 프록시 계층에서 실제 도메인으로 복원하므로 호환성이 가장 좋습니다. nameserver-policy는 도메인 소속에 따라 사용할 DNS 그룹을 개별적으로 지정할 수 있습니다(예: 집 라우터 등 LAN 호스트명만 로컬 DNS로 해석). fallback-filter는 특정 해석 결과가 「오염된 것처럼」 보이는지 판단해 fallback 목록으로 다시 조회할지 결정합니다. geoip-code(여기서는 KR)와 예시 IP/도메인은 실제 사용 중인 지역과 DNS 서버로 바꿔서 사용하세요.

TUN 모드 파라미터 상세

TUN 모드의 핵심 파라미터는 다음과 같습니다:

tun:
  enable: true
  stack: system
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - any:53

stack은 가상 네트워크 카드의 구현 방식을 결정하며, system이 호환성이 가장 좋고 gvisor/mixed는 일부 상황에서 성능이 더 좋습니다. auto-route를 활성화하면 클라이언트가 시스템 라우팅 테이블을 자동으로 관리하고, auto-detect-interface는 클라이언트가 현재 사용 중인 물리 네트워크 카드를 자동으로 인식해 수동 지정을 피할 수 있게 합니다. dns-hijack은 UDP 53번 포트를 사용하는 DNS 요청을 강제로 가로채어, 앱이 시스템 DNS 설정을 우회해 직접 조회하는 것을 방지합니다.

외부 제어 및 RESTful API

external-controller를 설정하면 Clash가 지정된 주소에서 RESTful API 세트를 개방합니다. 대시보드형 클라이언트와 함께 사용하면 클라이언트를 재시작하지 않고도 연결 확인, 노드 전환, 지연 조회 등을 실시간으로 할 수 있습니다.

external-controller: 127.0.0.1:9090
secret: "your-strong-secret"
보안 안내: 반드시 secret을 설정하고 external-controller가 로컬 주소(127.0.0.1)만 수신하도록 해야 합니다. 0.0.0.0에 바인딩하면서 키를 설정하지 않으면 프록시 제어 권한을 전체 네트워크에 노출하는 것과 같습니다.

성능 및 보안 권장 사항

  • 수백 개의 DOMAIN-SUFFIXrules에 나열하는 대신 RULE-SET으로 규칙 세트를 참조하는 것이 매칭 효율이 더 높고 유지 관리도 더 편리합니다;
  • 접속 빈도가 가장 높고 명확한 규칙을 rules 목록 앞쪽에 배치해 평균 매칭 횟수를 줄이세요;
  • 불필요하게 log-leveldebug로 설정해 장기간 실행하지 마세요. 상세 로그는 디스크와 메모리를 계속 소모합니다;
  • external-controller에는 항상 secret을 설정하고, 여러 기기/플랫폼 간에 동일한 키를 재사용하지 마세요;
  • 정책 그룹의 테스트 주기는 너무 짧게 설정하지 마세요. 수십 초에서 몇 분 간격이면 노드 이상을 충분히 빨리 감지할 수 있으며, 너무 자주 실행하면 노드 측 부담과 로컬 리소스 사용이 오히려 늘어납니다;
  • 사용자 정의로 재정의한 규칙과 정책 그룹은 따로 백업해 두는 것을 권장합니다. 구독 업데이트나 클라이언트 재설치 후 빠르게 복구할 수 있습니다.

자주 묻는 질문

설정 파일을 수정했는데 왜 적용되지 않나요?

대부분의 클라이언트는 「설정 다시 불러오기」를 수동으로 클릭하거나 클라이언트를 재시작해야 변경 사항이 적용됩니다. 구독으로 관리되는 설정이라면 로컬 파일을 직접 수정할 경우 다음 자동 업데이트 시 덮어써질 수 있으므로, 재정의(오버라이드) 기능을 사용하는 것을 권장합니다.

RULE-SET과 규칙을 직접 작성하는 것은 어떤 차이가 있나요?

효과는 동일하지만 유지 관리 방식이 다릅니다. RULE-SET은 원격으로 업데이트할 수 있는 독립 파일로, 규칙 내용이 바뀌어도 전체 설정을 다시 가져올 필요가 없습니다. rules에 직접 작성한 규칙은 수정할 때 설정 파일 자체를 직접 변경해야 합니다.

fake-ip와 redir-host 모드는 어떻게 선택해야 하나요?

fake-ip는 호환성과 속도가 모두 더 좋아 현재 주류 선택입니다. redir-host는 DNS 응답 결과를 수정해 구현하는 방식이라, 실제 IP로 검증하는 일부 앱에서 오류가 발생할 수 있습니다. fake-ip 모드에서 명확한 호환성 문제가 발생할 때만 전환을 고려하세요.

external-controller 포트가 이미 사용 중이면 어떻게 하나요?

external-controller의 포트 번호를 사용되지 않은 다른 포트로 변경하면 됩니다. 일반적인 기본 포트는 9090입니다. 시스템 명령으로 해당 포트를 어떤 프로세스가 사용 중인지 확인한 뒤 종료할지 결정할 수도 있습니다.

정책 그룹의 속도 테스트가 계속 실패하면 어떻게 확인하나요?

먼저 테스트 주소(url 필드) 자체를 노드에서 접속할 수 있는지 확인하세요. 일부 테스트 주소는 특정 네트워크 환경에서 차단될 수 있습니다. 다른 공개 연결 테스트 주소로 바꿔보거나, 노드 자체가 이미 사용할 수 없는 상태인지 확인해 보세요.

여러 개의 Rule Provider를 동시에 사용할 수 있나요?

가능합니다. rule-providers는 원하는 만큼 여러 규칙 세트를 정의할 수 있으며, rules 목록에서 필요에 따라 RULE-SET 이름으로 각각 참조하면 됩니다. 순서는 여전히 위에서 아래로 순서대로 매칭하는 규칙을 따릅니다.

기본 사용법을 아직 안 보셨나요? 초보자 가이드에서 구독 가져오기, 정책 그룹, 규칙 기반 라우팅 같은 기본 개념을 먼저 확인해 보세요.