Clash 규칙 기반 분기 설정 실전: 국내외 사이트 자동 분리 방법

국내외 접속 분리를 예로 들어 규칙셋과 정책 그룹으로 자동 분기 구성 방법을 설명합니다: 국내 사이트는 직결, 해외 서비스는 프록시 경유, 광고 및 추적 도메인은 즉시 차단합니다. 본문의 문법은 mihomo(Clash Meta) 코어를 기준으로 합니다.

1. 분기 처리가 해결하는 문제

트래픽을 구분하지 않으면 Clash는 두 가지 방식으로만 동작합니다. 전역 프록시(global)는 모든 연결을 노드에 맡기는데, 이 경우 국내 사이트도 해외를 경유해 지연이 눈에 띄게 늘어나고, 지역 제한이 걸린 동영상·음악 서비스는 해외 IP를 차단하며, 은행이나 정부 사이트는 해외 로그인으로 인식해 보안 검증을 요구할 수 있습니다. 전역 직결(direct)은 반대로 해외 서비스에 전혀 접속할 수 없습니다.

규칙 기반 분기(rule)는 세 번째 방식입니다. 코어가 설정 파일의 rules 목록을 기준으로 매 연결의 목적지를 하나씩 판별합니다. 국내 도메인과 IP는 직결하고, 해외 서비스는 프록시 노드로 보내고, 알려진 광고·추적 도메인은 즉시 차단합니다. 한 번 설정해두면 계속 적용되므로 일상적으로 모드를 수동 전환할 필요가 없습니다. 이 글에서는 바로 적용 가능한 예시 설정을 통해 구성 과정을 전체적으로 보여드립니다.

2. 규칙 매칭의 기본 원리

rules는 순서가 있는 목록입니다. 새 연결이 들어오면 코어는 첫 번째 규칙부터 순서대로 비교하며, 조건에 맞는 첫 규칙을 만나면 즉시 멈추고 해당 규칙이 지정한 대상으로 처리합니다. 모두 매칭되지 않으면 목록 맨 끝의 MATCH 규칙이 처리를 담당합니다. 여기서 두 가지 결론이 나옵니다.

  • 순서가 곧 우선순위입니다. 더 구체적이고 먼저 판별해야 하는 규칙을 앞에 두고, 범위가 넓은 규칙(예: GEOIP,CN)은 뒤에 배치하며, MATCH는 항상 마지막에 둡니다.
  • 도메인 규칙이 IP 규칙보다 먼저 적용됩니다. 연결에 도메인 정보가 있으면 코어는 먼저 DOMAIN, DOMAIN-SUFFIX, RULE-SET 등 도메인 기반 규칙으로 비교하고, 모두 매칭되지 않으면 IP로 해석한 뒤 IP-CIDR, GEOIP 규칙을 비교합니다. IP 계열 규칙에 no-resolve 옵션을 추가하면 해석 단계 전에 해당 규칙을 바로 건너뛰게 되어, 규칙 판별용 불필요한 DNS 조회를 막을 수 있습니다.

자주 쓰는 규칙 유형은 다음과 같습니다.

규칙 유형작성 예시설명
DOMAINDOMAIN,www.example.com,노드 선택특정 도메인을 정확히 매칭
DOMAIN-SUFFIXDOMAIN-SUFFIX,google.com,노드 선택해당 도메인과 모든 하위 도메인을 매칭
DOMAIN-KEYWORDDOMAIN-KEYWORD,google,노드 선택도메인에 키워드가 포함되면 매칭
RULE-SETRULE-SET,proxy,노드 선택rule-providers에서 선언한 규칙셋 참조
GEOSITEGEOSITE,cn,DIRECT도메인 분류 라이브러리 기준 매칭(mihomo 전용)
IP-CIDRIP-CIDR,192.168.0.0/16,DIRECT,no-resolveIP 대역 매칭
GEOIPGEOIP,CN,DIRECTIP 소속 국가/지역 기준 매칭
MATCHMATCH,노드 선택기본값 처리, 나머지 모든 연결에 매칭
참고

RULE-SET과 rule-providers 문법은 오리지널 Clash Premium에서도 동일하게 사용됩니다. GEOSITE는 mihomo 전용 기능이므로 오리지널 코어에서는 RULE-SET 규칙셋으로 대체해야 합니다.

3. 정책 그룹 설계

분기 설정에서 각 연결은 세 가지 방향 중 하나로 처리됩니다. 직결(DIRECT), 차단(REJECT), 특정 프록시 노드 경유입니다. 프록시 쪽은 보통 세 개의 정책 그룹으로 구성합니다.

  • 노드 선택(select 타입): 사용 가능한 모든 노드를 나열하고 출구를 직접 지정하며, 대부분 규칙의 기본 출구로 사용합니다.
  • 자동 선택(url-test 타입): 그룹 내 노드를 주기적으로 속도 측정해 지연이 가장 낮은 노드로 자동 전환합니다. 이를 「노드 선택」의 후보 목록에 넣어두면 필요할 때 한 번에 전환할 수 있습니다.
  • 광고 차단(select 타입): 후보는 REJECT와 DIRECT뿐입니다. 기본값은 REJECT이며, 특정 사이트가 접속되지 않을 때 오차단인지 확인하려면 임시로 DIRECT로 전환해 대조할 수 있습니다.
proxy-groups:
  - name: 노드 선택
    type: select
    proxies:
      - 자동 선택
      - 홍콩 노드
      - 일본 노드
      - DIRECT

  - name: 자동 선택
    type: url-test
    proxies:
      - 홍콩 노드
      - 일본 노드
    url: http://www.gstatic.com/generate_204
    interval: 300

  - name: 광고 차단
    type: select
    proxies:
      - REJECT
      - DIRECT

정책 그룹 이름은 rules에도 그대로 나타나므로, 이름을 변경할 때는 두 곳 모두 함께 수정해야 합니다. 그렇지 않으면 규칙이 존재하지 않는 출구를 참조하게 됩니다.

4. 규칙셋 도입하기

처리해야 할 도메인 수가 수만 개에 달해 직접 작성하는 것은 현실적이지 않습니다. 커뮤니티에서 유지 관리하는 규칙셋은 용도별로 목록을 정리해두었습니다. 광고 도메인, 국내 사이트, 해외 주요 서비스, 국내 IP 대역 등이며, 코어가 주기적으로 다운로드해 로컬에 캐싱합니다. 선언 방식은 설정 최상단에 rule-providers를 추가하는 것입니다.

rule-providers:
  reject:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400

각 필드의 의미는 다음과 같습니다.

  • type: http는 원격 주소에서 다운로드함을 의미하고, file은 로컬 파일을 읽음을 의미합니다.
  • behavior: classical은 목록이 전통적인 규칙(DOMAIN, DOMAIN-SUFFIX 등)으로 구성됨을, domain은 순수 도메인 목록임을, ipcidr은 순수 IP 대역 목록임을 의미합니다. 다운로드 소스의 형식에 맞춰 값을 지정해야 하며, 잘못 지정하면 규칙셋 로딩에 실패합니다.
  • path: 로컬 캐시 경로입니다.
  • interval: 갱신 주기(초 단위)이며, 86400은 하루에 한 번 갱신함을 의미합니다.

선언 후에는 rules에서 RULE-SET,<이름>,<출구> 형태로 참조합니다. mihomo 사용자는 다른 방법도 있는데, 코어에 내장된 GEOSITE와 GEOIP 데이터베이스를 이용하면 GEOSITE,cn, GEOSITE,category-ads-all, GEOIP,CN 같은 표현을 rule-providers 없이도 바로 사용할 수 있습니다. 다만 분류 세밀도는 데이터베이스 관리자에 따라 달라집니다.

본문 예시는 Loyalsoldier/clash-rules 프로젝트의 배포 파일을 사용합니다. 이 프로젝트는 용도별로 reject(광고), direct(국내), proxy(해외), cncidr(국내 IP 대역) 등으로 목록을 나누어 자주 업데이트되고 널리 사용됩니다. 다른 신뢰할 수 있는 소스로 교체해도 작성 방식은 동일합니다.

5. 전체 설정 예시

위 구성 요소를 조합하면 완전한 국내외 분기 설정이 완성됩니다.

# 기본 설정
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

# 내장 DNS: 도메인 규칙이 매칭되지 않을 때 해석 결과를 GEOIP 판별에 사용
dns:
  enable: true
  ipv6: false
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver:
    - https://doh.pub/dns-query
    - https://dns.alidns.com/dns-query

# 정책 그룹(3장 참고)
proxy-groups:
  - name: 노드 선택
    type: select
    proxies:
      - 자동 선택
      - 홍콩 노드
      - 일본 노드
      - DIRECT
  - name: 자동 선택
    type: url-test
    proxies:
      - 홍콩 노드
      - 일본 노드
    url: http://www.gstatic.com/generate_204
    interval: 300
  - name: 광고 차단
    type: select
    proxies:
      - REJECT
      - DIRECT

# 원격 규칙셋(4장 참고)
rule-providers:
  reject:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400
  direct:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
    path: ./ruleset/direct.yaml
    interval: 86400
  proxy:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
    path: ./ruleset/proxy.yaml
    interval: 86400

# 분기 규칙: 위에서 아래로, 매칭되면 즉시 종료
rules:
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - RULE-SET,reject,광고 차단
  - RULE-SET,direct,DIRECT
  - RULE-SET,proxy,노드 선택
  - GEOIP,CN,DIRECT
  - MATCH,노드 선택

규칙 블록의 배치 순서는 다음과 같습니다.

  1. 로컬 및 사내망 주소는 직결하며, no-resolve를 추가해 불필요한 해석을 방지합니다.
  2. 광고 및 추적 도메인은 「광고 차단」 그룹으로 보내며 기본값은 REJECT입니다. 맨 앞에 두어 이후 규칙에서 통과되지 않도록 합니다.
  3. 국내 도메인은 직결합니다.
  4. 해외 주요 서비스는 「노드 선택」을 경유합니다.
  5. 도메인 규칙에 모두 매칭되지 않은 연결은 IP로 해석한 뒤 GEOIP로 국내 소속인지 판별해, 국내라면 직결합니다.
  6. MATCH는 기본값 처리로, 나머지는 모두 프록시를 경유합니다. 일부 국내 비주류 사이트가 우회하더라도, 해외 트래픽이 직결로 누락되는 것을 막기 위함입니다.

주의: proxies 항목(노드 목록)에는 「홍콩 노드」, 「일본 노드」라는 이름의 노드가 반드시 존재해야 합니다. 그렇지 않으면 정책 그룹 참조가 실패해 설정 로딩에 실패합니다. 실제 사용 시에는 자신의 구독에 있는 노드 이름으로 교체하세요.

6. 검증 및 자주 발생하는 오류

분기 적용 여부 확인

  1. 클라이언트의 연결 패널(또는 metacubexd, zashboard 등 외부 패널)을 열면 각 연결에 매칭된 규칙과 출구 체인이 표시됩니다. 예를 들어 RULE-SET(direct) → DIRECT와 같습니다.
  2. 국내 사이트 하나, 해외 사이트 하나, 이미 알고 있는 광고 도메인 하나에 각각 접속해 패널에서 세 가지가 올바르게 분류되는지 확인합니다.
  3. 해외 사이트에 접속할 때 출구 IP를 조회하면 노드가 위치한 지역이 표시되어야 하며, 실제 사용 중인 인터넷 IP가 나오면 안 됩니다.

자주 발생하는 오류

  • 규칙 순서가 뒤바뀐 경우. GEOIP,CN을 너무 앞쪽에 두면 프록시를 거쳐야 할 해외 서브도메인이 미리 걸러지고, MATCH를 중간에 두면 그 뒤의 규칙이 전혀 작동하지 않습니다.
  • 규칙셋 다운로드 실패. rule-providers의 주소가 만료되면 해당 RULE-SET 규칙 전체가 작동하지 않으며, 로그에서 오류를 확인할 수 있습니다. 미러 주소로 교체하거나 file 타입의 로컬 규칙셋으로 바꿔야 합니다.
  • DNS 설정 누락. 도메인 규칙이 모두 매칭되지 않으면 코어는 해석 결과로 GEOIP를 판별합니다. 시스템 DNS가 오염되어 있으면 해외 도메인이 잘못된 IP로 해석되어 직결로 오판될 수 있습니다. 코어 내장 DNS를 활성화(예시에 포함됨)하면 이를 피할 수 있습니다.
  • 노드 이름 불일치. proxy-groups에서 참조하는 노드 이름은 proxies의 name 값과 공백, 전각/반각 차이까지 정확히 일치해야 합니다.
구독 사용자 주의사항

서브스크립션 파일에는 보통 자체 분기 규칙이 이미 포함되어 있어, 파일을 직접 수정하면 다음 업데이트 때 덮어씌워집니다. 올바른 방법은 클라이언트의 오버라이드(Merge / Mixin) 기능을 사용하거나, 구독 변환 서비스를 통해 원본 구독에 사용자 규칙과 규칙셋을 추가하는 것입니다.

Clash 다운로드