가져오기

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는 HTTP port가 되고(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), TUIC heartbeat, AnyTLS 세션 풀 튜닝, WireGuard peers 목록(단일 피어만 설정됩니다), workers.
  • Chute가 구현하지 않은 전송 방식은 변환되지 않고 보고됩니다: h2, http 난독화, httpupgrade, v2ray-http-upgrade WebSocket 변형, WebSocket max-early-data, XHTTP extra(XMUX / download-settings). transport.type이 httpupgrade나 quic인 sing-box 아웃바운드만은 예외입니다: 아무것도 생성되지 않고 보고되지도 않으므로, 가져온 뒤 그 아웃바운드는 직접 확인하세요.
  • Clash의 동작 mode는 Chute에서 구성 키가 아니라 런타임 스위치입니다. global 또는 direct 모드의 프로필은 경고와 함께 규칙 모드로 변환됩니다.
  • YAML은 표준 파서로 읽으므로 앵커와 << 병합 키가 동작합니다. 여러 줄 스칼라로 작성된 값은 한 줄로 접힙니다. 줄바꿈이 들어가면 그 값이 놓이는 구성 줄이 쪼개지기 때문입니다.
  • 정책 이름이 {...} 자리 표시자인 프로필 — 구독 생성기가 치환 전에 내놓는 형태 — 은 템플릿이라고 한 번 알려 줍니다. 자리 표시자 참조를 모두 '정의되지 않은 정책'으로만 나열하지 않습니다.
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-30 15:11:19

이 페이지는 영어판의 번역본입니다. 내용이 다를 경우 영어판이 우선합니다.

results matching ""

    No results matching ""