규칙 기반 분기가 필요한 이유
규칙 기반 분기의 핵심 목적은 간단합니다. 중국 본토 사이트에 접속하는 트래픽은 로컬 직결로 보내고, 해외 사이트에 접속하는 트래픽은 프록시 노드로 보내서 두 경로가 서로 간섭하지 않도록 하는 것입니다. 직결의 장점은 지연이 낮고 노드 대역폭을 소모하지 않는다는 점이고, 프록시 노드의 장점은 접속이 제한되거나 속도가 느린 해외 리소스에 접근할 수 있다는 점입니다. 분기를 하지 않으면 전역 모드에서 모든 트래픽이 프록시를 거치게 되어, 중국 본토 사이트 접속 시에도 우회 경로를 타면서 지연이 늘어나고 노드의 업링크 대역폭도 소모하게 되며, 피크 시간대에 프록시 제공업체 측 속도 제한이 걸리면 체감 속도가 더 나빠집니다.
분기를 구현하려면 Clash(및 그 코어 구현체인 Clash Meta / mihomo) 설정 파일에서 서로 맞물려 동작하는 두 부분을 이해해야 합니다. proxy-groups는 "어떤 출구 정책을 선택할 수 있는지"를 정의하고, rules는 "어떤 트래픽이 어떤 정책을 타야 하는지"를 정의합니다. 규칙 자체는 노드를 선택하지 않으며, 노드를 선택하는 것은 정책 그룹입니다. 규칙은 트래픽을 특정 정책 그룹에 배정할 뿐이고, 실제로 어떤 경로를 타는지는 정책 그룹 내부의 선택 로직이 결정합니다. 이 계층 구조를 이해하는 것이 이후 모든 설정을 파악하는 전제 조건입니다.
proxy-groups 작성법
정책 그룹은 본질적으로 여러 프록시 노드(또는 다른 정책 그룹)의 집합에 선택 방식을 더한 것입니다. 자주 쓰는 type은 세 가지입니다:
- select: 수동 선택. 클라이언트 화면에 드롭다운 목록이 표시되며, 사용자가 클릭한 항목으로 접속하고 자동으로 전환되지 않습니다.
- url-test: 자동 속도 측정. url과 interval에 따라 그룹 내 노드의 지연을 주기적으로 측정하고, 가장 빠른 노드를 자동으로 선택합니다.
- fallback: 장애 자동 전환. 노드 목록 순서대로 시도하며, 현재 노드를 사용할 수 없으면 자동으로 다음 노드로 전환합니다.
일반적인 지역별 분기 시나리오에는 최소 세 개의 정책 그룹이 필요합니다. "해외 트래픽"용 자동 속도 측정 그룹 하나, 고정된 DIRECT(직결, 코어에 내장되어 있어 별도로 노드를 정의할 필요 없음) 하나, 그리고 최종 대비용 수동 선택 그룹 하나입니다. 예시:
proxy-groups:
- name: 노드 선택
type: select
proxies:
- 자동 선택
- DIRECT
- name: 자동 선택
type: url-test
proxies:
- HK-01
- HK-02
- SG-01
- JP-01
url: http://www.gstatic.com/generate_204
interval: 300
tolerance: 50
- name: 중국 직결
type: select
proxies:
- DIRECT
- 노드 선택
여기서 HK-01 같은 이름은 구독을 파싱해서 얻은 실제 노드 이름과 일치해야 합니다. 보통 클라이언트에 구독을 가져오면 노드 목록에서 실제 이름을 바로 확인할 수 있으므로, 이를 참고해 정책 그룹의 proxies 필드를 조정하면 됩니다. url은 속도 측정 요청을 보낼 대상 주소이고, interval은 측정 주기(초 단위)이며, tolerance는 전환 허용 오차로, 지연 차이가 이 범위 내에 있으면 노드가 자주 바뀌지 않습니다.
rules 규칙 유형과 매칭 순서
규칙은 위에서 아래로 순서대로 하나씩 매칭되며, 어떤 규칙이 매칭에 성공하면 즉시 적용되고 그 이후의 규칙은 더 이상 검사하지 않습니다. 즉 규칙의 배열 순서가 분기 결과를 직접 결정하며, 순서를 반대로 적어 놓는 것이 가장 흔한 실수입니다. 자주 쓰는 규칙 유형은 다음과 같습니다:
- DOMAIN-SUFFIX: 도메인 접미사로 매칭합니다. 예를 들어
DOMAIN-SUFFIX,taobao.com은 해당 도메인과 그 모든 하위 도메인에 매칭됩니다. - DOMAIN-KEYWORD: 도메인에 포함된 키워드로 매칭합니다. 매칭 범위가 더 넓어 오탐이 쉬우므로, 키워드의 고유성이 명확할 때만 사용하는 것을 권장합니다.
- DOMAIN: 하위 도메인을 포함하지 않고 특정 도메인 하나만 정확히 매칭합니다.
- GEOIP: 대상 IP가 속한 국가/지역으로 매칭합니다. 예를 들어
GEOIP,CN,DIRECT는 대상 IP가 중국 본토로 판정되면 직결한다는 의미입니다. GEOIP 매칭은 내장 또는 외부 IP 지리 데이터베이스에 의존하며, 데이터베이스 버전이 오래되면 오판이 발생할 수 있으므로 클라이언트가 지리 데이터베이스 파일을 주기적으로 업데이트하도록 하는 것이 좋습니다. - IP-CIDR / IP-CIDR6: IP 대역으로 매칭하며, 사설망 주소나 로컬 네트워크 주소를 직결 처리할 때 자주 사용됩니다.
- MATCH: 최종 대비 규칙으로, 규칙 목록의 마지막 줄에 두며 앞의 어떤 규칙에도 걸리지 않은 모든 트래픽에 매칭됩니다.
규칙은 "유형,매칭 내용,목표 정책"의 세 부분으로 구성되며 쉼표로 구분합니다. 완전한 규칙 목록의 대략적인 구조는 다음과 같습니다:
rules:
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-KEYWORD,baidu,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- GEOIP,CN,중국 직결
- MATCH,노드 선택
이 규칙을 읽는 방법은 다음과 같습니다. 먼저 명확히 중국 본토에 속하는 도메인과 로컬 네트워크 주소를 제외해 DIRECT로 보냅니다. 나머지 IP 중 중국 본토로 판정되는 것은 "중국 직결" 정책 그룹으로 보냅니다(내부적으로는 여전히 DIRECT를 타지만, 수동 전환의 여지를 남겨 둔 것입니다). 마지막으로 앞의 어떤 규칙에도 걸리지 않은 모든 트래픽은 "노드 선택"이라는 자동 속도 측정 그룹으로 보내 해외 접속을 처리하도록 합니다.
순서를 잘못 두는 것이 가장 흔한 함정입니다. MATCH,노드 선택을 중간에 두면, 그 뒤에 나오는 중국 본토 도메인 관련 규칙은 더 이상 검사되지 않습니다. MATCH가 그 이후에 들어오는 모든 트래픽 판단을 가로채기 때문입니다. MATCH는 반드시 규칙 목록의 마지막 줄에만 두어야 합니다.
스트리밍 서비스를 위한 별도 정책 그룹 만들기
많은 사용자가 스트리밍 서비스는(예를 들어 해제 가능하다고 표시된) 특정 노드 몇 개로 고정해서 접속하기를 원하며, "자동 선택" 그룹처럼 속도 측정 결과에 따라 계속 바뀌는 것을 원하지 않습니다. 이렇게 하면 영상을 보는 중에 노드가 갑자기 바뀌어 버퍼링이 다시 발생하는 것을 막을 수 있습니다. 방법은 전용 정책 그룹을 하나 새로 만들고, 규칙에서 해당 도메인을 별도로 이 그룹에 지정하되, 이 규칙을 일반 규칙보다 앞에 두는 것입니다:
proxy-groups:
- name: 스트리밍
type: select
proxies:
- HK-01
- SG-01
- 자동 선택
rules:
- DOMAIN-SUFFIX,netflix.com,스트리밍
- DOMAIN-SUFFIX,nflxvideo.net,스트리밍
- DOMAIN-SUFFIX,disneyplus.com,스트리밍
- DOMAIN-SUFFIX,cn,DIRECT
- GEOIP,CN,중국 직결
- MATCH,노드 선택
여기서 핵심은 스트리밍 관련 도메인 규칙을 반드시 MATCH보다 앞에 두고, 가능하면 다른 일반 규칙보다도 앞에 두어야 한다는 점입니다. 그렇지 않으면 앞쪽에 있는 더 넓은 범위의 규칙(예: 어떤 DOMAIN-KEYWORD 규칙)에 먼저 가로채일 수 있습니다. 규칙 목록에서는 더 구체적이고 정밀한 제어가 필요한 항목일수록 앞쪽에 두고, 더 포괄적인 최종 대비 규칙일수록 뒤쪽에 두어야 합니다.
스트리밍 도메인을 규칙 세트(rule-provider) 형태의 도메인 목록으로 관리하는 경우도 원리는 동일합니다. DOMAIN-SUFFIX를 하나씩 나열하는 대신 원격이나 로컬에서 관리하는 규칙 세트 파일을 참조하는 방식으로 바뀔 뿐이며, rule-providers 필드와 그에 대응하는 RULE-SET 규칙 유형이 추가되지만 매칭 순서의 논리는 전혀 달라지지 않습니다.
규칙 모드와 전역 모드의 차이
클라이언트 화면에서는 보통 세 가지 실행 모드를 전환할 수 있는데, 이 모드들이 위에서 설명한 설정과 어떤 관계인지 이해하는 것이 중요합니다:
- 규칙 모드(Rule):
rules목록을 순서대로 그대로 매칭하는 방식으로, 이 글에서 설명한 기본 동작 방식입니다. - 전역 모드(Global): 모든
rules를 무시하고 모든 트래픽이 수동으로 지정한 하나의 노드로만 나갑니다. 특정 노드가 정상적으로 작동하는지 임시로 테스트할 때 적합하며, 장기간 사용하기에는 적합하지 않습니다. - 직결 모드(Direct): 모든
rules를 무시하고 모든 트래픽이 어떤 프록시 노드도 거치지 않고 직결됩니다. 프록시가 특정 연결 문제에 영향을 주는지 임시로 확인할 때 적합합니다.
일상적으로 사용할 때는 규칙 모드로 고정해 두어야 하며, 문제를 진단할 때만 잠시 전역 모드나 직결 모드로 전환해 비교 테스트를 하면 됩니다. 테스트가 끝나면 반드시 다시 전환해 두어야 하며, 그렇지 않으면 규칙 기반 분기 효과가 적용되지 않습니다.
규칙 작성 후 스스로 점검하는 방법
- 설정을 저장한 뒤, 클라이언트에서 설정 다시 불러오기를 선택합니다(클라이언트에 따라 "리로드" 또는 "새로고침"으로 표시될 수 있습니다). 에디터 캐시 때문에 규칙이 실제로 적용되지 않는 상황을 피할 수 있습니다.
- 클라이언트에 내장된 연결 로그나 트래픽 패널을 열어, 이미 알고 있는 중국 본토 사이트에 접속해 보고 매칭된 규칙과 최종 정책이 DIRECT인지 확인합니다.
- 이어서 이미 알고 있는 해외 사이트에 접속해 보고, 매칭된 규칙이 예상한 정책 그룹으로 떨어지는지, 해당 정책 그룹에서 현재 선택된 노드 상태가 정상인지 확인합니다.
- 특정 도메인이 잘못된 정책으로 흘러갔다면, 그 도메인 규칙보다 앞쪽에 있는 더 포괄적인 규칙(특히 DOMAIN-KEYWORD)에 먼저 가로채인 것은 아닌지 확인합니다.
- GEOIP 판정이 이상하다면, 클라이언트의 지리 데이터베이스 파일 업데이트 시점을 확인합니다. 데이터베이스가 오래되면 일부 IP의 소속 판정이 부정확해질 수 있습니다.
규칙 기반 분기는 한 번 작성하면 끝나는 것이 아닙니다. 접속하는 사이트가 바뀌거나 노드가 늘고 줄면서 정책 그룹의 노드 목록과 일부 도메인 규칙을 계속 미세 조정해야 할 수 있습니다. 감으로 짐작하기보다 먼저 로그를 확인한 뒤 규칙을 수정하는 습관을 들이면 문제를 훨씬 쉽게 찾아낼 수 있습니다.
모든 규칙을 직접 작성하고 싶지 않다면, 대부분의 프록시 제공업체나 커뮤니티에서 관리하는 규칙 세트(중국 본토 직결, 로컬 네트워크 직결, 주요 서비스별로 정리된 규칙 파일 등)를 rule-providers로 참조할 수 있습니다. 이렇게 하면 직접 관리해야 하는 도메인 항목 수를 줄이면서도, 사용자 정의 규칙이 먼저 매칭되는 우선권은 그대로 유지할 수 있습니다.