가져오기
Chute는 다른 클라이언트용으로 작성된 프록시 구성을 가져올 수 있습니다. 두 종류의 입력을 허용합니다: 단일 노드 공유 링크(ss://, vmess://, …), 그리고 Clash/mihomo YAML 또는 sing-box JSON 형식의 프로필 전체입니다. 둘 다 네이티브 Chute 구성으로 변환됩니다 — 변환 후 얻는 것은 [Proxy], [Proxy Group], [Rule] 섹션을 가진 평범한 Chute 프로필이며, Chute가 계속 해석하는 외부 형식 파일이 아닙니다.
http:// 및 https:// 주소는 결코 공유 링크로 취급되지 않습니다. 이들은 구독 주소입니다: 먼저 내용을 다운로드한 뒤, 본문이 무엇으로 판명되는지에 따라 가져오기가 진행됩니다.
공유 링크
공유 링크 — 링크 하나, 또는 본문이 그런 링크의 목록인 구독 — 는 Chute Mac만 가져옵니다. Chute iOS에는 공유 링크 가져오기가 없습니다: 첫 실행 안내에서 ss://, vmess://, vless://, trojan://, hysteria2://, socks5://, ssh:// 링크를 담은 QR 코드를 스캔해 서버 하나를 설정할 수 있지만, 그 링크에서 가져오는 것은 서버 주소, 포트, 자격 증명 정도뿐입니다 — 포트가 없는 링크에는 아래 표의 기본 포트가 쓰입니다. Chute tvOS와 Chute Android는 공유 링크를 읽지 않습니다.
| 스킴 | 결과 정책 유형 | 기본 포트 |
|---|---|---|
ss:// |
ss |
8388 |
vmess:// |
vmess |
443 |
vless:// |
vless |
443 |
trojan:// |
trojan |
443 |
hysteria2://, hy2:// |
hysteria2 |
443 |
tuic:// |
tuic |
443 |
anytls:// |
anytls |
443 |
socks5://, socks:// |
socks5 |
1080 |
ssh:// |
ssh |
22 |
대부분의 링크는 userinfo@host:port?query#name 형태를 사용합니다. 두 가지는 다릅니다: vmess://는 base64로 인코딩된 JSON 객체(add / ps / scy / net / aid 필드 이름을 쓰는 v2rayN 형식)를 담고, ss://는 SIP002(base64(method:password)@host:port)와 더 오래된 전체 본문 형태(base64(method:password@host:port))를 모두 허용합니다. base64 페이로드는 패딩이 없어도 되고 URL-safe 알파벳을 사용해도 됩니다.
trojan://password@example.com:443?sni=example.com&alpn=h2,http/1.1#Tokyo%20Node
는 다음과 같이 변환됩니다:
[Proxy]
Tokyo Node = trojan, example.com, 443, password=password, tls=true, sni=example.com, alpn=h2|http/1.1
# 뒤의 텍스트는 퍼센트 디코딩되어 정책 이름이 됩니다. vmess://는 대신 ps 필드에서 이름을 가져옵니다. 이름이 없는 링크는 host:port로 이름이 지정됩니다. 구성 형식이 예약해 둔 문자 — =, ,, [, ], ", 탭, 줄바꿈 — 는 이름에서 공백으로 대체됩니다.
Trojan, Hysteria2, TUIC, AnyTLS는 TLS 전용 프로토콜이므로, 링크에 명시되어 있지 않더라도 tls=true가 추가됩니다.
여러 링크. 페이로드는 줄바꿈으로 구분된 여러 개의 공유 링크일 수 있으며, 전체를 base64로 한 겹 감쌀 수도 있습니다. 파싱에 성공한 모든 줄이 정책이 되고, 이름이 중복되면 2, 3 … 접미사가 붙어 규칙과 그룹이 각 노드를 개별적으로 지정할 수 있습니다. 파싱할 수 없는 줄은 경고로 보고되며 나머지 페이로드는 그대로 가져옵니다. 아무것도 변환하지 못했을 때만 가져오기가 실패합니다.
위 표에 없는 스킴을 가진 링크는 공유 링크로 인식되지 않습니다. 알려진 스킴이지만 필수 필드가 빠진 링크는 해당 스킴을 명시한 메시지와 함께 거부됩니다.
지원되는 매개변수
아래의 쿼리 매개변수만 읽히며, 링크의 나머지 내용은 모두 무시됩니다.
아래에서 말하는 '쿼리 링크'란 설정을 쿼리 문자열에 담는 모든 스킴을 가리킵니다: vless://, trojan://, hysteria2://, tuic://, anytls://, socks5://, ssh://. ss://와 vmess://는 각자의 파서가 읽으며, 표 뒤에서 따로 다룹니다.
| 매개변수 | 적용 대상 | 변환 결과 | |
|---|---|---|---|
sni, peer, servername |
쿼리 링크 | sni |
|
alpn(쉼표 구분) |
쿼리 링크 | alpn(값은 `\ |
`로 연결) — TUIC, Hysteria2, MASQUE 정책만 읽습니다. 공통 매개변수를 보세요 |
fp |
쿼리 링크 | fingerprint(uTLS ClientHello 프로필) |
|
allowInsecure, insecure, skip-cert-verify |
쿼리 링크 | skip-cert-verify=true |
|
security=tls, xtls, reality |
쿼리 링크 | tls=true. socks5://에서는 이 값이 socks5-tls 정책 유형을 선택합니다 |
|
pbk, sid |
REALITY | reality=true, public-key, short-id, 그리고 sni / servername에서 가져온 server-name= |
|
flow |
VLESS | xtls=true, flow |
|
type/network=ws + path, host |
쿼리 링크 | ws=true, ws-path, ws-headers=Host:… |
|
type/network=grpc + serviceName, servicename(또는 path) |
쿼리 링크 | grpc=true, grpc-service-name |
|
type/network=xhttp 또는 splithttp + path, host, mode |
쿼리 링크 | xhttp=true, xhttp-path, xhttp-host, xhttp-mode |
|
obfs, obfs-password(obfs_password도 읽습니다), up, down |
Hysteria2 | 동일한 옵션 이름 | |
plugin=… |
Shadowsocks | 아래 참고 |
ss://는 쿼리에서 plugin만 읽으므로, Shadowsocks 링크에 적어 둔 sni, alpn, fp, allowInsecure, security, type=은 무시됩니다. vmess://에는 쿼리 자체가 없습니다: 같은 설정을 JSON 본문의 sni, host, alpn, fp, net, path, tls 필드에서 가져옵니다. 그리고 표의 전송 방식 세 줄 — ws, grpc, xhttp — 은 hysteria2://, tuic://, anytls:// 링크에는 닿지 않습니다: 프로토콜마다 자체 전송 방식을 갖고 있으므로, 이 정책들은 각자의 옵션과 TLS 옵션만으로 작성됩니다.
Shadowsocks의 plugin 값은 name;key=value;… 형태로 읽힙니다. obfs-local / simple-obfs / obfs는 obfs와 obfs_param이 됩니다. v2ray-plugin은 WebSocket을 쓰는 Shadowsocks가 됩니다: ws=true, path는 ws-path, host는 ws-headers의 Host, tls는 tls=true가 되고 sni도 같은 host로 설정됩니다. mux가 0, false, no, off이면 ws-mux=false가 되고, 그 밖의 값이면 기본값을 유지합니다. quic 모드에는 대응하는 것이 없으므로 플러그인은 경고 <path>.plugin: Shadowsocks plugin 'v2ray-plugin' in quic mode has no KLNEKit equivalent; the proxy will not connect without it와 함께 버려집니다. v2ray-plugin의 그 밖의 옵션은 <path>.plugin-opts.<key>: option has no KLNEKit equivalent and was dropped와 함께 버려집니다. 그 밖의 플러그인은 경고를 남기고 버려집니다: 정책은 그대로 쓰이지만, 해당 플러그인을 요구하는 서버에는 연결하지 못합니다.
주의: 0이 아닌 VMess
aid(alterId)는 경고로 보고됩니다. Chute는 VMess AEAD만 지원하므로, 여전히 레거시 MD5 핸드셰이크를 요구하는 서버에서는 인증에 실패합니다.
프로필 가져오기
세 가지 형식이 인식됩니다:
| 형식 | 처리 |
|---|---|
| 네이티브 Chute, Surge 또는 Shadowrocket 프로필 | 변환 단계 없이 그대로 사용 — Surge 및 Shadowrocket 프로필 참조 |
| Clash / mihomo YAML | 네이티브 구성으로 변환 |
| sing-box JSON | 네이티브 구성으로 변환 |
형식은 내용으로 감지하며, 파일 이름은 힌트로만 사용합니다. {로 시작하는 내용은 파일 이름이 무엇이든 sing-box JSON으로 취급합니다(.yaml로 저장된 sing-box 프로필도 YAML로 파싱되므로 이름만으로는 신뢰할 수 없습니다). 그 외에는 .conf 확장자는 네이티브, .json은 sing-box, .yaml / .yml은 Clash를 의미합니다. 쓸 만한 파일 이름이 없을 때 — 예를 들어 구독 본문 — 는 첫 번째 의미 있는 줄이 결정합니다: #!MANAGED-CONFIG 또는 [Section] 헤더는 네이티브를, proxies:, proxy-groups:, rules:, proxy-providers: 또는 rule-providers:는 Clash를 의미합니다. 그 밖의 경우는 네이티브로 취급합니다. 주소가 내주는 내용 — 다운로드든 구독이든 — 은 본문으로 판단합니다: 주소에서 따온 이름은 본문에 위의 표시가 하나도 없을 때만 쓰이므로, .conf로 끝나는 주소가 Clash를 내주더라도 변환됩니다.
파싱은 되지만 그 방언을 정의하는 섹션이 하나도 없는 문서는, 아무것도 없는 상태를 성공적인 가져오기로 보고하는 대신 거부됩니다: Clash YAML은 proxies, proxy-groups, rules, proxy-providers, rule-providers 중 최소 하나가 필요하고, sing-box JSON은 outbounds, endpoints 또는 route가 필요합니다.
변환할 수 없는 항목 하나 때문에 가져오기 전체가 실패하지는 않습니다. 각 프록시, 그룹, 규칙은 개별적으로 변환되며, Chute에 대응하는 것이 없는 항목은 건너뛰고 보고됩니다. 결과에는 변환된 구성, 경고 목록, 건너뛴 원본 필드 목록이 담깁니다. 동일한 경고는 변환된 텍스트 안에도 해당 섹션 옆에 주석으로 기록됩니다:
[Proxy]
HK 01 = ss, example.com, 8388, aes-128-gcm, password
# KL-CONVERT-WARNING [proxies[3]]: proxy type 'snell' was skipped — Snell is a Surge-proprietary protocol KLNEKit does not implement
마지막으로, 변환된 텍스트는 Chute 자체 파서로 다시 파싱됩니다. 파서가 거부하는 줄은 # KL-CONVERT-DROPPED: …로 주석 처리되고 보고되므로, 95%만 변환 가능한 프로필도 가져와서 실행할 수 있습니다.
노드 이름은 구성 형식을 깨뜨릴 수 있는 경우 다시 작성됩니다: ,는 공백이 되고 =는 -가 되며, 그 결과 다른 이름과 충돌하면 숫자 접미사가 붙습니다. 그룹 멤버와 규칙 대상도 이에 맞춰 다시 작성되므로 모든 참조가 계속 같은 노드를 가리킵니다. direct 프록시/아웃바운드는 내장 DIRECT에, reject / block / dns는 REJECT에 매핑됩니다.
주의: 변환된 프로필은 정적 스냅샷입니다. Chute는 구독을 다시 다운로드하여 네이티브 프로필로 파싱하므로, 변환이 필요했던 프로필은 자동 업데이트 URL 없이 저장되며 스스로 갱신되지 않습니다.
Clash / mihomo 변환 참고 사항
주의:
dialer-proxy는underlying-proxy로 변환됩니다. 가져온 참조가 활성화되어 정책의 연결(TCP, 그리고 프로토콜이 허용하면 UDP)은 지정한 상위를 거치고 중첩 참조는 여러 홉을 만듭니다. 없는 참조나 순환 참조는 차단 쪽으로(fail-closed) 처리하고 로그에 기록합니다.type: direct별칭을 가리키는dialer-proxy는 직접 연결로 처리합니다. 프록시 제공자의override: dialer-proxy는 그 제공자의underlying-proxy가 되며,override의 나머지 키는 여전히 경고와 함께 버려집니다. 규칙 제공자나 프록시 제공자의proxy:는 그policy=가 되어, mihomo에서처럼 제공자를 그 정책을 거쳐 내려받습니다.
- 변환되는 프록시 유형:
ss,ssr,vmess,vless,trojan,http,socks5,hysteria2,tuic,anytls,wireguard,ssh. Chute가 구현하지 않은 유형 —snell,hysteria(v1),mieru,juicity,shadowquic,trusttunnel,openvpn,sudoku,vmess-http— 은 해당 프로토콜 이름을 명시한 경고와 함께 건너뜁니다. 프로토콜 자체는 Chute가 지원하지만 건너뛰는 것이 두 가지 더 있습니다:masque프록시는 mihomo의 필드 구성이 다르기 때문이고,tailscale프록시는[Tailscale]섹션에서 한 번 설정한 뒤 내장TAILSCALE정책으로 사용하기 때문입니다.type: https는 없습니다: HTTPS 프록시는 mihomo가 쓰는 대로tls: true를 단type: http이며,type: https는 지원되지 않는 프록시 유형으로 보고됩니다. - mihomo의 두 fingerprint 키는 의미가 다르므로 구분해서 처리합니다:
client-fingerprint는fingerprint(uTLS ClientHello 프로필)가 되고,fingerprint는cert-fingerprint-sha256(인증서 고정)이 됩니다. udp: false는udp-relay=false가 되고,tfo는tfo=true가 됩니다. 활성화된smux블록은 이전되지 않습니다 — Chute의mux는 자체 프레이밍을 쓰며 mihomo나 sing-box 서버는 이를 읽지 못합니다 — 가져오기에서 그 사실을 알립니다:<path>.smux: multiplexing (smux) has no KLNEKit equivalent; mux is left off.ss프록시의plugin은plugin-opts에서 변환됩니다:obfs(simple-obfs,obfs-local도)는obfs와obfs_param이 되고,v2ray-plugin은 공유 링크와 같은 방식으로 변환됩니다 —mode,tls,host,path,mux는 거기서 설명한 대로이고,headers는ws-headers가 되며(그 안의Host가host를 대신합니다),skip-cert-verify는skip-cert-verify=true가 됩니다. mihomo의 기본 Host인bing.com은 옮기지 않습니다:host가 없으면 정책 자체의 기본값이 쓰입니다. 그 밖의 플러그인은 보고되고 버려집니다.ss프록시의udp-over-tcp: true는udp-over-tcp=true가 되며, 버전도 항상 기록됩니다:udp-over-tcp-version이 있으면 그 값, 없으면1입니다. mihomo의 기본값은 예전 프레이밍이고 Chute의 기본값은 2이기 때문입니다.udp: false이면 mihomo와 마찬가지로 그 프록시는 UDP를 중계하지 않습니다.trojan프록시에는 항상tls=true가 붙습니다: mihomo의 Trojan은 항상 TLS이므로 프로필의tls: false는 무시됩니다.wireguard프록시는allowed-ips를 유지하며, Chute는 이를 적용합니다 — WireGuard 구성을 보세요.ssh프록시의host-key는 따옴표로 감싼server-fingerprint가 됩니다. 목록이면 모든 키를 담은server-fingerprint="…"하나가 되며, 따옴표나 쉼표가 든 항목은 정책 줄에 쓸 수 없어 보고되고 버려집니다.- 값 하나만 받는 필드가 목록이나 매핑으로 쓰여 있으면 없는 것으로 취급합니다. 필수 필드라면 그 항목은 보고되고 건너뜁니다.
- 그룹 유형
select,url-test,fallback,load-balance는 상태 확인 옵션과 함께 변환됩니다.relay그룹은 멤버 순서를 그대로 유지한relay그룹으로 남습니다: 첫 번째 멤버에는 직접 연결하고 마지막 멤버가 목적지에 연결합니다.use:멤버는policy-provider:<name>참조가 되고,include-all/include-all-proxies/include-all-providers는 명시적인 멤버 목록으로 확장됩니다. filter와exclude-filter는 따옴표로 묶여 이전되지만, 쉼표나 따옴표가 포함된 패턴은 구성 줄 형식에서 살아남을 수 없으므로 경고와 함께 버려집니다.- 그룹의
exclude-type은exclude-type=으로 그대로 옮겨집니다: 지정한 프록시 종류는 제공자가 공급하는 멤버에서 제외됩니다.tcp-concurrent에 해당하는 스위치는 없으며 — 플랫폼이 허용하는 곳에서 Chute는 목적지의 해석된 주소를 최대 다섯 개까지 경쟁시키고, 그 외에는 첫 번째에 연결합니다 — 가져오기는 이를 알려 줄 뿐 단순한 손실로 보고하지 않습니다. - 규칙 유형은 이름이 다른 경우 바뀝니다:
MATCH→FINAL,DST-PORT→DEST-PORT,SRC-IP-CIDR→SRC-IP.REJECT-DROP과REJECT-TINYGIF는 둘 다 고유한 동작을 가진 Chute 내장 정책이므로 그대로 유지되며,PASS또는COMPATIBLE을 대상으로 하는 규칙은 건너뜁니다. - 인라인
rule-provider(payload목록이 있는type: inline)는 동등한 구체적 규칙들로 확장됩니다. Chute의[Rule Provider]줄에는 페이로드를 포함할 수 없기 때문입니다. SUB-RULE,(condition),name규칙과 그것이 가리키는sub-rules:매핑은 일반 규칙으로 펼쳐집니다: 분기name의 각 규칙은AND,((condition),(rule)),POLICY가 되고, 분기의MATCH,X는condition,X가 됩니다. 분기 안의SUB-RULE은 자신의 조건을 바깥 조건에 겹치며 최대 8단계까지 중첩됩니다. 없는 분기나 펼치는 중인 분기로 되돌아가는 참조는 변환 경고와 함께 건너뜁니다.- 일반 키는 대응하는 것이 있으면 매핑됩니다:
mixed-port는 HTTPport가 되고(SOCKS5는 별도의socks-port가 필요합니다),allow-lan은allow-wifi-access가 되며,log-level은loglevel에 매핑되고,external-controller/secret은 외부 HTTP 컨트롤러 옵션이 되며, 활성화된sniffer는sniffing-enabled가 됩니다. bind-address는interface와socks-interface가 됩니다 — 두 리스너가 바인딩하는 주소입니다.*는 모든 주소를 뜻합니다.allow-lan도 켜져 있으면 Chute의allow-wifi-access가 어차피 바인딩을 모든 주소로 넓히며, 가져오기가 이를 알려 줍니다. 더 좁은 쪽을 유지하려면allow-wifi-access를 빼세요.authentication은 자격 증명 하나당http-auth한 줄이 되어 같은 두 리스너를 지킵니다. 사용자와 비밀번호 사이에:가 없는 항목은 보고된 뒤 버려집니다.external-controller-cors는 허용 출처가 이미 '모두'일 때에만(*이거나 목록이 아예 없을 때)external-http-cors가 됩니다. Chute의 이 스위치는 전부 아니면 전무이므로, 특정 출처를 지정한 프로필은 스위치를 꺼 둔 채로 두고 그 이유를 알려 줍니다 — 켜면 프로필이 한 출처에만 준 접근 권한을 모든 출처에 넘기는 셈이기 때문입니다.allow-private-network는 대응하는 것이 없으며 해당 헤더는 전송되지 않습니다.- mihomo는 프로세스의 정확한 일치와 글롭 일치를 두 가지 규칙 유형으로 나누지만, Chute에는 하나뿐이며 그것이 글롭 쪽입니다. 따라서
PROCESS-NAME-WILDCARD와PROCESS-PATH-WILDCARD는PROCESS-NAME과PROCESS-PATH가 되고,*와?를 똑같이 해석합니다. 둘 다 들어 있지 않은 리터럴은 여전히 정확히 일치합니다. tun은 Chute에 같은 키가 있는 항목만 대응됩니다:dns-hijack은hijack-dns가 되고(mihomo의any:53은*:53으로 고쳐 씁니다),route-address는tun-included-routes,route-exclude-address는tun-excluded-routes가 됩니다.stack,auto-route,auto-detect-interface,auto-redirect,mtu,strict-route,endpoint-independent-nat,device,inet4-address,inet6-address,udp-timeout,gso는 대신 보고됩니다 — 이들은 Chute가 스스로 결정합니다.- DNS 블록은 다음과 같이 대응됩니다.
hosts는[Host]항목이 되며, 목록에 적힌 주소를 모두 유지합니다.nameserver와fallback은 하나로 합쳐져 각 항목의 표기에 따라dns-server,doh,dot,doq,doh3로 기록됩니다 — Chute는 설정된 모든 리졸버에 동시에 질의하므로 별도의 fallback 풀은 되돌아갈 곳이 없으며, 가져오기가 이를 알려 줍니다.direct-nameserver와proxy-server-nameserver는direct-dns-server와proxy-dns-server가 됩니다.fake-ip-filter는always-real-ip가 됩니다.nameserver-policy는 키마다[Host]항목 하나가 되며,rule-set:키는 제공자가http나file유형일 때 세트를 키로 하는RULE-SET:<provider> = server:…형태가 되고,geosite:키는 경고와 함께 버려집니다. - 같은 DNS 블록에서:
use-system-hosts: false는read-etc-hosts = false가 됩니다.use-hosts: false에 대응하는 것은 없으며 —[Host]표는 항상 참조됩니다 — 보고됩니다.fake-ip-filter-mode: whitelist는 필터를 반전시키는데always-real-ip로는 표현할 수 없으므로, 목록은 블랙리스트로 유지되고 가져오기가 그렇게 알려 줍니다.default-nameserver는 리졸버 자신의 호스트명을 해석하기 위한 부트스트랩입니다. Chute는 이를 시스템 리졸버로 해석하며, 가져오기는 대신 그 호스트명을 고정해 주는[Host]줄을 알려 줍니다.
sing-box 변환 참고 사항
- 변환되는 아웃바운드 유형:
shadowsocks,vmess,vless,trojan,hysteria2,tuic,anytls,shadowtls,wireguard,http,socks,ssh.selector와urltest는 각각select및url-test정책 그룹이 됩니다.shadowsocks의plugin은obfs-local(simple-obfs나obfs로 써도 됨)이면obfs와obfs_param으로 변환되고,v2ray-plugin이면plugin_opts문자열(tls;host=…;path=…)이 공유 링크와 같은 방식으로 변환됩니다(경고의 경로에는plugin-opts가 아니라plugin_opts가 적힙니다). 그 밖의 플러그인은 보고되고 버려집니다. 아웃바운드는 그대로 쓰이지만 해당 플러그인을 요구하는 서버에는 연결하지 못합니다.trojan아웃바운드는 sing-box와 마찬가지로tls.enabled가 설정된 경우에만tls=true가 됩니다. 설정되지 않은 아웃바운드는 평문 Trojan으로 가져오므로, 서버가 정말 평문이 아니라면tls=true를 추가하세요. - 아웃바운드 내부: 유형이
xhttp나splithttp인transport는xhttp=true와xhttp-path,xhttp-host,xhttp-mode,xhttp-headers가 됩니다. 활성화된tls.ech는ech=true가 되고, 그config는ech-config=가 됩니다. REALITY의public_key는public-key가 되며, 이것이 없는 아웃바운드는 REALITY 핸드셰이크가 성공할 수 없으므로 경고와 함께 변환됩니다. SSH의host_key목록은 모든 키를 담은 따옴표 붙은server-fingerprint="…"하나가 되고, 따옴표나 쉼표가 든 항목은 보고되고 버려집니다. 이전 방식의wireguard아웃바운드는local_address목록을self-ip와self-ip-v6(주소 체계별 첫 주소)로,pre_shared_key를preshared-key로,reserved를 따옴표 붙은reserved="a,b,c"로 유지합니다.peers목록은 Chute가 피어 하나만 구성하므로 보고되고 버려집니다. endpoints(sing-box 1.11 이상)도 변환됩니다.wireguard엔드포인트는 자체[WireGuard <tag>]섹션을 가진wireguard정책이 되고(피어의allowed_ips는 그 섹션의allowed-ips가 됩니다), 첫 번째tailscale엔드포인트는 내장TAILSCALE정책으로 사용하는[Tailscale]섹션이 됩니다. 그 밖의 엔드포인트 유형은 경고와 함께 건너뜁니다. 섹션 이름은 정책 이름에서 공백과 대괄호를 뺀 것입니다. 구성 줄 형식이section-name=을 맞출 때 공백을 지우기 때문입니다. 공백을 뺀 뒤 이름이 겹치는 정책 둘에는-2,-3… 접미사가 붙습니다.- 다이얼 필드는 mihomo 경로와 같은 방식으로 대응됩니다:
tcp_fast_open은tfo=true,network: tcp는udp-relay=false가 됩니다.shadowsocks아웃바운드의udp_over_tcp(true또는{"enabled": true, "version": 1})는udp-over-tcp=true가 되고,udp-over-tcp-version=1은 버전 1일 때만 기록됩니다. sing-box의 기본값인 버전 2는 Chute의 기본값이기도 합니다. 활성화된multiplex는 의도적으로 이전하지 않습니다: sing-box는 자체 패딩을 붙인 smux / yamux / h2mux를 협상하는데, Chute의mux는 자체 프레이밍을 쓰며 sing-box 서버는 이를 읽지 못하므로 아웃바운드는 멀티플렉싱 없이 변환되고 경고가 그렇게 알려 줍니다.detour는 활성underlying-proxy=참조가 되며, 중첩 detour는 여러 홉을 만듭니다. 순환과 없는 참조는 차단 쪽으로(fail-closed) 처리됩니다.wireguard엔드포인트의detour도 유지되며, 그 터널은 해당 상위의 UDP 릴레이를 거칩니다. direct가 아닌detour가 있는tailscale엔드포인트는 가져오지 않으며, 이를 참조하는 곳은 차단 쪽으로(fail-closed) 처리되고 경고가 남습니다. route.rule_set:inline규칙 세트는[Ruleset <tag>]섹션이 되고,remote와local규칙 세트는format=sing-box-source가 붙은[Rule Provider]줄(type=http/type=file)이 됩니다. 컴파일된 바이너리 형식의 규칙 세트는 경고와 함께 건너뜁니다. 같은 규칙 세트의 원본(.json또는 YAML) 형식을 지정하세요. 이 경로에서 컴파일된 형식은.srs이며,format: binary이거나format없이 경로가.srs로 끝나는 것으로 판별합니다..mrs는 Clash 규칙 제공자 경로에서만 감지하며, mihomo도 그곳에서 확장자로 형식을 추론합니다. macOS에서는 배포처가 원본 페이로드를 함께 제공하면 가져오기가 URL을 그쪽으로 바꿔 줍니다. iOS, Apple TV, Android에서는 그렇게 하지 않습니다 — 바이너리로 배포되는 세트는 어차피 그 플랫폼이 불러올 수 있는 크기를 훨씬 넘기 때문입니다. 이전 버전으로 가져온 프로필은 이 규칙 세트를format=mihomo-yaml로 기록해 규칙을 하나도 불러오지 못했지만, 이제 다시 가져오지 않아도 불러옵니다. 원격 규칙 세트는 sing-box와 같은 경로로 내려받습니다.download_detour,http_client(http_clients의 태그 또는 인라인 클라이언트), 또는route.default_http_client를 거치고, 모두 없으면 기본 아웃바운드(route.final)를 거칩니다. 그 경로가 제공자의policy=가 되며,direct로 풀리는 경로는 아무것도 추가하지 않습니다.- sing-box의 기간은 단위까지 함께 읽습니다:
update_interval: 3d는 사흘이고d,h,m,s,ms를 모두 인식합니다. 단위를 해석하지 못한 간격은 기본값인 하루로 되돌아갔는데,7d라고 쓴 프로필이 원한 것은 그게 아닙니다. - 라우트 규칙은
action키를 따릅니다:route/bypass는 지정된 아웃바운드를 사용하고,reject는REJECT(method: drop은REJECT-DROP)가 되며,hijack-dns,sniff,resolve는 Chute가[General]에서 제어하므로 아무것도 생성하지 않습니다. sing-box와 마찬가지로 한 규칙 안에서 같은 종류의 일치 항목은 하나만 맞으면 되고, 종류가 다른 항목은 모두 맞아야 합니다.domain,domain_suffix,domain_keyword,domain_regex,ip_cidr,geoip,ip_is_private가 한 종류이고,port와port_range,source_ip_cidr와source_ip_is_private,source_port와source_port_range가 각각 또 한 종류이며, 나머지 일치 항목은 각각 한 종류입니다. 한 종류만 있는 규칙은 값마다 한 줄이 되고, 여러 종류가 있는 규칙은 하나의AND규칙이 됩니다 —{"network": "udp", "port": 443}는AND,((DEST-PORT,443),(PROTOCOL,udp))가 됩니다. 앞에 점이 붙은domain_suffix(.cn)는DOMAIN-SUFFIX,cn이 됩니다.type: logical규칙은AND/OR/NOT이 되고,invert는 규칙 전체를NOT으로 감싸며,port_range(a:b)와source_port_range는 포트 범위가 됩니다.rule_set은 어디에 나오든 그 규칙의 조건 하나이며,type: logical규칙이나 반전된 규칙 안에서도 마찬가지입니다(논리 규칙 참조). 한 규칙에 태그가 여러 개면 서로 대안이 됩니다. 그중 한 태그가 가져오지 못한 세트를 가리키면 그 태그만 알림과 함께 버려지고 규칙은 나머지를 유지합니다 — 그만큼 더 좁게 일치하게 됩니다. 규칙 전체가 버려지는 것은 규칙이 가리킨 태그가 모두 실패했을 때, 또는rule_set이type: logical규칙이나 반전된 규칙 안에 있어 대안 하나를 버리면 나머지 식이 일치하는 범위가 달라질 때뿐입니다. Chute에 대응하는 것이 없는 일치 항목은 같은 종류의 다른 항목이 남아 있으면 경고와 함께 그 항목만 버리고(규칙이 더 적게 일치하게 됨), 그렇지 않으면 더 넓게 일치하는 규칙으로 바뀌는 대신 경고와 함께 규칙 전체를 버립니다. - 어떤 DNS 규칙에도 해당하지 않는 모든 이름에 답하는 DNS 서버 —
dns.final,final이 없으면 첫 번째 서버 — 는 종류에 맞는[General]의 DNS 키가 되며, 그detour는#proxy=<policy>접미사로,local서버는system으로 기록됩니다.proxy-dns-server는 쓰지 않습니다. 나머지 서버는dns.rules에서 만들어진[Host]항목을 통해 쓰이며,local서버는server:system으로, 일반, DoH, DoQ, DoH3 서버의detour는#proxy=<policy>접미사로 기록됩니다. DoT 서버의[Host]항목에는 이를 붙일 수 없으므로, 거기서는 detour가 경고와 함께 버려집니다.rule_set전체를 한 리졸버로 보내는 DNS 규칙은 세트를 키로 하는RULE-SET:<tag> = server:…형태가 됩니다 — 단rule_set이 그 규칙의 유일한 일치 항목일 때에만 그렇습니다. sing-box는 종류가 다른 일치 항목이 모두 충족되기를 요구하지만[Host]키는 조건 하나만 담을 수 있기 때문입니다. 가져오지 못한 세트를 가리키는 규칙에는 항목이 만들어지지 않으며, 그 라우팅 규칙이 만들어지지 않는 것과 같은 이유입니다.
Surge 및 Shadowrocket 프로필
Surge나 Shadowrocket 프로필은 변환 단계 없이 그대로 읽힙니다. Chute는 각 방언의 표기를 받아들이므로 붙여 넣은 프로필이 그대로 동작합니다. Chute의 네이티브 키와 다르거나 호환을 위해 추가된 항목은 다음과 같습니다:
- 구독 그룹. Surge의
policy-path=<url>(update-interval=,policy-regex-filter=와 함께)는 URL에서 그룹 멤버를 불러오고,include-all-proxies=true와include-other-group=<name>은 모든 프록시나 다른 그룹의 멤버를 추가합니다.no-alert나icon-url처럼 Chute가 쓰지 않는 그룹 매개변수는 프로필을 저장할 때 유지됩니다. Shadowrocket의use=true는 그룹에 나열된 이름이 프록시가 아니라 구독임을 뜻하며, 각 이름은 프록시 제공자로 읽힙니다. Shadowrocket의random은 무작위 그룹이 됩니다. Chute가 구현하지 않은 유형의 그룹(Surge의external등)은 멤버를 유지한 채select로 동작하며 알림이 남습니다. 정책 그룹을 참조하세요. - 내장 정책. Shadowrocket의
PROXY는 프로필이 자체Proxy를 정의하지 않은 한 글로벌 프록시 모드에서 선택된 정책을 가리키며, 각 REJECT 변형(REJECT-DROP,REJECT-TINYGIF,REJECT-DICT등)은 이름대로 동작합니다. 내장 정책을 참조하세요. - 규칙.
DST-PORT, 포트 범위,IPv4/IPv6/DOMAIN/SIMPLE값의HOSTNAME-TYPE,IP-ASN,AS…,FINAL,<policy>,dns-failed,notification-text=,[Ruleset <name>]섹션 — 규칙을 참조하세요. Surge와 마찬가지로 모듈 규칙은 프로필 자체의 규칙보다 앞에 옵니다. - 일반(Shadowrocket).
update-url은 프로필 자신의 업데이트 주소를 가리키며, 이는 Surge가#!MANAGED-CONFIG헤더에 적는 것과 같습니다. Chute는 둘 다 읽습니다. 둘을 모두 담은 파일은 헤더를 따르는데,interval과strict까지 담을 수 있는 것은 헤더뿐이기 때문입니다.update-url줄 자체는 저장해도 남으므로, Shadowrocket 프로필은 저장한 뒤에도 Shadowrocket 프로필입니다.close-if-proxy-chain-missing은 유지되지만, Chute는 언제나 그 값이true일 때처럼 상위가 없는 체이닝 정책을 거부합니다. Shadowrocket이 앱에서만 설정하는 프런트 프록시(前置代理)는 Chute에서global-underlying-proxy로 씁니다. - DNS. Shadowrocket의
direct-dns-server,proxy-dns-server,fallback-dns-server,dns-direct-system,dns-fallback-system(fallback-dns-server에system을 추가하며, 프로필이 직접 선언한 것과 합쳐짐),always-ip-address, 그리고ssid:<name> = server:…형태의[Host]줄; Surge의encrypted-dns-server,allow-dns-svcb,[Host] <domain> = script:<name>,server:force-syslib. DNS 서버와 로컬 DNS 매핑을 참조하세요. - 일반.
proxy-test-url과test-timeout(url-test, fallback, load-balance 그룹의 기본값),udp-policy-not-supported-behaviour,encrypted-dns-skip-cert-verification, 그리고 외부 HTTP 컨트롤러 키로 대응되는http-api/http-api-web-dashboard. 기타 옵션을 참조하세요. - 프록시.
tuic-v5키워드와peer = (…)로 작성한[WireGuard <name>]섹션. 프록시 서버와 WireGuard 구성을 참조하세요. - HTTP.
header-replace-regex, 본문 재작성의http-request/http-response형식,data-type=,status-code=,header="Key: value|…"를 쓰는[Map Local], URL 재작성의reject-array/reject-tinygif, 그리고[MITM]의h2,hostname-disabled,auto-quic-block. 헤더 재작성, 본문 재작성, 모의 응답, URL 재작성, HTTPS 복호화를 참조하세요. - 스크립트와 모듈.
[Script]의cronexp=,type=generic,event-name=; 모듈의#!system_version,#!REQUIREMENT,#!IOS-ONLY/#!MACOS-ONLY/#!TVOS-ONLY, 그리고 모듈[General]의%APPEND%/%INSERT%.#!system_version과#!REQUIREMENT는 기록되기만 합니다: Chute는 모듈에서 이 값을 읽지만 어느 앱도 이를 표시하지 않으며, 둘 다 모듈을 불러올지 말지를 좌우하지 않습니다. JavaScript 스크립팅과 모듈을 참조하세요. - Chute가 구현하지 않은 섹션 —
[Keystore],[Port Forwarding],[Testing],[DHCP],[Snell Server],[Panel],[Ponte],[MTProto]— 은 각각 알림을 한 번 기록하고 불러오며, 저장할 때 그대로 다시 기록됩니다.[Tailscale <name>]은[Tailscale]로 읽힙니다. 구성을 참조하세요.
사용할 수 없는 것: Chute가 구현하지 않은 프로토콜을 지정한 [Proxy] 줄은 구성 오류가 아닙니다. 해당 정책은 알림과 함께 버려지고, 줄은 저장 시 작성된 그대로 유지되며, 그 정책을 가리키는 참조는 대상을 잃습니다(dangling) — 런타임에 DIRECT로 새지 않고 REJECT로 차단됩니다. 이렇게 인식되는 프로토콜은 Surge의 snell, external, h2-connect, trust-tunnel, Shadowrocket의 hysteria(v1), juicity, sudoku, openconnect, mieru, brook, lua, http2, http3, relay, subscribe, 그리고 tailscale입니다. tailscale은 Chute가 [Tailscale] 섹션에서 한 번 구성하고 내장 TAILSCALE 정책으로 사용합니다. Chute에 대응하는 것이 없는 [General] 키도 마찬가지로 알림과 함께 무시되고 그 줄은 작성된 그대로 유지됩니다.
제한 사항
- 프록시 체이닝은 TCP와 UDP를 전달합니다. mihomo의
dialer-proxy와 sing-box의detour는underlying-proxy참조가 되고, Clash의relay그룹은 홉 순서를 유지한 릴레이 그룹으로 남으며, 제공자의 다운로드 경로(mihomo의proxy:, sing-box의download_detour또는http_client)는 그policy=가 됩니다. 순환, 없는 참조, UDP를 나르지 않는 상위 위의 QUIC 또는 WireGuard 경로는 거부하고 로그에 기록하며 직접 전송하지 않습니다.udp-over-tcp를 쓰는 Shadowsocks 노드는 그런 상위 위에서도 UDP를 나릅니다. - Chute에 대응하는 것이 없는 옵션은 조용히 사라지지 않고 경고와 함께 버려집니다: 프록시별
ip-version,interface-name,routing-mark,mptcp,packet-encoding,global-padding,authenticated-length,encryption, 그리고ss가 아닌 프록시의udp-over-tcp/udp-over-tcp-version; 그룹별disable-udp,interface-name,routing-mark; 그리고 일반 키geodata-mode,geox-url,find-process-mode,unified-delay,tproxy-port,redir-port등. 그룹의icon만은 예외입니다: 그림일 뿐 트래픽을 바꾸지 않으므로 조용히 버려집니다. - 대응하는 것이 없는 규칙 유형은 건너뜁니다:
IP-SUFFIX,SRC-IP-SUFFIX,SRC-GEOIP,SRC-IP-ASN,DSCP,UID,PROCESS-PATH-REGEX,IP-ACCEPT,REMATCH-NAME. mihomo의src수정자를 가진 규칙도 잘못된 엔드포인트에 일치하지 않도록 건너뜁니다. GEOSITE, 그리고 ISO 국가 코드가 아닌GEOIP분류는 mihomo의 geo 데이터 파일에 담긴 세트를 가리키는데, Chute는 그 파일을 갖고 다니지 않습니다.GEOIP,private와GEOIP,lan은 모든 플랫폼에서 내장 사설 주소 세트인RULE-SET,LAN이 됩니다 — 다운로드는 없습니다. 나머지는 가져오기를 어디서 실행하느냐에 달려 있습니다. macOS에서는 규칙이RULE-SET,geosite-<tag>(또는geoip-<tag>)가 되고, 그 세트로 배포되는 YAML 페이로드를 가리키는[Rule Provider]줄이 함께 생성됩니다. 이 줄은 다른 줄과 마찬가지로 가리키는 곳을 바꾸거나 지울 수 있습니다. iOS, Apple TV, Android에서는 그 세트가 플랫폼이 변환할 수 있는 크기를 넘기 때문에 규칙이 그렇게 알리는 메시지와 함께 버려집니다 — 이들을 유지하려면 데스크톱에서 프로필을 가져오세요. ISO 국가 코드는 여전히 내장 GeoIP 데이터베이스가 처리하므로 세트가 전혀 필요 없습니다.- Chute가 자체적으로 관리하는 프로토콜 세부 사항은 이전되지 않습니다: Hysteria2 포트 호핑(
ports), TUICheartbeat, AnyTLS 세션 풀 튜닝, WireGuardpeers목록(단일 피어만 설정됩니다),workers. - Chute가 구현하지 않은 전송 방식은 변환되지 않고 보고됩니다:
h2,http난독화,httpupgrade,v2ray-http-upgradeWebSocket 변형, WebSocketmax-early-data, XHTTPextra(XMUX / download-settings).transport.type이httpupgrade나quic인 sing-box 아웃바운드만은 예외입니다: 아무것도 생성되지 않고 보고되지도 않으므로, 가져온 뒤 그 아웃바운드는 직접 확인하세요. - Clash의 동작
mode는 Chute에서 구성 키가 아니라 런타임 스위치입니다.global또는direct모드의 프로필은 경고와 함께 규칙 모드로 변환됩니다. - YAML은 표준 파서로 읽으므로 앵커와
<<병합 키가 동작합니다. 여러 줄 스칼라로 작성된 값은 한 줄로 접힙니다. 줄바꿈이 들어가면 그 값이 놓이는 구성 줄이 쪼개지기 때문입니다. - 정책 이름이
{...}자리 표시자인 프로필 — 구독 생성기가 치환 전에 내놓는 형태 — 은 템플릿이라고 한 번 알려 줍니다. 자리 표시자 참조를 모두 '정의되지 않은 정책'으로만 나열하지 않습니다.
이 페이지는 영어판의 번역본입니다. 내용이 다를 경우 영어판이 우선합니다.