웹 콘솔
Chute는 실행 중인 커널 안에서 HTTP로 관리 콘솔을 제공합니다. 모든 플랫폼에서 동일한 유일한 인터페이스이므로, 무언가를 설정하는 것이 아니라 들여다봐야 할 때 — 요청의 경로, 작동하지 않는 재작성, 연결이 거부된 이유 — 이 설명서는 언제나 이곳을 가리킵니다.
이것은 Chute Dashboard가 아닙니다. Dashboard는 Chute 인스턴스에 접속하는 별도의 macOS 앱이고, 여기서 설명하는 콘솔은 커널 자체가 제공하며 브라우저로 엽니다.
켜기와 접속
콘솔에는 [General] 섹션의 external-http-controller가 필요합니다. 기본값은 꺼짐입니다:
[General]
external-http-controller = 127.0.0.1:9090
external-http-ui = true
접속에는 인증이 필요합니다. external-http-secret을 설정하지 않으면 Chute가 토큰을 생성해 control-token 파일에 보관하고, 재시작 후에도 같은 토큰을 다시 씁니다 — 그러니 실제로는 앱이 토큰이 붙은 주소를 건네주도록 하는 것이 접속 방법입니다. 페이지는 로드될 때 그 주소에서 토큰을 가져와 브라우저의 localStorage에 보관하므로, 브라우저마다 한 번만 로그인하면 됩니다. 플랫폼마다 진입점이 있습니다 — 웹 콘솔 열기를 참고하십시오.
Overview(개요)
서비스 실행 여부, 가동 시간, 메모리 사용량, HTTP와 SOCKS 리스너의 주소와 포트, 그리고 이번 실행이 쓰는 파일 경로. 브라우저 탭이 어느 인스턴스를 가리키는지 헷갈릴 때 이 페이지가 알려 줍니다.
Traffic(트래픽)
엔진 전체의 누적 바이트와 현재 속도, 속도 이력 그래프, 어댑터별 분해. 「대체 뭔가 흐르고 있기는 한가」에 답하고, 정책 그룹이 여러 출구 중에서 고를 때 실제로 어느 쪽이 감당하고 있는지 보는 데 씁니다.
Connections(연결)
가장 오래 머무르게 될 페이지입니다. 탭은 두 개입니다:
- Current(현재) — 지금 열려 있는 연결.
- History(기록) — 닫힌 연결. 최신순이며 이번 실행의 기록에서 다시 읽어 옵니다.
각 행에는 호스트, 포트, 종류, 선택된 정책, 일치한 규칙, 지속 시간, 바이트 수가 있습니다. 지속 시간은 이 브라우저 탭이 그 연결을 처음 본 순간부터 센 것이지 연결이 열린 시점부터가 아니므로, Current(현재) 탭에서만 의미가 있습니다. Inspect(살펴보기)는 행을 그 자리에서 펼쳐 이 요청이 왜 그리로 갔는지에 답합니다:
| 항목 | 무엇을 알려 주는가 |
|---|---|
| 일치한 규칙 / 규칙 출처 | 이 연결을 결정한 규칙 줄과 그것이 어느 섹션에서 왔는지 |
| 선택된 정책 / 어댑터 | 규칙이 고른 정책과 실제로 실어 나른 아웃바운드 |
| DNS 출처 | 어느 리졸버가 답했는지, 캐시 적중이었는지 |
| 적용된 재작성 | 이 메시지를 바꾼 재작성·Mock 규칙 — 규칙 자신의 문장으로. 연결당 최대 16건만 보관되며, 넘치면 「N개 더 있음 (표시되지 않음)」이라고 표시됩니다 |
| 종료 이유 / 비고 | 왜 끝났는지, 그리고 커널이 하고 싶었던 말 |
표 아래에는 캡처된 요청과 응답이 회선을 지나간 그대로 표시됩니다(헤더와 본문, HTTPS 복호화 대상 호스트에서는 복호화된 상태로).
본문을 보려면 트래픽 기록이 전제입니다
본문은 Chute가 캡처했을 때만 존재합니다. 문제를 재현하기 전에 기록을 켜십시오:
[General]에replica = true, 또는- Chute Mac: 메뉴 막대 → 트래픽 캡처, 또는
- API:
PUT /api/features/record-traffic에{"enabled": true}.
켜지 않아도 연결은 경로 귀속과 타이밍을 모두 갖춘 채로 나타납니다 — 빠지는 것은 페이로드뿐입니다. [Replica] 섹션이 캡처 범위를 더 좁히므로 — 그곳의 필터는 hide-crashlytics-request를 포함해 모두 적용됩니다 — 거기서 걸러진 요청 역시 본문이 없습니다.
HAR로 내보내기
Connections 페이지의 Export HAR(HAR 내보내기)는 현재 탭을 HAR 1.2 파일로 내려받습니다 — 엔드포인트 기본값인 최대 100개까지이며(엔드포인트의 limit로 최대 300개까지 올릴 수 있음), History 탭 자체는 최대 200개를 보여 줍니다. HAR는 표준 형식이라 브라우저 개발자 도구(Network 패널 → 가져오기)나 Charles, Proxyman 같은 도구로 열 수 있습니다.
내보낸 파일에는 그런 도구들이 기대하는 것 — 요청과 응답의 헤더, 타이밍, 기록이 켜져 있었다면 본문 — 에 더해, HAR에 대응 필드가 없는 정보를 담은 _kl 객체가 항목마다 붙습니다: 선택된 정책, 일치한 규칙, 적용된 재작성입니다. 송신과 수신 시간은 추정이 아니라 캡처 자체의 타임스탬프에서 오므로 의미가 있습니다. 앱에도 자체 출구가 있습니다. Chute iOS의 Dashboard에는 HAR로 내보내기와 전체 HAR로 내보내기가 있고(같은 형식으로 커널이 생성), Chute Mac의 연결 상세 창에는 콘솔을 여는 요청 및 기록 버튼이 있습니다 — 열리는 것은 콘솔의 홈이지 그 연결 자체는 아닙니다. 항목 하나는 연결 하나입니다. 여러 요청을 실어 나른 keep-alive 연결에서는 첫 메시지만 기술하고, 뒤따른 메시지의 몇 바이트를 뺐는지 적어 둡니다.
DNS
리졸버 캐시와 각 레코드에 답한 서버, [Host]에서 온 항목, 그리고 시스템 hosts 파일. Clear Cache(캐시 지우기)는 동적 레코드를 비웁니다. 여기에는 레코드 하나만 지우는 기능이 없으며, 그것은 API의 DELETE /api/dns/records/:domain으로만 가능합니다.
Policies(정책)
아웃바운드 모드(Rule / Global / Direct — 규칙 / 글로벌 / 직접 연결)와 각 정책 그룹의 현재 선택. 여기서 선택을 바꾸면 실행 중인 커널에 즉시 반영됩니다 — 앱에서 그룹을 바꾸는 것과 같은 동작입니다.
Rules(규칙)
이 페이지에는 성격이 다른 두 가지가 함께 있습니다.
라우팅 규칙 — [Rule] 섹션을 평가 순서대로 나열한 것. 설정 파일에서 오므로 읽기 전용입니다.
재작성 및 Mock 규칙 — URL 재작성, 헤더 재작성, 본문 재작성, Mock, 그리고 MitM 호스트 목록. 이들은 여기서 추가·삭제할 수 있습니다:
- 설정 파일에 쓸 그대로 규칙을 붙여 넣고 Add(추가)를 누르십시오. 파싱되지 않는 줄은 파서의 지적과 함께 거부되며 저장되지 않습니다 — 결코 일치할 수 없는 규칙에는 증상이 없으니, 지금 아는 편이 낫습니다.
- Remove(제거)는 규칙 하나를 지우고, Clear(지우기)는 한 계열을 비웁니다.
- 변경은 실행 중인 커널에만 존재합니다. 설정 파일로 다시 쓰이지 않으며, 리로드나 재시작하면 파일의 내용으로 돌아갑니다. 여기서 시험해 보고, 통한 그 한 줄을 파일에 쓰십시오.
재작성 및 Mock 적용 현황 — 이번 실행에서 적용된 모든 재작성·Mock 규칙과 횟수, 마지막 적용 시각. 이 표는 서로 다른 규칙을 최대 512개까지 추적하며, 그 이상은 몇 개가 더 실행되었지만 추적되지 않았는지 알려 줍니다. 이 표가 「내 재작성이 아무 일도 안 한다」에 대한 답입니다. 여기에 나타나지 않는 규칙은 한 번도 일치한 적이 없습니다. 일치했는데 눈에 띄는 변화가 없는 것과는 다른 문제입니다. 구별하는 법은 재작성이 아무 일도 하지 않는 이유는?를 보십시오.
Diagnostics(진단)
엔진이 무엇을 붙들고 있는지, 지난 실행이 어떻게 끝났는지, 그리고 직접 쏘아 볼 수 있는 검사들.
- Footprint / CPU / Uptime / Live flows / Superseded flows / Engine generation(메모리 사용량 / CPU / 가동 시간 / 활성 플로우 / 이전 세대 플로우 / 엔진 세대) — 이번 실행의 현재 모습. 흐름 수는 그대로인데 메모리 사용량이 계속 오르면 살펴볼 만합니다. iOS와 tvOS에서는 시스템이 확장을 회수하기 전에 지켜보는 값이기도 합니다.
- Previous exit(이전 종료) —
Clean(정상 종료),Terminated unexpectedly(예기치 않게 종료됨),Killed for memory(메모리 부족으로 종료됨) 중 하나와 지난 실행의 id, 가동 시간, 최대 메모리. Chute가 「죽었다」면 이 줄부터 읽으십시오. Killed for memory(메모리 부족으로 종료됨)는 Chute가 실패한 것이 아니라 시스템이 회수했다는 뜻이며, 다음에 무엇을 볼지가 달라집니다. - Refusals(거부) — 엔진이 무엇을 왜 거절했는지 자원과 이유별로 센 표. 연결이 끊겼는데 달리 설명이 없다면 이유는 대개 여기 있습니다.
- Run a probe(프로브 실행) — 도달성(포트를 주면 TCP, 아니면 ICMP), 실행 중인 리졸버를 통한 DNS 질의, 이그레스 IP 확인, 정책의 지연 시간 테스트. 각각 제한 시간이 있고 정확히 한 번 답합니다. 정의되지 않은 정책 이름은 측정되지 않고 거부되므로, 오타는 오타로 돌아옵니다.
- Events(이벤트) — 이번 실행의 주목할 만한 순간: 대량 실패, 이그레스 변경 등.
- Tailscale —
[Tailscale]섹션이 설정되어 있으면 엔진의 현재 상태를, 없으면idle을 보여 줍니다. 이는 정상적인 답입니다. - Download diagnostic bundle(진단 번들 다운로드) — 지원 문의에 첨부할 수 있는, 민감 정보를 지운 아카이브 하나. 내용은 진단 번들 보내기를 보십시오.
Config(설정)
실행 중인 설정을 편집 가능한 상자에 보여 주고, Reload(다시 로드)로 상자의 내용을 적용합니다.
여기 보이는 설정은 비밀이 지워져 있습니다. 비밀번호, 제어 시크릿, CA 암호, WireGuard 키 등은
<redacted>로 표시됩니다. 그런데 Reload(다시 로드)는 상자의 내용을 그대로 적용하므로, 보이는 텍스트 그대로 리로드하면 그 비밀들이 문자 그대로의<redacted>로 실행 중인 커널에 들어갑니다 — 그것을 필요로 하는 정책이 실패하기 시작합니다. 설정 파일은 건드리지 않으므로 해당 설정을 다시 선택하면 복구됩니다.이 페이지는 설정을 읽는 용도로, 그리고 직접 전부 입력한 변경을 적용하는 용도로 쓰십시오. 파일 자체를 편집하려면 앱의 편집기를 사용하십시오.
Logs(로그)
커널 로그의 실시간 추적. 레벨별로 색이 입혀지고, 읽는 동안 Pause(일시 중지)로 멈출 수 있습니다. 상세도는 이 페이지가 아니라 loglevel이 정합니다 — 필요한 줄이 없다면 올린 뒤 재현하십시오.
콘솔이 내줄 수 있는 것
콘솔에 접근할 수 있다는 것은 이번 실행이 본 모든 것에 접근할 수 있다는 뜻으로 여기십시오. URL과 헤더, 프로세스 이름이 담긴 연결 기록, 캡처된 요청과 응답 본문, 설정, 그리고 로그를 내줄 수 있습니다. 인증 없는 제어면이 기본값이 아닌 이유, 그리고 루프백이 아닌 곳에 바인딩하려면 직접 시크릿을 설정해야 하는 이유가 이것입니다 — external-http-secret을 참고하십시오.
이 페이지는 영어판의 번역본입니다. 내용이 다를 경우 영어판이 우선합니다.