Clash 설정 파일은 일반적으로 YAML로 작성합니다. 하나의 문서에 수신 포트, 실행 모드, DNS, 프록시 노드, 정책 그룹과 분기 규칙을 함께 넣습니다. 필드 순서는 보통 코어의 읽기에 영향을 주지 않지만, ‘기본 매개변수 → DNS → 노드 → 정책 그룹 → 규칙’ 순서로 작성하면 참조 관계와 들여쓰기 오류를 쉽게 찾을 수 있습니다.
이 글은 Clash for Windows 0.20.39에서 흔히 사용하는 설정 구조와 mihomo v1.19 계열의 설정 의미를 기준으로 합니다. 코어마다 지원하는 프로토콜, TUN 매개변수와 DNS 확장 필드는 완전히 같지 않습니다. 구독으로 생성된 설정을 수정하기 전에는 다음 구독 업데이트에서 수동 변경 사항이 덮어써지지 않도록 로컬 사본을 별도로 저장하는 것이 좋습니다.
YAML 문법과 최상위 구조
들여쓰기, 목록과 키-값
YAML은 공백으로 계층을 표현하며 Tab을 들여쓰기로 사용할 수 없습니다. 일반적으로 각 계층에 공백 2칸을 사용합니다. 콜론 뒤에는 공백 하나를 넣고, 목록 항목은 하이픈으로 시작합니다. 노드, 정책 그룹과 규칙은 서로 다른 최상위 키 아래에 있으며, 계층이 한 칸만 어긋나도 파일 전체를 불러오지 못할 수 있습니다.
port: 7890
mode: rule
proxies:
- name: "예시 노드"
type: ss
server: 203.0.113.10
port: 443
proxy-groups:
- name: "노드 선택"
type: select
proxies:
- "예시 노드"
- DIRECT
rules:
- MATCH,노드 선택
port: 7890은 키-값이고, proxies: 뒤에는 목록이 옵니다. - name:으로 시작하는 각 항목은 하나의 노드 객체입니다. 콜론, 샵, 별표가 포함되거나 불리언으로 인식될 수 있는 이름은 따옴표로 감싸는 것이 좋습니다. 예를 들어 노드 이름을 "HK: 01"로 작성하면 콜론이 매핑 구분자로 해석되는 것을 막을 수 있습니다.
자주 발생하는 파싱 오류
- 들여쓰기 불일치:
did not find expected key,mapping values are not allowed와 같은 메시지가 흔히 표시됩니다. - 중복 키: 파일에 최상위
dns:가 두 개 있으면 파서에 따라 로드를 거부하거나 마지막 항목만 남길 수 있습니다. - 목록의 하이픈 누락:
rules,proxies와 정책 그룹 안의proxies는 모두 목록입니다. - 이름이 정확히 일치하지 않음:
홍콩 선택과홍콩 선택은 서로 다른 문자열입니다. 끝의 공백 하나만 있어도 정책 그룹 참조가 실패합니다. - 주석으로 인한 내용 잘림: 샵은 일반적으로 주석의 시작을 의미합니다. 비밀번호나 이름에
#이 포함되면 따옴표를 사용해야 합니다.
포트, LAN과 실행 모드 필드
파일 앞부분에는 보통 인바운드 수신 포트와 기본 실행 매개변수가 들어갑니다. 다음 예시는 HTTP, SOCKS5와 혼합 프록시에 각각 포트를 설정합니다. 실제 사용에서는 세 포트를 모두 켤 필요가 없으며, 데스크톱 클라이언트에서는 mixed-port를 가장 많이 사용합니다.
port: 7890
socks-port: 7891
mixed-port: 7892
allow-lan: false
bind-address: "*"
mode: rule
log-level: info
ipv6: false
external-controller: 127.0.0.1:9090
secret: "change-this-controller-secret"
세 프록시 포트의 차이
port: HTTP 프록시 포트입니다. 애플리케이션에서 HTTP 프록시 설정을 지원해야 합니다.socks-port: SOCKS4, SOCKS4a 또는 SOCKS5 지원 범위는 코어에 따라 다르며, 일반적인 클라이언트에서는 SOCKS5로 사용합니다.mixed-port: 하나의 포트에서 HTTP와 SOCKS 요청을 모두 받습니다. 흔히 사용하는 값은7890또는7892입니다.
동일한 IP와 포트는 두 프로그램이 동시에 수신할 수 없습니다. 로그에 address already in use 또는 bind: Only one usage of each socket address가 표시되면 먼저 이전 Clash 프로세스, 다른 프록시 도구 또는 로컬 개발 서버가 포트를 사용 중인지 확인하세요. Windows에서는 터미널에서 netstat -ano | findstr :7890을 실행해 해당 PID를 찾을 수 있습니다.
allow-lan과 bind-address
allow-lan: false는 LAN 기기에 프록시 진입점을 제공하지 않는다는 뜻입니다. true로 바꾸면 휴대폰이나 다른 컴퓨터에서 현재 컴퓨터의 LAN 주소를 프록시 서버로 입력할 수 있습니다. 예: 192.168.1.20:7890. 이때 해당 포트가 Windows 방화벽을 통과하도록 허용해야 합니다.
bind-address는 수신 주소를 결정합니다. 로컬에서만 사용할 때는 127.0.0.1에 바인딩하는 것이 명확합니다. LAN에서 접근해야 한다면 코어 지원 여부에 따라 * 또는 특정 네트워크 인터페이스 주소를 사용할 수 있습니다. allow-lan만 수정한다고 해서 다른 기기의 연결이 보장되는 것은 아닙니다. 방화벽, 게스트 네트워크 격리와 라우터의 AP 격리도 접근을 차단할 수 있습니다.
mode, log-level과 제어 포트
mode: rule:rules를 위에서부터 순서대로 매칭합니다. 일상적인 사용에서 주로 쓰는 모드입니다.mode: global: 트래픽을 모두 전역 정책 그룹으로 전달합니다. 짧은 시간 동안 노드 연결 상태를 테스트할 때 적합합니다.mode: direct: 프록시 노드를 거치지 않고 직접 연결합니다. 프록시가 장애 원인인지 확인할 때 적합합니다.log-level: 일반적인 값으로silent,error,warning,info,debug가 있습니다. 문제를 진단할 때는 일시적으로debug를 사용하고, 완료 후info로 되돌려 로그가 지나치게 쌓이지 않도록 하세요.external-controller: 제어 API를 제공합니다. 일반적으로 사용하는 로컬 주소는127.0.0.1:9090입니다.secret을 설정하면 제어 패널이 연결할 때 동일한 키를 함께 보내야 합니다.
DNS 섹션: 수신, 리졸버와 향상 모드
DNS 섹션은 도메인을 해석하는 방식을 결정합니다. 규칙 매칭뿐 아니라 TUN 모드에서 도메인 요청을 가로채는 방식에도 영향을 줍니다. 일반적인 기본 구조는 다음과 같습니다.
dns:
enable: true
listen: 127.0.0.1:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "localhost.ptlogin2.qq.com"
- "+.msftconnecttest.com"
default-nameserver:
- 223.5.5.5
- 1.1.1.1
nameserver:
- https://dns.alidns.com/dns-query
- tls://1.1.1.1:853
fallback:
- https://dns.google/dns-query
fallback-filter:
geoip: true
geoip-code: CN
enable, listen과 default-nameserver
enable은 내장 DNS 모듈을 제어합니다. listen은 DNS 서비스의 수신 주소이며, 예시에서는 로컬 UDP/TCP 포트 1053을 사용합니다. 다른 로컬 DNS 프로그램이 해당 포트를 이미 사용 중이면 로그에 수신 실패가 표시됩니다.
default-nameserver는 주로 DoH, DoT 등 업스트림 서버 자체의 도메인을 해석하는 데 사용되며, 부트스트랩 DNS라고도 합니다. 순환 의존을 피하려면 여기에는 먼저 해석해야 하는 도메인이 아니라 직접 접근할 수 있는 IP 주소를 입력하는 것이 일반적입니다.
nameserver, fallback과 정책 기반 해석
nameserver는 주 리졸버로, 일반 DNS 주소뿐 아니라 DoH 또는 DoT 주소도 사용할 수 있습니다. fallback과 fallback-filter는 기존 Clash 설정에서 흔히 사용하는 보조 해석 구조입니다. mihomo는 nameserver-policy, proxy-server-nameserver, direct-nameserver 등 세분화된 필드도 지원하므로 도메인 규칙이나 프록시 노드 해석 목적에 따라 서로 다른 업스트림을 선택할 수 있습니다.
“DNS를 여러 개 적었다”고 해서 모든 요청이 항상 모든 응답을 동시에 사용하는 것은 아닙니다. 코어는 필드의 의미, 필터 조건과 응답 결과에 따라 해석 경로를 선택합니다. 도메인은 해석되지만 웹사이트가 열리지 않는다면 DNS 로그, 규칙 매칭과 노드 연결을 함께 확인해야 하며 브라우저 오류만으로 판단해서는 안 됩니다.
fake-ip과 redir-host
fake-ip: 먼저 도메인에 예약 주소 대역의 매핑 주소를 반환한 뒤, 코어가 연결을 다시 도메인으로 복원합니다. 투명 프록시 환경에서 도메인 정보를 유지하기 좋으며, 흔히 사용하는 주소 풀은198.18.0.1/16입니다.redir-host: 먼저 실제 IP를 얻은 다음 해석 결과에 따라 연결을 처리합니다. 일부 LAN 기기, 오래된 소프트웨어 또는 특수 인증 환경에서는 이 방식이 더 직접적으로 호환됩니다.fake-ip-filter: LAN 도메인, 연결성 검사 도메인 또는 Fake IP 사용에 적합하지 않은 도메인이 실제 결과를 반환하도록 합니다. 필터 범위가 너무 넓으면 Fake IP의 도메인 식별 효과가 약해집니다.
proxies: 개별 프록시 노드 필드
proxies에는 직접 정의한 노드를 저장합니다. 구독에서는 보통 이 섹션이 자동으로 생성됩니다. 프로토콜마다 필드는 다르지만, 각 노드에는 최소한 고유 이름, 프로토콜 유형, 서버 주소와 포트가 필요합니다.
proxies:
- name: "SS-HK-01"
type: ss
server: hk.example.net
port: 443
cipher: aes-128-gcm
password: "example-password"
udp: true
- name: "VMess-JP-01"
type: vmess
server: jp.example.net
port: 443
uuid: 11111111-2222-3333-4444-555555555555
alterId: 0
cipher: auto
tls: true
servername: jp.example.net
network: ws
ws-opts:
path: /gateway
headers:
Host: jp.example.net
공통 필드와 프로토콜별 필드
name: 정책 그룹에서 노드를 참조하는 이름으로, 한 글자까지 정확히 일치해야 합니다. 이름이 중복되면 선택 결과가 불명확해지므로 고유하게 유지하세요.type: 프로토콜 유형입니다. 예를 들어ss,vmess,trojan이 있습니다. mihomo는 더 많은 프로토콜도 지원하지만 실제 사용 가능 여부는 현재 코어에 따라 달라집니다.server와port: 서버 도메인 또는 IP와 포트입니다. 포트는 보통 1에서 65535 사이의 정수이며, 공백이 포함된 문자열로 작성하면 검증에 실패할 수 있습니다.udp: 노드에서 UDP 전달을 사용할지 지정합니다. UDP를 지원하지 않는 프로토콜이나 서버가 이 설정만으로 자동 지원되는 것은 아닙니다.tls,servername또는sni: TLS와 서버 이름을 제어합니다. 필드 이름은 프로토콜과 코어 버전에 따라 다르므로 모든 노드에 기계적으로 복사해서는 안 됩니다.skip-cert-verify: 인증서 검증을 건너뛰면 연결 상대의 신원 확인 기능이 약해집니다. 인증서 오류가 발생하면 먼저 시스템 시간, SNI, 인증서 도메인과 서버 설정을 확인하세요.
노드가 목록에 표시된다는 것은 YAML이 파싱되었다는 뜻일 뿐, 연결 매개변수가 올바르다는 의미는 아닙니다. 인증 정보 오류는 핸드셰이크 실패로 나타나는 경우가 많고, 서버 주소를 해석할 수 없으면 DNS 오류가 표시됩니다. WebSocket 경로 또는 Host가 일치하지 않으면 대개 연결 직후 끊깁니다. 진단할 때는 클라이언트에서 ‘로그’를 열고 수준을 일시적으로 debug로 바꾼 다음, 특정 노드 하나를 대상으로 지연 시간을 테스트하세요.
proxy-providers와 proxy-groups
노드 제공자 proxy-providers
proxy-providers를 사용하면 로컬 파일이나 원격 주소에서 노드 묶음을 불러올 수 있습니다. 모든 노드를 proxies에 직접 작성하는 것보다 노드 출처와 정책 그룹 구조를 분리해 관리하기에 적합합니다.
proxy-providers:
provider-main:
type: http
url: "https://example.com/subscription"
path: ./providers/provider-main.yaml
interval: 3600
health-check:
enable: true
interval: 600
url: https://www.gstatic.com/generate_204
interval: 3600은 3600초마다 한 번 업데이트를 확인한다는 뜻입니다. 상태 검사에서 interval: 600은 10분마다 테스트를 실행합니다. 제공자 다운로드에 실패하면 구독 주소의 접근 가능 여부, 시스템 시간, 프록시 시작 단계의 순환 의존 여부와 저장 경로의 쓰기 권한을 확인하세요.
정책 그룹 유형과 참조
proxy-groups:
- name: "노드 선택"
type: select
proxies:
- "자동 선택"
- "장애 조치"
- DIRECT
use:
- provider-main
- name: "자동 선택"
type: url-test
use:
- provider-main
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 80
- name: "장애 조치"
type: fallback
use:
- provider-main
url: https://www.gstatic.com/generate_204
interval: 300
select: 사용자가 노드, 내장 정책 또는 다른 정책 그룹을 직접 선택합니다.url-test: 후보 노드를 정기적으로 테스트하고, 사용 가능한 항목 중 테스트 결과가 가장 낮은 것을 선택합니다. 지연 시간은 테스트 주소까지의 요청 시간이며 모든 웹사이트의 실제 다운로드 속도와 같지는 않습니다.fallback: 후보 순서에 따라 사용 가능한 노드를 선택하고, 현재 노드를 사용할 수 없으면 다음 노드로 전환합니다.load-balance: 코어가 지원하는 방식에 따라 여러 노드에 연결을 분산합니다. 세션 일관성 요구 사항을 명확히 이해하고 있는 환경에 적합합니다.proxies: 노드 이름 또는 정책 그룹 이름을 직접 나열합니다.use: 하나 이상의 proxy-provider를 참조합니다.
tolerance: 80은 지연 시간 차이가 80밀리초 이내라면 자동 선택 그룹이 자주 전환하지 않도록 합니다. 값이 너무 작으면 가벼운 네트워크 변동에도 노드가 반복해서 바뀔 수 있고, 너무 크면 눈에 띄게 느려진 노드를 계속 유지할 수 있습니다. 가정용 광대역에서는 50~100밀리초부터 조정해 보세요.
rules와 rule-providers: 트래픽 분기의 매칭 순서
rules는 연결을 어느 정책 그룹으로 보낼지 결정합니다. 규칙은 위에서 아래로 매칭되며 첫 번째 규칙이 일치하면 검사를 멈춥니다. 따라서 구체적인 규칙일수록 앞에 두고, 최종 대체 규칙은 마지막에 배치하는 것이 일반적입니다.
rules:
- DOMAIN,api.example.com,노드 선택
- DOMAIN-SUFFIX,example.net,노드 선택
- DOMAIN-KEYWORD,stream,자동 선택
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,노드 선택
자주 사용하는 규칙 유형
DOMAIN: 완전한 도메인만 매칭합니다. 예:api.example.com.DOMAIN-SUFFIX: 지정한 도메인과 하위 도메인을 매칭합니다. 예:example.net.DOMAIN-KEYWORD: 도메인에 포함된 키워드로 매칭합니다. 범위가 넓으므로 키워드가 너무 짧으면 오탐이 발생하기 쉽습니다.IP-CIDR: IPv4 네트워크 대역을 매칭합니다. IPv6에는 일반적으로IP-CIDR6을 사용합니다.GEOIP: 대상 IP의 지리 데이터베이스 결과를 기준으로 매칭합니다. 데이터베이스 버전에 따라 결과가 달라질 수 있으며, 이를 도메인 소유 지역과 동일하게 볼 수는 없습니다.MATCH: 최종 대체 규칙입니다. 기존 설정에서는FINAL도 흔히 사용되지만, 실제 지원 여부는 현재 코어를 기준으로 확인해야 합니다.
no-resolve는 일부 IP 규칙이 매칭을 위해 추가 도메인 해석을 수행하지 않도록 합니다. 모든 규칙에 필요한 공통 접미사는 아닙니다. MATCH를 첫 줄에 두면 뒤의 규칙은 절대 매칭될 수 없습니다. 존재하지 않는 정책 그룹을 규칙에서 참조하면 로드 시 즉시 오류가 나거나, 연결 처리 중 정책을 찾을 수 없다는 메시지가 표시될 수 있습니다.
규칙 제공자 rule-providers
rule-providers:
private-network:
type: http
behavior: ipcidr
format: yaml
url: "https://example.com/rules/private-network.yaml"
path: ./ruleset/private-network.yaml
interval: 86400
rules:
- RULE-SET,private-network,DIRECT
- MATCH,노드 선택
behavior는 규칙 세트의 내용과 일치해야 하며, 일반적인 값으로 domain, ipcidr, classical이 있습니다. 도메인 규칙 세트를 ipcidr로 선언하면 내용을 올바르게 파싱할 수 없습니다. mihomo의 규칙 세트에는 format도 관련되므로 원격 파일이 YAML, 텍스트 또는 바이너리 형식일 때 해당 값을 반드시 지정해야 합니다.
TUN 섹션과 투명 프록시 매개변수
TUN 모드는 가상 네트워크 인터페이스를 만들어 별도의 프록시 설정이 없는 애플리케이션의 트래픽을 가로챕니다. 시스템 프록시와는 다른 진입점입니다. mihomo에서 흔히 사용하는 설정은 다음과 같습니다.
tun:
enable: true
stack: mixed
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
strict-route: false
stack: 일반적인 값으로system,gvisor,mixed가 있으며, 구체적인 지원 범위는 코어 버전과 플랫폼에 따라 다릅니다.dns-hijack: 지정한 포트의 DNS 요청을 코어가 처리하도록 전달합니다. 예시에서는 UDP와 TCP의 53번 포트 요청을 가로챕니다.auto-route: 필요한 라우트를 자동으로 추가합니다. Windows에서 활성화에 실패하면 클라이언트 권한, 가상 네트워크 어댑터와 다른 VPN 소프트웨어의 라우팅을 확인하세요.auto-detect-interface: 기본 출구 네트워크 인터페이스를 자동으로 식별합니다. Wi-Fi와 유선 네트워크를 전환하는 기기에 적합합니다.strict-route: 더 엄격한 라우팅 제약을 적용합니다. 누수 제어에는 도움이 될 수 있지만 LAN, 가상 머신 또는 특정 기업 네트워크에 영향을 줄 수도 있습니다.
TUN을 켠 뒤 ‘브라우저는 열리지만 게임이 인터넷에 연결되지 않음’ 또는 ‘LAN 기기에 접근할 수 없음’ 문제가 발생하면 실행 권한, 라우팅 테이블, DNS 가로채기, LAN 대역의 직접 연결 규칙과 다른 VPN을 차례로 확인하세요. 기본 라우트를 만드는 네트워크 도구를 여러 개 동시에 켜지 마세요. Windows에서는 route print를 실행해 기본 라우트와 인터페이스 우선순위도 확인할 수 있습니다.
읽기 쉬운 최소 설정과 문제 해결 절차
다음 구조는 실제 인증 정보는 생략했지만 진입점부터 규칙까지의 전체 참조 흐름은 유지합니다. 설정을 확인할 때는 마지막 줄의 정책 그룹에서 역으로 추적할 수 있습니다. 규칙은 ‘노드 선택’을 참조하고, ‘노드 선택’은 ‘예시 노드’를 참조하며, ‘예시 노드’에는 서버 매개변수가 들어 있습니다.
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
default-nameserver:
- 223.5.5.5
nameserver:
- https://dns.alidns.com/dns-query
proxies:
- name: "예시 노드"
type: ss
server: 203.0.113.10
port: 443
cipher: aes-128-gcm
password: "replace-with-valid-password"
udp: true
proxy-groups:
- name: "노드 선택"
type: select
proxies:
- "예시 노드"
- DIRECT
rules:
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,노드 선택
오류 유형별 단계적 점검
- 파일을 불러올 수 없음: 먼저 Tab, 들여쓰기, 콜론, 따옴표와 중복 키를 확인하세요. 이 단계에서는 코어가 설정을 아직 읽지 못했으므로 노드 테스트를 먼저 해서는 안 됩니다.
- 설정은 로드되지만 정책 그룹이 비어 있음:
proxies에 노드가 있는지,use의 제공자 이름이 올바른지, provider 파일이 정상적으로 다운로드되었는지 확인하세요. - 노드 테스트 실패: server, port, 인증 필드, TLS 이름과 전송 매개변수를 확인한 뒤 서버 도메인을 해석할 수 있는지도 점검하세요.
- 일부 웹사이트만 열리지 않음: 연결 로그에서 매칭된 규칙, 대상 도메인, 정책 그룹과 실제 노드를 확인하고, 규칙 순서 때문에 트래픽이 너무 일찍 DIRECT 또는 REJECT로 전달되지 않았는지 점검하세요.
- 시스템 프록시는 작동하지만 다른 프로그램이 프록시를 사용하지 않음: 해당 프로그램이 시스템 프록시를 따르는지 확인하세요. 따르지 않는 경우에만 TUN을 검토하고, 넓은 범위의 규칙을 반복해서 추가해 진입점 문제를 가리지 마세요.
- 구독 업데이트 후 변경 사항이 사라짐: 로컬 DNS, TUN 또는 규칙 변경을 클라이언트가 지원하는 오버라이드나 병합 설정으로 옮기세요.
필드 호환성과 유지 관리 권장 사항
Clash for Windows 0.20.39에서 사용하는 Clash 코어 설정은 계속 업데이트되는 mihomo 설정과 완전히 동일하지 않습니다. 최신 구독에는 이전 코어가 인식하지 못하는 프로토콜, 규칙 세트 형식 또는 DNS 필드가 포함될 수 있습니다. field not found, unsupported proxy type와 같은 오류가 발생하면 화면에 표시된 이름만 보지 말고 클라이언트가 실제로 호출하는 코어와 버전을 먼저 확인하세요.
일상적인 유지 관리에서는 설정을 세 종류로 나누는 것이 좋습니다. 구독은 노드를, 규칙 제공자는 업데이트 가능한 규칙 세트를, 로컬 오버라이드는 포트, DNS와 TUN을 담당하도록 구성합니다. 이렇게 하면 수동 병합을 줄이고 문제를 명확한 영역에 한정할 수 있습니다. 수정할 때마다 한 가지 주제만 변경하세요. 예를 들어 먼저 DNS를 수정하고 다시 로드한 뒤 해석이 정상인지 확인하고 TUN을 활성화합니다.
설정 파일의 핵심 관계는 복잡하지 않습니다. 인바운드 포트가 트래픽을 받고, DNS가 도메인 정보를 제공하며, 규칙이 정책 그룹을 결정하고, 정책 그룹이 노드를 선택하고, 노드가 원격 연결을 수립합니다. 이 흐름을 따라 점검하는 편이 노드를 계속 바꾸거나 YAML 전체를 한 번에 교체하는 것보다 특정 필드를 찾기 쉽습니다.