Clash 규칙 분기 설정 실전: GEOIP·DOMAIN-SUFFIX·RULE-SET 조합
규칙 우선순위를 살펴보고 중국 본토는 직접 연결, 해외는 프록시로 보내는 분기 설정과 rule-providers 규칙 세트의 참조·업데이트 방법을 알아봅니다.
먼저 규칙 모드와 설정 편집 위치 확인하기
규칙 분기는 연결에 사용할 아웃바운드를 결정하며, 프록시 노드를 생성하지는 않습니다. 시작하기 전에 구독을 가져왔는지, 노드에 연결할 수 있는지 확인하고 클라이언트의 ‘프록시 모드’에서 ‘규칙’을 선택하세요. 전역 모드에서는 보통 모든 트래픽이 전역 정책으로 전달되고, 직접 연결 모드에서는 이 문서의 규칙 목록에 따라 분기되지 않습니다.
이 문서에서는 Clash Meta의 후속 프로젝트인 mihomo의 YAML 설정을 기준으로 설명합니다. 클래식 Clash와 클라이언트마다 규칙 세트 형식 및 업데이트 기능 지원이 다를 수 있으므로 실제 편집 전에 ‘정보’ 또는 ‘코어 정보’에서 실행 중인 코어를 확인하세요. 아래 예시는 YAML 규칙 세트를 사용하며 MRS 바이너리 규칙 세트 형식은 사용하지 않습니다.
- ‘설정’ 또는 ‘구독’ 페이지에서 현재 설정을 내보내고, 다시 가져올 수 있도록 사본을 보관하세요.
- 설정에
프록시 선택이라는 정책 그룹이 있는지 확인하세요. 실제 그룹명이 다르면 예시의 모든 참조를 같은 이름으로 바꿔야 합니다. - 클라이언트에서 ‘오버라이드’, ‘확장 설정’ 또는 ‘설정 편집’ 기능을 찾아 규칙을 병합하는지 교체하는지 확인하세요.
- 먼저 최소한의 규칙만 저장하고, 정상적으로 불러온 뒤 원격 규칙 세트를 추가하세요.
규칙 우선순위: 처음 일치한 규칙이 아웃바운드를 결정
rules는 순서가 있는 목록입니다. 코어는 위에서 아래로 규칙을 확인하며, 일치하는 규칙을 찾으면 지정된 정책을 적용하고 ‘더 정확한’ 다음 규칙은 확인하지 않습니다. 따라서 개인 예외 규칙은 앞에, 공용 규칙 세트는 중간에, 최종 대체 규칙인 MATCH는 맨 마지막에 배치하세요.
mode: rule
rules:
- DOMAIN,github.com,프록시 선택
- DOMAIN-SUFFIX,home.arpa,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,프록시 선택
이 설정 조각에는 노드와 정책 그룹 정의가 포함되어 있지 않습니다. 기존 설정에 병합할 때 최상위 rules는 하나만 남기고, 같은 이름의 키를 연달아 붙여 넣지 마세요. 마지막 줄은 ‘앞의 규칙에 모두 일치하지 않으면 프록시 선택을 사용한다’는 뜻이지, 코어가 대상이 반드시 해외에 있다고 판별했다는 뜻은 아닙니다.
헷갈리기 쉬운 세 가지 이름
DIRECT: 내장 직접 연결 아웃바운드로, 로컬 네트워크에서 대상에 직접 연결합니다.프록시 선택: 이 예시에서 정한 정책 그룹 이름입니다. 설정에 그룹이 정의되어 있어야 하며 현재 선택된 노드도 실제로 사용할 수 있어야 합니다.MATCH: 최종 대체 규칙 유형이며 정책 그룹이 아닙니다. 뒤에 오는 필드가 아웃바운드 대상입니다.
MATCH,프록시 선택을 첫 줄에 두면 뒤에 있는 직접 연결 규칙은 일치할 기회가 없습니다. 정책 그룹에서 현재 DIRECT를 선택했다면 로그에 ‘프록시 선택’이 표시되더라도 연결은 직접 연결될 수 있습니다. 문제를 확인할 때는 규칙뿐 아니라 최종 아웃바운드 경로도 함께 살펴보세요.
DOMAIN-SUFFIX: 명확한 도메인 범위부터 처리하기
도메인 규칙은 명확한 사이트 연결 방식을 지정하는 데 적합합니다. DOMAIN은 도메인 전체가 정확히 일치할 때만 적용되고, DOMAIN-SUFFIX는 해당 도메인과 하위 도메인에 적용됩니다. 규칙 값에는 도메인만 입력하고 프로토콜, 경로, 포트는 넣지 마세요.
| 규칙 형식 | 일치 범위 | 사용 사례 |
|---|---|---|
DOMAIN,github.com,프록시 선택 | github.com만 | 호스트 이름 하나를 정확히 지정할 때 |
DOMAIN-SUFFIX,github.com,프록시 선택 | github.com 및 api.github.com 같은 하위 도메인 | 같은 도메인에 속한 여러 서비스를 함께 처리할 때 |
DOMAIN-SUFFIX,home.arpa,DIRECT | home.arpa 및 그 하위 도메인 | 가정용 네트워크의 로컬 도메인 |
DOMAIN-SUFFIX,github.com은 notgithub.com과 일치하지 않으며 githubusercontent.com까지 자동으로 포함하지도 않습니다. 사이트의 로그인, 이미지, 다운로드가 서로 다른 도메인을 사용할 수 있으므로 브라우저 주소창만 보고 모든 요청을 판단할 수는 없습니다. 연결 기록에서 실제 대상을 확인한 뒤 필요한 규칙을 추가하세요.
도메인 규칙의 적용 여부는 코어가 도메인을 확인할 수 있는지에 달려 있습니다
HTTP 프록시를 통해 전송되는 도메인 요청은 대개 호스트 이름이 유지되지만, 앱이 IP에 직접 연결하는 경우는 다릅니다. TUN 환경에서는 DNS 가로채기, fake-ip 매핑 또는 트래픽 스니핑으로 도메인을 복원할 수 있지만 모든 프로토콜에서 항상 가능한 것은 아닙니다. 브라우저에서 별도의 암호화 DNS를 사용한다면 실제 DNS 경로가 예상한 설정을 우회하는지도 확인하세요.
‘TUN을 켜면 모든 도메인 규칙이 자동으로 적용된다’고 생각하지 마세요. 먼저 연결 세부 정보에서 대상이 도메인인지 IP 주소만 표시되는지 확인한 다음 DNS, 스니핑 또는 IP 규칙을 점검하세요. 관련 개념은 용어 빠른 확인에서 살펴볼 수 있습니다.
GEOIP: 대상 IP로 지역 판별 보완하기
GEOIP,CN,DIRECT는 대상 IP가 현재 지리 데이터베이스의 CN 항목에 해당하면 직접 연결한다는 뜻입니다. 판별 기준은 IP이며 도메인 접미사나 운영 주체가 아닙니다. 중국어 사이트가 해외 CDN을 사용하거나 해외 서비스가 중국 본토의 엣지 노드를 사용하는 경우, 실제 결과가 예상과 다를 수 있습니다.
rules:
- DOMAIN-SUFFIX,github.com,프록시 선택
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,프록시 선택
먼저 흔히 사용하는 사설 IP 대역을 지정해 LAN 기기가 프록시 대체 규칙에 걸리지 않도록 합니다. 이 목록이 특수 주소 전체를 포함하는 것은 아닙니다. 루프백, 링크 로컬 또는 기타 예약 주소가 관련된 환경이라면 클라이언트의 TUN 라우팅 제외 설정도 함께 확인하세요. 규칙을 통한 직접 연결과 라우팅 제외는 서로 다른 계층의 기능입니다. 전자로 처리해도 트래픽이 코어에 들어오지 않는다는 뜻은 아닙니다.
no-resolve가 실제로 하는 일
IP 규칙으로 도메인 대상을 확인할 때는 먼저 도메인을 해석해야 할 수 있습니다. no-resolve를 추가하면 해당 규칙을 위해 도메인 해석을 직접 요청하지 않습니다. 연결 전체의 DNS를 비활성화하는 옵션은 아니며, 대상 IP가 이미 있는 연결에서 IP 판별을 건너뛰게 하지도 않습니다.
- LAN 대역 규칙에는 보통
no-resolve를 붙여 목록 초반부터 모든 도메인을 해석하지 않도록 할 수 있습니다. - 아직 해석되지 않은 도메인에도
GEOIP,CN을 적용하려면 예시처럼no-resolve를 붙이지 마세요. - GEOIP에
no-resolve를 붙이면 일부 도메인 연결은 다음 규칙으로 넘어가 프록시 대체 규칙에 적용될 수 있습니다.
GEOIP 결과는 데이터베이스 출처와 업데이트 시점, DNS가 반환한 주소에도 영향을 받습니다. 규칙을 수정해도 데이터베이스가 함께 갱신되지는 않습니다. 특정 서비스가 잘못 분류되면 지역 규칙 전체를 뒤집기보다 확인된 도메인 예외를 우선 추가하세요.
RULE-SET: 공용 목록과 개인 규칙을 분리해 관리하기
rule-providers는 규칙 세트의 데이터 출처를 정의하고, RULE-SET은 규칙 목록에서 해당 세트를 참조합니다. provider만 선언해서는 트래픽이 분기되지 않으므로 rules에서 같은 이름을 참조해야 합니다. 아래 예시는 공용 직접 연결 도메인과 개인 LAN 규칙을 분리하고, 원격 리소스의 업데이트 간격을 하루로 설정합니다.
rule-providers:
direct-domains:
type: http
behavior: domain
format: yaml
url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt
path: ./rules/direct-domains.yaml
interval: 86400
local-policy:
type: file
behavior: classical
format: yaml
path: ./rules/local-policy.yaml
rules:
- RULE-SET,local-policy,DIRECT
- DOMAIN-SUFFIX,github.com,프록시 선택
- RULE-SET,direct-domains,DIRECT
- GEOIP,CN,DIRECT
- MATCH,프록시 선택
원격 주소는 서드파티가 공개한 규칙 소스이며 코어가 실행 중에 다운로드합니다. 연결 가능 여부와 콘텐츠 업데이트는 해당 프로젝트에서 관리합니다. 파일 확장자가 .txt라고 해서 내용이 반드시 일반 텍스트 목록인 것은 아닙니다. 이 소스는 YAML의 payload 구조를 사용하므로 format: yaml로 지정합니다.
path는 코어 작업 디렉터리에 있는 캐시 또는 파일 경로이지 브라우저 다운로드 폴더가 아닙니다. GUI 클라이언트는 작업 디렉터리를 앱 데이터 폴더에 둘 수 있으므로 설치 프로그램 옆에 있다고 단정하지 마세요. type: file을 사용하는 경우에는 설정을 불러오기 전에 파일을 먼저 만들어야 합니다.
개인 규칙 파일 전체 내용
작업 디렉터리의 rules/local-policy.yaml에 아래 내용을 저장하세요. 파일형 provider는 일치 조건을 제공하고 최종 정책은 외부의 RULE-SET,local-policy,DIRECT에서 지정하므로 파일 안에 DIRECT를 추가하지 않습니다.
payload:
- DOMAIN-SUFFIX,home.arpa
- IP-CIDR,10.0.0.0/8,no-resolve
- IP-CIDR,172.16.0.0/12,no-resolve
- IP-CIDR,192.168.0.0/16,no-resolve
- IP-CIDR6,fc00::/7,no-resolve
behavior는 규칙 내용에 맞춰야 합니다
| behavior | 콘텐츠 예시 | 주의 사항 |
|---|---|---|
domain | '+ .example.com'을 실제로 사용할 때는 더하기 기호 뒤의 공백을 제거해야 합니다. 즉 '+.example.com'에 숨은 문자가 없어야 합니다. 출처에서 제공한 원본 내용을 그대로 사용하는 것이 좋습니다. | rules 전체 행이 아닌 도메인 목록 |
ipcidr | 192.168.0.0/16 | IP 주소 대역 목록 |
classical | DOMAIN-SUFFIX,home.arpa | 규칙 유형은 포함하지만 최종 정책은 포함하지 않음 |
광고 차단 문법, 완성된 Clash 설정 또는 웹페이지 HTML을 규칙 세트로 사용하지 마세요. 다운로드가 성공해도 응답 내용을 가져왔다는 뜻일 뿐, 파싱할 수 있다는 의미는 아닙니다. 파싱 오류가 발생하면 behavior, format, 들여쓰기와 응답 본문을 함께 확인하세요.
규칙 업데이트: 구독, 규칙 세트, 지리 데이터베이스 구분하기
세 데이터는 서로 다른 경로로 업데이트됩니다. 구독 업데이트는 보통 노드와 구독에 포함된 설정을 갱신하고, HTTP 규칙 세트는 provider의 interval에 따라 갱신됩니다. GEOIP 데이터베이스는 코어 또는 클라이언트의 해당 데이터베이스 업데이트 기능에서 관리합니다. ‘구독 업데이트’를 한 번 눌렀다고 세 가지가 모두 갱신되는 것은 아닙니다.
- 처음 불러올 때: 규칙 세트를 다운로드하고 파싱했는지 확인하세요. 사용할 수 있는 캐시가 없고 다운로드도 실패하면 설정이 예상대로 적용되지 않을 수 있습니다. 전체 직접 연결 목록이 자동으로 준비될 것이라고 가정하지 마세요.
- 정기 업데이트:
interval: 86400의 단위는 초이므로 24시간입니다. 일반 도메인 목록을 10초마다 요청하도록 설정할 필요는 없습니다. - 수동 확인: 클라이언트의 ‘규칙 세트’ 또는 관련 관리 페이지에서 업데이트하세요. 해당 기능이 없다면 클라이언트가 지원하는 방법으로 설정을 다시 불러오고 로그를 확인합니다.
- 로컬 파일:
type: file은 원격에서 콘텐츠를 가져오지 않습니다. 파일을 수정한 뒤 클라이언트가 지원하는 다시 불러오기 기능으로 코어에 변경 내용을 적용하세요.
원격 규칙도 검토가 필요한 설정 입력입니다. 대량의 직접 연결 목록 때문에 일부 로그인 또는 다운로드 서비스가 프록시를 우회할 수 있습니다. 특정 아웃바운드가 필요한 도메인은 개인 규칙을 공용 목록보다 앞에 두고, 검증이 끝난 설정 사본을 롤백용으로 보관하세요.
검증 순서: 일치한 규칙부터 최종 연결까지 확인하기
‘웹페이지가 열린다’는 것은 어떤 경로로든 접속할 수 있다는 뜻일 뿐, 분기 설정이 의도대로 작동한다는 증거는 아닙니다. 설정을 바꾼 뒤에는 테스트 페이지의 기존 연결을 종료하고 새로 요청해 변경 전 연결을 재사용하지 않도록 하세요. 필요한 경우 클라이언트의 ‘연결’ 페이지에서 해당 연결을 종료할 수 있지만, 진행 중인 다운로드도 중단될 수 있습니다.
세 가지 유형의 대상으로 규칙 확인하기
- LAN 대상: 라우터 주소가 실제로
192.168.1.1이라면 관리 페이지에 접속해 LAN 규칙이 적용되고 최종 아웃바운드가DIRECT인지 확인하세요. - 프록시를 사용할 도메인:
github.com에 접속해 앞쪽에 배치한 도메인 규칙이 적용되는지 확인하고, ‘프록시 선택’이 예상한 노드로 연결되는지도 확인하세요. - 일반 직접 연결 도메인: 공용 직접 연결 규칙 세트에 실제로 포함된 도메인을 선택하세요. 페이지 내용만 확인하지 말고
RULE-SET과 뒤에 있는 GEOIP 중 어느 규칙이 적용됐는지 확인합니다.
현재 설정의 혼합 프록시 포트가 실제로 7890이라면 아래 명령으로 로컬 HTTP 프록시를 명시적으로 거칠 수 있습니다. 포트 번호는 클라이언트에 표시된 값을 따르세요. 이 테스트는 명시적 프록시 경로를 확인하는 것이며 TUN 가로채기 테스트를 대신하지 않습니다.
curl --proxy http://127.0.0.1:7890 --head --max-time 15 https://github.com
Windows PowerShell에서 curl이 다른 명령에 연결되어 있다면 curl.exe를 사용하세요. HTTP 상태 코드만으로 판단할 필요는 없습니다. 리디렉션 응답이 와도 연결 기록을 함께 보면 요청 경로를 확인할 수 있습니다.
증상에 따라 문제 범위 좁히기
| 증상 | 우선 확인할 항목 | 해결 방법 |
|---|---|---|
| 모든 연결이 프록시를 거침 | 전역 모드, 너무 앞에 배치된 MATCH | 규칙 모드로 전환하고 MATCH를 목록 맨 끝으로 이동 |
| 도메인 규칙이 적용되지 않음 | 실제 요청 도메인, 연결에 IP만 표시되는지 여부 | 연결 세부 정보를 확인한 뒤 DNS와 도메인 복원 경로 점검 |
| 설정을 불러오지 못함 | 정책 그룹 이름, 중복 키, 들여쓰기 | 로그에 표시된 필드를 수정한 뒤 다시 불러오기 |
| 규칙 세트는 있지만 적용되지 않음 | RULE-SET 이름과 참조 위치 | provider 이름을 확인하고 앞선 규칙이 이미 적용됐는지 점검 |
| 구독 업데이트 후 규칙이 사라짐 | 수정한 항목이 자동 생성 설정인지 영구 오버라이드인지 확인 | 개인 규칙을 클라이언트의 영구 확장 설정으로 옮기기 |
개인 예외, LAN 규칙, 공용 도메인 목록, GEOIP, MATCH 순서로 정리하면 규칙을 이해하고 관리하기 쉽습니다. 규칙을 추가할 때마다 ‘무엇과 일치하는가, 어떤 정책을 사용하는가, 왜 이 위치에 두는가’를 설명할 수 있어야 합니다. 시스템 프록시나 TUN 가로채기 계층에 문제가 있다면 문제 해결 가이드를 확인하세요. 규칙 목록만으로는 코어에 들어오지 않은 트래픽을 처리할 수 없습니다.