가져오기
Chute는 다른 클라이언트용으로 작성된 프록시 설정을 가져올 수 있습니다. 두 종류의 입력을 허용합니다: 단일 노드 공유 링크(ss://, vmess://, …), 그리고 Clash/mihomo YAML 또는 sing-box JSON 형식의 프로필 전체입니다. 둘 다 네이티브 Chute 설정으로 변환됩니다 — 변환 후 얻는 것은 [Proxy], [Proxy Group], [Rule] 섹션을 가진 평범한 Chute 프로필이며, Chute가 계속 해석하는 외부 형식 파일이 아닙니다.
http:// 및 https:// 주소는 결코 공유 링크로 취급되지 않습니다. 이들은 구독 주소입니다: 먼저 내용을 다운로드한 뒤, 본문이 무엇으로 판명되는지에 따라 가져오기가 진행됩니다.
공유 링크
| 스킴 | 결과 정책 유형 | 기본 포트 |
|---|---|---|
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://[email protected]: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 … 접미사가 붙어 규칙과 그룹이 각 노드를 개별적으로 지정할 수 있습니다. 파싱할 수 없는 줄은 경고로 보고되며 나머지 페이로드는 그대로 가져옵니다. 아무것도 변환하지 못했을 때만 가져오기가 실패합니다.
위 표에 없는 스킴을 가진 링크는 공유 링크로 인식되지 않습니다. 알려진 스킴이지만 필수 필드가 빠진 링크는 해당 스킴을 명시한 메시지와 함께 거부됩니다.
지원되는 매개변수
아래의 쿼리 매개변수만 읽히며, 링크의 나머지 내용은 모두 무시됩니다.
| 매개변수 | 적용 대상 | 변환 결과 | |
|---|---|---|---|
sni, peer, servername |
전체 | sni |
|
alpn(쉼표 구분) |
전체 | alpn(값은 `\ |
`로 연결) |
fp |
전체 | fingerprint(uTLS ClientHello 프로필) |
|
allowInsecure, insecure, skip-cert-verify |
전체 | skip-cert-verify=true |
|
security=tls, xtls, reality |
전체 | tls=true |
|
pbk, sid |
REALITY | reality=true, public-key, short-id |
|
flow |
VLESS | xtls=true, flow |
|
type/network=ws + path, host |
전체 | ws=true, ws-path, ws-headers=Host:… |
|
type/network=grpc + 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, up, down |
Hysteria2 | 동일한 옵션 이름 | |
plugin=… |
Shadowsocks | 아래 참고 |
Shadowsocks의 plugin 값은 name;key=value;… 형태로 읽힙니다. obfs-local / simple-obfs / obfs는 obfs와 obfs_param이 되고, v2ray-plugin은 (기본값인) websocket 모드일 때 ws-path 및 ws-headers와 함께 ws=true가 됩니다. 그 밖의 플러그인은 경고를 남기고 이전되지 않습니다 — 변환된 정책은 해당 플러그인을 요구하는 서버에 연결하지 못합니다.
알림: 0이 아닌 VMess
aid(alterId)는 경고로 보고됩니다. Chute는 VMess AEAD만 지원하므로, 여전히 레거시 MD5 핸드셰이크를 요구하는 서버에서는 인증에 실패합니다.
프로필 가져오기
세 가지 형식이 인식됩니다:
| 형식 | 처리 |
|---|---|
| 네이티브 Chute/Surge 프로필 | 변환 단계 없이 그대로 사용 |
| 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를 의미합니다. 그 밖의 경우는 네이티브로 취급합니다.
파싱은 되지만 그 방언을 정의하는 섹션이 하나도 없는 문서는, 아무것도 없는 상태를 성공적인 가져오기로 보고하는 대신 거부됩니다: 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로 변환됩니다. Chute는 이 옵션을 파싱하고 보존하지만 프록시 체이닝을 구현하지 않습니다 — 이 옵션을 가진 정책은 경고를 기록하고 자신의 서버에 직접 연결합니다. 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정책으로 사용하기 때문입니다. - mihomo의 두 fingerprint 키는 의미가 다르므로 구분해서 처리합니다:
client-fingerprint는fingerprint(uTLS ClientHello 프로필)가 되고,fingerprint는cert-fingerprint-sha256(인증서 고정)이 됩니다. udp: false는udp-relay=false가 되고,tfo는tfo=true가 되며, 활성화된smux블록은mux=true가 됩니다.- 그룹 유형
select,url-test,fallback,load-balance는 상태 확인 옵션과 함께 변환됩니다.relay그룹은 건너뜁니다 — 체이닝이며, 구현되어 있지 않습니다.use:멤버는policy-provider:<name>참조가 되고,include-all/include-all-proxies/include-all-providers는 명시적인 멤버 목록으로 확장됩니다. filter와exclude-filter는 따옴표로 묶여 이전되지만, 쉼표나 따옴표가 포함된 패턴은 설정 줄 형식에서 살아남을 수 없으므로 경고와 함께 버려집니다.- 규칙 유형은 이름이 다른 경우 바뀝니다:
MATCH→FINAL,DST-PORT→DEST-PORT,SRC-IP-CIDR→SRC-IP.REJECT-DROP과REJECT-TINYGIF는REJECT로 통합되며,PASS또는COMPATIBLE을 대상으로 하는 규칙은 건너뜁니다. - 인라인
rule-provider(payload목록이 있는type: inline)는 동등한 구체적 규칙들로 확장됩니다. Chute의[Rule Provider]줄에는 페이로드를 포함할 수 없기 때문입니다. - 일반 키는 대응하는 것이 있으면 매핑됩니다:
mixed-port는 HTTPport가 되고(SOCKS5는 별도의socks-port가 필요합니다),allow-lan은allow-wifi-access가 되며,log-level은loglevel에 매핑되고,external-controller/secret은 외부 HTTP 컨트롤러 옵션이 되며, 활성화된sniffer는sniffing-enabled가 됩니다.
sing-box 변환 참고 사항
- 변환되는 아웃바운드 유형:
shadowsocks,vmess,vless,trojan,hysteria2,tuic,anytls,shadowtls,wireguard,http,socks,ssh.selector와urltest는 각각select및url-test정책 그룹이 됩니다. detour는dialer-proxy와 같은 이유로 경고를 발생시킵니다: 아웃바운드 체이닝은 구현되어 있지 않으며, 아웃바운드는 자신의 서버에 직접 연결합니다.route.rule_set항목은[Rule Provider]줄이 됩니다(원격은type=http, 로컬은type=file이며, 항상 고전적인 mihomo YAML 규칙 목록으로 읽습니다). 바이너리.srs형식의 규칙 세트는 거부됩니다 — Chute는 텍스트 규칙 페이로드만 읽습니다.- 라우트 규칙은
action키를 따릅니다:route/bypass는 지정된 아웃바운드를 사용하고,reject는REJECT가 되며,hijack-dns,sniff,resolve는 Chute가[General]에서 제어하므로 아무것도 생성하지 않습니다. multiplex설정과dns.rules(도메인별 DNS 라우팅)는 대응하는 것이 없어 버려진 것으로 보고됩니다.
제한 사항
- 프록시 체이닝은 구현되어 있지 않습니다. mihomo의
dialer-proxy, sing-box의detour, Clash의relay그룹은 모두 체인을 기술하지만, Chute에서는 어느 것도 체이닝된 트래픽을 만들지 않습니다. - Chute에 대응하는 것이 없는 옵션은 조용히 사라지지 않고 경고와 함께 버려집니다: 프록시별
ip-version,interface-name,routing-mark,mptcp; 그룹별exclude-type,disable-udp,interface-name,routing-mark,icon; 그리고 일반 키bind-address,tcp-concurrent,geodata-mode,geox-url,find-process-mode,unified-delay,authentication,tproxy-port,redir-port등. - 대응하는 것이 없는 규칙 유형은 건너뜁니다:
GEOSITE,IP-SUFFIX,SRC-IP-SUFFIX,SRC-GEOIP,SRC-IP-ASN,DSCP,UID,SUB-RULE,PROCESS-PATH-REGEX,PROCESS-NAME-WILDCARD,PROCESS-PATH-WILDCARD,IP-ACCEPT. mihomo의src수정자를 가진 규칙도 잘못된 엔드포인트에 매칭되지 않도록 건너뜁니다. mihomo의sub-rules(중첩된 규칙 트리)는 버려집니다. - Chute가 자체적으로 관리하는 프로토콜 세부 사항은 이전되지 않습니다: Hysteria2 포트 호핑(
ports), TUICheartbeat, AnyTLS 세션 풀 튜닝, WireGuardpeers목록(단일 피어만 설정됩니다),workers. - Chute가 구현하지 않은 전송 방식은 변환되지 않고 보고됩니다:
h2,http난독화,httpupgrade,v2ray-http-upgradeWebSocket 변형, WebSocketmax-early-data, XHTTPextra(XMUX / download-settings). - Clash의 동작
mode는 Chute에서 설정 키가 아니라 런타임 스위치입니다.global또는direct모드의 프로필은 경고와 함께 규칙 모드로 변환됩니다. - YAML은 표준 파서로 읽으므로 앵커와
<<병합 키가 동작합니다. 여러 줄 스칼라로 작성된 값은 한 줄로 접힙니다. 줄바꿈이 들어가면 그 값이 놓이는 설정 줄이 쪼개지기 때문입니다.