규칙 엔진 동작 원리
Clash의 규칙 엔진은 위에서 아래로 순서대로 매칭합니다. 처음으로 일치하는 규칙이 적용되고 이후 규칙은 더 이상 확인하지 않습니다. 각 규칙은 세 부분으로 구성됩니다:
# 형식: 규칙 유형,매칭 값,대상 정책
- DOMAIN-SUFFIX,google.com,Proxy
- GEOIP,CN,DIRECT
- MATCH,DIRECT # 기본값 규칙, 반드시 마지막에 배치
이 순서 매칭 메커니즘을 이해하는 것이 매우 중요합니다: 정밀한 규칙을 앞에, 광범위한 규칙을 뒤에, MATCH를 마지막 기본값으로 배치하세요.
규칙 유형 상세 설명
도메인 규칙
| 규칙 유형 | 매칭 방법 | 예시 |
|---|---|---|
DOMAIN | 도메인 정확 일치 | DOMAIN,www.google.com,Proxy |
DOMAIN-SUFFIX | 도메인 및 모든 서브도메인에 일치 | DOMAIN-SUFFIX,google.com,Proxy |
DOMAIN-KEYWORD | 도메인에 키워드 포함 | DOMAIN-KEYWORD,googleapis,Proxy |
DOMAIN-REGEX | 정규식으로 도메인 매칭 | DOMAIN-REGEX,^api\..+\.com$,Proxy |
DOMAIN-SUFFIX,google.com,Proxy는 google.com, www.google.com, mail.google.com 등 모든 서브도메인에 동시에 일치합니다. 가장 많이 사용되는 도메인 규칙입니다.
IP 주소 규칙
| 규칙 유형 | 매칭 방법 | 예시 |
|---|---|---|
IP-CIDR | IPv4 CIDR 범위 매칭 | IP-CIDR,192.168.0.0/16,DIRECT |
IP-CIDR6 | IPv6 CIDR 범위 매칭 | IP-CIDR6,::1/128,DIRECT |
GEOIP | IP 소속 국가/지역으로 매칭 | GEOIP,CN,DIRECT |
IP-CIDR 규칙은 기본적으로 DNS 확인을 트리거합니다(도메인을 IP로 변환한 후 매칭). fake-ip 모드에서는 IP-CIDR 규칙이 도메인에 대해 작동하지 않으므로 도메인 규칙을 먼저 사용하세요. IP-CIDR가 DNS 확인을 트리거하지 않도록 하려면 규칙 끝에 no-resolve를 추가합니다: IP-CIDR,10.0.0.0/8,DIRECT,no-resolve기타 규칙 유형
| 규칙 유형 | 설명 | 예시 |
|---|---|---|
PROCESS-NAME | 프로세스 이름으로 매칭 (데스크톱) | PROCESS-NAME,git.exe,Proxy |
PROCESS-PATH | 프로세스 전체 경로로 매칭 | PROCESS-PATH,/usr/bin/curl,Proxy |
NETWORK | 프로토콜 유형으로 매칭 | NETWORK,udp,Proxy |
PORT | 대상 포트로 매칭 | DST-PORT,22,DIRECT |
RULE-SET | 외부 규칙 세트 참조 | RULE-SET,gfw,Proxy |
MATCH | 기본값 매칭, 무조건 일치 | MATCH,DIRECT |
proxy-groups 정책 그룹 설정
정책 그룹은 규칙이 일치한 후 트래픽을 전달할 대상을 정의합니다. Clash는 다음과 같은 정책 그룹 유형을 지원합니다:
수동 선택 (select)
proxy-groups:
- name: "Proxy"
type: select
proxies:
- "자동 선택"
- "홍콩 01"
- "싱가포르 01"
- "일본 01"
- DIRECT
사용자가 클라이언트 인터페이스에서 수동으로 사용할 노드 또는 하위 정책 그룹을 선택합니다. 가장 바깥쪽의 기본 정책 그룹은 일반적으로 select 유형을 사용합니다.
지연 시간 자동 선택 (url-test)
- name: "자동 선택"
type: url-test
url: "https://www.gstatic.com/generate_204"
interval: 300 # 테스트 간격(초), 180~300 권장
tolerance: 50 # 지연 시간 차이가 50ms 이내이면 노드 전환 안 함
proxies:
- "홍콩 01"
- "홍콩 02"
- "싱가포르 01"
모든 노드의 지연 시간을 자동으로 테스트하고 항상 가장 낮은 지연 시간의 노드를 선택합니다. 지연 시간에 민감한 시나리오(게임, 화상 회의)에 이상적입니다.
장애 조치 (fallback)
- name: "장애 조치"
type: fallback
url: "https://www.gstatic.com/generate_204"
interval: 300
proxies:
- "기본 노드"
- "백업 노드 01"
- "백업 노드 02"
목록의 첫 번째 노드를 우선적으로 사용하고 해당 노드가 사용 불가능할 때만 다음 노드로 전환합니다. 안정성을 최우선으로 하는 시나리오에 적합합니다.
로드 밸런싱 (load-balance)
- name: "로드 밸런싱"
type: load-balance
strategy: round-robin # round-robin / consistent-hashing
url: "https://www.gstatic.com/generate_204"
interval: 300
proxies:
- "노드 A"
- "노드 B"
- "노드 C"
여러 노드에 트래픽을 분산하여 전체 처리량을 향상시킵니다. round-robin은 노드를 순차적으로 순환합니다. consistent-hashing은 동일한 대상 주소에 항상 동일한 노드를 사용하며, 세션 유지가 필요한 시나리오에 적합합니다.
rule-providers 외부 규칙 세트
수백 개의 규칙을 수동으로 관리하는 것은 번거롭고 누락이 생기기 쉽습니다. rule-providers를 사용하면 외부 URL이나 로컬 파일에서 커뮤니티가 관리하는 대용량 규칙 세트를 구독하고 자동으로 업데이트할 수 있습니다.
rule-providers:
gfw:
type: http
behavior: domain # domain / ipcidr / classical
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400 # 24시간마다 자동 업데이트
cn-cidr:
type: http
behavior: ipcidr
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400
direct:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
rules:
- RULE-SET,direct,DIRECT
- RULE-SET,gfw,Proxy
- RULE-SET,cn-cidr,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,Proxy
완전한 설정 템플릿 예시
다음은 규칙 기반 라우팅, 정책 그룹, 외부 규칙 세트를 포함한 최소 동작 가능한 설정 템플릿입니다:
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- tls://8.8.8.8:853
proxies:
- name: "홍콩 01"
type: vmess
server: hk01.example.com
port: 443
uuid: "your-uuid-here"
alterId: 0
cipher: auto
tls: true
proxy-groups:
- name: "Proxy"
type: select
proxies: ["자동 선택", "홍콩 01", DIRECT]
- name: "자동 선택"
type: url-test
url: "https://www.gstatic.com/generate_204"
interval: 300
proxies: ["홍콩 01"]
rule-providers:
gfw:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400
rules:
# 사용자 정의 고우선순위 규칙 (맨 앞에 배치)
- DOMAIN-SUFFIX,openai.com,Proxy
- DOMAIN-KEYWORD,notion,Proxy
# 외부 규칙 세트
- RULE-SET,gfw,Proxy
# 국내 IP 직접 연결
- GEOIP,CN,DIRECT
# LAN 직접 연결
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
# 기본값
- MATCH,DIRECT
일반적인 분할 터널링 시나리오
스트리밍 잠금 해제
Netflix, Disney+, YouTube Premium 등의 스트리밍 서비스에는 지역 제한이 있으며 특정 지역의 잠금 해제 노드가 필요합니다:
proxy-groups:
- name: "Netflix"
type: select
proxies: ["미국 노드", "싱가포르 노드", "일본 노드"]
rules:
- DOMAIN-SUFFIX,netflix.com,Netflix
- DOMAIN-SUFFIX,nflxvideo.net,Netflix
- DOMAIN-KEYWORD,netflix,Netflix
개발자 도구 최적화
npm, pip, Docker Hub 등은 프록시가 필요하고, 내부망 서비스와 로컬 개발 서버는 직접 연결이 필요합니다:
rules:
# 개발 도구는 프록시 경유
- DOMAIN-SUFFIX,npmjs.org,Proxy
- DOMAIN-SUFFIX,pypi.org,Proxy
- DOMAIN-SUFFIX,docker.io,Proxy
- PROCESS-NAME,git.exe,Proxy # Windows
- PROCESS-NAME,git,Proxy # macOS/Linux
# 로컬 개발 직접 연결
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- DOMAIN-SUFFIX,local,DIRECT
규칙 설정 모범 사례
- 정밀도 우선:
DOMAIN을DOMAIN-SUFFIX앞에,DOMAIN-SUFFIX를DOMAIN-KEYWORD앞에 배치하여 오매칭을 줄임 - GEOIP는 뒤에: GEOIP는 DNS 확인이 필요하여 시간이 걸리므로 도메인 규칙 뒤에 배치
- MATCH는 반드시 마지막: 기본값 규칙으로, 어떤 규칙에도 일치하지 않는 트래픽을 MATCH가 처리
- 로그로 디버깅: Clash 클라이언트의 '로그' 페이지에서 각 연결이 어떤 규칙에 일치했는지 실시간으로 확인하여 라우팅 문제를 빠르게 해결
- no-resolve로 지연 감소: 내부 IP임이 확실한 IP-CIDR 규칙에는
no-resolve를 추가하여 DNS 확인 단계를 건너뜀
요약
- 규칙은 위에서 아래로 순서대로 매칭: 정밀한 규칙 먼저, 광범위한 규칙 나중에, MATCH가 기본값
- 자주 사용하는 규칙 유형:
DOMAIN-SUFFIX(도메인 및 서브도메인),GEOIP(IP 지리적 위치),IP-CIDR(IP 범위),PROCESS-NAME(프로세스 이름) proxy-groups로 노드 선택 전략 정의: select(수동) / url-test(자동 지연) / fallback(장애 조치) / load-balance(로드 밸런싱)rule-providers로 대용량 외부 규칙 세트 구독, 자동 업데이트, 수동 관리 불필요
관련 글
- TUN 모드 사용 가이드: 모든 트래픽을 Clash 규칙으로 라우팅하기
- DNS 오염 방지 설정: 규칙 기반 라우팅과 함께 DNS 오염 문제 해결
- 구독 자동 업데이트 설정: 노드와 규칙 세트를 항상 최신 상태로 유지