* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
40 KiB
Stealth Guide (ไทย)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
แหล่งข้อมูลหลัก:
open-sse/utils/tlsClient.ts,open-sse/services/{tlsClientBase,claudeTlsClient,perplexityTlsClient,grokTlsClient,notionTlsClient,lmarenaTlsClient,claudeCodeCCH,claudeCodeFingerprint,claudeCodeObfuscation,claudeCodeCompatible}.ts,open-sse/config/cliFingerprints.ts,src/mitm/อัปเดตล่าสุด: 2026-09-02 — v3.8.51 กลุ่มผู้อ่าน: วิศวกรที่ดูแลการผสานรวมแบบซ่อนตัวซึ่งเฉพาะเจาะจงตามผู้ให้บริการ
OmniRoute ผสานรวมกับผู้ให้บริการที่ระบบเอดจ์ตรวจสอบลายนิ้วมือของไคลเอนต์ที่ไม่เป็นทางการอย่างจริงจัง (TLS JA3/JA4, ลำดับส่วนหัว, รูปแบบเนื้อหา JSON, โทเค็นความถูกต้องสมบูรณ์) หน้านี้อธิบายพื้นผิวการซ่อนตัวที่ OmniRoute เปิดให้ใช้งานและตำแหน่งที่นำไปใช้งาน
ประกาศด้านกฎหมายและจริยธรรม
ฟีเจอร์การซ่อนตัวมีไว้เพื่อให้ OmniRoute ทำหน้าที่เป็นเลเยอร์ความเข้ากันได้ระหว่างบัญชีทางการที่ผู้ใช้เป็นเจ้าของ (Claude Code CLI, Codex, Antigravity, Cursor ฯลฯ) กับ API แบบรวมศูนย์ของ OmniRoute ฟีเจอร์เหล่านี้ ไม่ได้ มีไว้เพื่อหลบเลี่ยงการตรวจจับการฉ้อโกง แบ่งปันข้อมูลประจำตัว หรือละเมิดข้อกำหนดในการให้บริการของผู้ให้บริการ ผู้ดูแลคาดหวังให้ผู้ดำเนินการปฏิบัติตาม ToS ของต้นทางที่ตนได้ยอมรับเมื่อตอนสร้างบัญชี
เลเยอร์ลายนิ้วมือ TLS
open-sse/utils/tlsClient.ts — wreq-js (Chrome 124)
เซสชัน wreq-js แบบคงอยู่จะถูกสร้างแบบหน่วงเวลาตามขอบเขตบัญชีและพร็อกซีที่ได้รับการแก้ไข
TlsClient ซึ่งใช้ร่วมกันทั้งโพรเซสจะรวมเซสชันไว้สูงสุด 128 เซสชัน โดยจำลองเป็น Chrome 124 บน macOS สำหรับ
ต้นทางที่อยู่เบื้องหลัง Cloudflare TlsClient.fetch() จะหยุดการทำงานอย่างปลอดภัยเมื่อรันไทม์เนทีฟ
ไม่พร้อมใช้งาน โดยผู้เรียกอาจเลือกใช้ทางเลือกสำรองภายนอก wrapper นี้อย่างชัดเจน
- โปรไฟล์เซสชัน:
browser: "chrome_124", os: "macos" - การกำหนดพร็อกซี (ตามลำดับความสำคัญ):
HTTPS_PROXY→HTTP_PROXY→ALL_PROXY(รวมถึงรูปแบบตัวพิมพ์เล็ก) - ระยะหมดเวลา:
TLS_CLIENT_TIMEOUT_MS(สืบทอดจากFETCH_TIMEOUT_MSค่าเริ่มต้น 600000) - Response ของ
wreq-jsเข้ากันได้กับ fetch (headers,text(),json(),clone(),body) - ตัวเฝ้าระวังไบต์แรก (
open-sse/utils/tlsFirstByteWatchdog.ts, #12656):TlsClient.fetch()จะ resolve ทันทีที่ส่วนหัวจากต้นทางมาถึง ดังนั้นTLS_CLIENT_TIMEOUT_MSเพียงอย่างเดียวจึงไม่สามารถจำกัดเวลา ของ body ที่ไม่ส่งไบต์แรกออกมาได้guardTlsFirstByte()จะแข่งขันระหว่างread()ครั้งแรกของ body กับTLS_FIRST_BYTE_WATCHDOG_MS(ค่าเริ่มต้น10000, ค่า0ใช้ปิดการทำงาน) โดย body ที่ทำงานปกติจะ ไม่ได้รับผลกระทบ ส่วน body ที่ค้างจะยกเลิกตัวอ่านของ wreq และปล่อยให้ตรรกะ TLS-fallback ที่มีอยู่ของproxyFetchเปลี่ยนไปใช้ตัวจัดส่งแบบเชื่อมต่อโดยตรง/ผ่านพร็อกซี (คำขอที่ไม่ปลอดภัยต่อการส่งซ้ำ เช่น POST ที่มี body จะยังคง throw แทนที่จะถูกลองใหม่โดยไม่มีการแจ้งเตือน)
การส่งข้อมูลของผู้ให้บริการผ่านเว็บคุกกี้ — wreq-js 3.2.0
open-sse/services/tlsClientBase.ts เป็นอะแดปเตอร์ที่ใช้ร่วมกันสำหรับการส่งข้อมูลผ่าน
เว็บคุกกี้เฉพาะทางทั้งห้ารายการด้านล่าง wrapper แบบบางของผู้ให้บริการแต่ละรายจะเลือกโปรไฟล์เบราว์เซอร์/ระบบปฏิบัติการ อะแดปเตอร์
ใช้ตัวโหลดรันไทม์ wreq และพูลการส่งข้อมูลเพียงชุดเดียวใน open-sse/utils/tlsClient.ts โดยใช้
โปรไฟล์ + ระบบปฏิบัติการ + พร็อกซีที่ได้รับการแก้ไขเป็นคีย์ ขณะที่ทุกคำขอใช้ cookieMode: "ephemeral" ดังนั้นบัญชีและ
คำขอจึงใช้การเชื่อมต่อระดับการส่งข้อมูลร่วมกัน แต่จะไม่ใช้เซสชัน wreq หรือโถคุกกี้ร่วมกัน
| ผู้ให้บริการ | โปรไฟล์ | ระบบปฏิบัติการที่จำลอง | นโยบาย EOF ของสตรีม |
|---|---|---|---|
| Claude | chrome_146 |
Linux | รวม [DONE] |
| Perplexity | firefox_148 |
macOS | รวม event: end_of_stream |
| Grok | chrome_146 |
Linux | ไม่รวม [DONE] |
| Notion | chrome_146 |
Windows | รวม [DONE] |
| LMArena | chrome_146 |
Windows | ไม่มี sentinel; ปิดเมื่อถึง EOF เนทีฟ |
- การสตรีมจะใช้งาน
ReadableStreamของการตอบกลับแบบเนทีฟโดยตรง โดยไม่มีการสร้างไฟล์ชั่วคราวหรือ sidecar - ระบบจะตรวจสอบข้อมูลเริ่มต้นสูงสุด 256 ไบต์ก่อนเปิดให้เข้าถึงสตรีม ผู้ให้บริการ SSE จะบัฟเฟอร์ข้อผิดพลาดที่ไม่ใช่ SSE
ส่วน Grok/LMArena จะแมปคำท้าทายจาก Cloudflare เป็น
403และหน้า HTML คั่นกลางเป็น502 - ระยะหมดเวลาของคำขอเนทีฟยังคงถูกครอบด้วยกำหนดเวลาสิ้นสุดแบบเด็ดขาดของ JS การค้างจะทำให้ เฉพาะการส่งข้อมูลของโปรไฟล์/ระบบปฏิบัติการ/พร็อกซีที่ได้รับผลกระทบใช้การไม่ได้และถูกปิด ก่อนที่คำขอถัดไปจะสร้างขึ้นใหม่
- ลำดับความสำคัญในการกำหนดพร็อกซีคือ
proxyUrlต่อการเรียก → บริบทบัญชี/แดชบอร์ดที่จำกัดขอบเขตตามคำขอ →HTTPS_PROXY/HTTP_PROXY/ALL_PROXY(รวมถึงรูปแบบตัวพิมพ์เล็ก) ข้อผิดพลาดในการกำหนดค่าจะ หยุดการทำงานอย่างปลอดภัยแทนที่จะทำให้การเชื่อมต่อโดยตรงรั่วไหล LMArena ตั้งใจกำหนดค่าโดยอิงกับarena.ai byteResponseส่งคืน URL แบบdata:ที่ระบุชนิดเนื้อหาโดยไม่มีความเสียหายจาก UTF-8- ข้อผิดพลาดได้แก่
TlsClientUnavailableError(แพ็กเกจ/ส่วนเสริมไม่พร้อมใช้งาน),TlsClientHangError(เกินกำหนดเวลา) และWreqTransportCapacityError(รหัสข้อผิดพลาดด้านความจุเซสชันที่ใช้ร่วมกัน) เมื่อสล็อตโปรไฟล์/ระบบปฏิบัติการ/พร็อกซีแบบจำกัดจำนวนทั้ง 128 สล็อตกำลังใช้งานหรือกำลังปิด
เซสชัน TlsClient แบบทั่วไปข้างต้นยังคงมีไว้เฉพาะสำหรับสถานะคุกกี้แบบคงอยู่ที่ได้รับการสนับสนุนโดยเบราว์เซอร์
ทั้งสองเส้นทางใช้ตัวโหลดโมดูล wreq ที่แคชไว้และฮุกวงจรชีวิตของโพรเซสชุดเดียวกัน แต่พูลของทั้งสองยังคง
แยกจากกัน เนื่องจากอายุการใช้งานของคุกกี้ถูกกำหนดให้แตกต่างกันโดยเจตนา
แพ็กเกจที่ตรึงเวอร์ชันไว้รองรับโปรไฟล์เหล่านี้ แต่การยอมรับจาก WAF จริงอาจเปลี่ยนแปลงได้โดยไม่ขึ้นกับ การทดสอบสัญญาภายในระบบ โปรดตรวจสอบการเปลี่ยนแปลงลายนิ้วมือกับบัญชีจริงที่ได้รับอนุญาตอย่างชัดเจน ก่อนอ้างว่ามีความเทียบเท่ากับเบราว์เซอร์ของต้นทาง
ชุดพรางตัว Claude Code
เมื่อเปิดใช้ cliCompatMode OmniRoute จะปรับรูปแบบคำขอ Claude ขาออกให้ไม่สามารถแยกแยะจากทราฟฟิกของ claude-cli ได้ โดยมีโมดูลสามตัวทำงานร่วมกัน:
claudeCodeFingerprint.ts
คำนวณลายนิ้วมือ cc_version ขนาด 3 อักขระที่ฝังอยู่ในส่วนหัวการเรียกเก็บเงิน:
SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]
FINGERPRINT_SALT = "59cf53e54c78"(ฮาร์ดโค้ดไว้ และตรงกับไคลเอนต์อย่างเป็นทางการ)- อินพุต: อักขระที่ดัชนี 4, 7 และ 20 ของข้อความผู้ใช้แรก + สตริงเวอร์ชัน
- เอาต์พุต: คำนำหน้าเลขฐานสิบหกขนาด 3 อักขระ
claudeCodeCCH.ts (แฮชเนื้อหาไคลเอนต์)
การตรวจสอบความถูกต้องสมบูรณ์ฝั่งเซิร์ฟเวอร์ซึ่ง Claude Code CLI อย่างเป็นทางการคำนวณผ่าน Bun/Zig โดย OmniRoute นำมาสร้างใหม่ด้วย xxhash-wasm:
- แปลงบอดีเป็นข้อมูลอนุกรมโดยใช้ตัวแทน
cch=00000; xxhash64(bytes, seed) & 0xFFFFF- เลขฐานสิบหกตัวพิมพ์เล็กขนาด 5 อักขระ โดยเติมศูนย์ด้านหน้า
- แทนที่
cch=00000;ด้วยโทเค็นที่คำนวณได้
ค่าคงที่:
- ค่าตั้งต้น:
0x6e52736ac806831e - รูปแบบ:
/\bcch=([0-9a-f]{5});/
claudeCodeObfuscation.ts
แทรก Unicode ตัวเชื่อมความกว้างเป็นศูนย์ (U+200D) หลังอักขระแรกของชื่อไคลเอนต์ที่ "ละเอียดอ่อน" เพื่อให้ตัวกรองต้นทางไม่สามารถค้นหาชื่อเหล่านั้นด้วย grep ได้ รายการคำเริ่มต้น:
opencode, open-code, cline, roo-cline, roo_cline, cursor, windsurf,
aider, continue.dev, copilot, avante, codecompanion
ใช้กับ: บล็อก system, messages[].content ทั้งหมด และ tools[].description / tools[].function.description ผู้ดำเนินการสามารถกำหนดทับได้ผ่าน setSensitiveWords()
claudeCodeCompatible.ts — ผู้ให้บริการ anthropic-compatible-cc-*
สำหรับรีเลย์ Anthropic ของบุคคลที่สามซึ่งยอมรับเฉพาะทราฟฟิก "Claude Code จริง":
CLAUDE_CODE_COMPATIBLE_USER_AGENT = "claude-cli/2.1.258 (external, sdk-cli)"CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION = "0.112.1"CLAUDE_CODE_COMPATIBLE_STAINLESS_RUNTIME_VERSION = "v26.3.0"- โดยค่าเริ่มต้น
anthropic-beta = "claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24" - ตัวเลือก "Enable redact-thinking beta" ระดับการเชื่อมต่อจะเพิ่ม
redact-thinking-2026-02-12เมื่อระบบต้นทางที่เข้ากันได้กับ CC ต้องการสตรีมการคิดที่ผ่านการปกปิดโดยเฉพาะ - ตัวเลือก "Enable summarized thinking display" ระดับการเชื่อมต่อจะจัดเก็บ
providerSpecificData.requestDefaults.summarizeThinkingและเพิ่มdisplay: "summarized"ลงในคำขอการคิดที่เข้ากันได้กับ CC ซึ่งยังไม่ได้กำหนดโหมดการแสดงผล CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07"(ตระกูล Opus/Sonnet 4.x)- พาธเริ่มต้น:
/v1/messages?beta=true
โมดูลที่เกี่ยวข้องในชุดเดียวกัน:
claudeCodeConstraints.ts— กฎอุณหภูมิ + การควบคุมแคชclaudeCodeToolRemapper.ts— การแมปชื่อเครื่องมือใหม่claudeCodeExtraRemap.ts— การปรับเพย์โหลดเพิ่มเติมให้เป็นมาตรฐาน
การพรางตัว Antigravity
คำขอ Antigravity จะเก็บรักษาข้อความของผู้เรียกแบบไบต์ต่อไบต์ OmniRoute จะไม่แทรกอักขระความกว้างเป็นศูนย์ลงในพรอมต์ หรือเปลี่ยนชื่อ/แทรกเครื่องมือเพื่อเลียนแบบไคลเอนต์ IDE
antigravityHeaderScrub.ts
ลบตัวบ่งชี้ Stainless SDK (x-stainless-lang, x-stainless-package-version, x-stainless-os, x-stainless-arch, x-stainless-runtime, x-stainless-runtime-version, x-stainless-timeout, x-stainless-retry-count, x-stainless-helper-method) ก่อนส่งต่อ
⚠️ ความเสี่ยง: ANTIGRAVITY_CREDITS=always (จุดเสี่ยงสูงต่อการถูกแบนบัญชี)
ANTIGRAVITY_CREDITS=always (ใช้งานโดย open-sse/executors/antigravity.ts) จะกำหนดเส้นทางให้คำขอ ทุกคำขอ ผ่าน Antigravity AI Credit Overages (เครดิต Google แบบชำระเงิน) แทนที่จะปล่อยให้โควตาระดับฟรีของ Google เป็นตัวจำกัดการใช้งาน แม้จะมีการระบุไว้ในเอกสารว่าเป็นฟีเจอร์ แต่นี่คือ รายงานการละเมิดข้อกำหนดในการให้บริการที่พบบ่อยที่สุดเพียงกรณีเดียวที่เราได้รับ — บัญชี Google Ultra หลายบัญชีถูกแบนด้วย 403 / "service disabled for ToS violation" / insufficient_quota หลังจากทำงานเพียงไม่กี่ชั่วโมงโดยตั้งค่าเป็น =always
การบังคับใช้งานของระบบต้นทางเกิดขึ้นที่ ฝั่ง Google ไม่ใช่สิ่งที่ OmniRoute สามารถป้องกันได้ ชื่อตัวแปรสภาพแวดล้อมและเอกสารที่มีอยู่ทำให้ดูเหมือนเป็นตัวเลือกที่สามารถเปิดใช้ได้อย่างปลอดภัย แต่ความจริงไม่ใช่เช่นนั้น
เหตุผลที่การตั้งค่านี้กระตุ้นระบบตรวจจับการใช้งานในทางที่ผิดได้รุนแรงกว่าการใช้เฉพาะระดับฟรี:
- การใช้จ่ายอัตโนมัติอย่างต่อเนื่องบนบัญชี Google บัญชีเดียวจะถูกตรวจจับต่างจากรูปแบบที่ระดับฟรีใช้จนถึงโควตาแล้วหยุด
- เครดิตส่วนเกินไม่มีเพดานอัตราการใช้งาน ดังนั้นไคลเอนต์ที่กำหนดค่าผิดอาจใช้เงินหลายร้อย USD หมดภายในไม่กี่นาที และมีลักษณะคล้ายการขายคีย์ API ต่อหรือทราฟฟิกจากบอต
- ผู้ใช้ OmniRoute หลายรายที่ใช้เครดิตส่วนเกินพร้อมกันจาก IP ภายนอกเดียวกันจะยิ่งเพิ่มความรุนแรงของสัญญาณตรวจจับ
แนวทางที่แนะนำ:
- คงค่าเริ่มต้น
ANTIGRAVITY_CREDITS=offไว้ เว้นแต่ผู้ดำเนินการจะยอมรับความเสี่ยงด้านเครดิตแบบชำระเงินและการบังคับใช้กับบัญชีอย่างชัดแจ้งretryจะส่งคำขอปกติก่อน และแทรกเครดิตไม่เกินหนึ่งครั้งหลังได้รับข้อผิดพลาดโควตา 429 ที่เข้าเกณฑ์ ส่วนalwaysจะแทรกเครดิตตั้งแต่คำขอแรก - กระจายโหลดระหว่างผู้ให้บริการผ่าน Auto-Combo (
model: "auto"หรือคอมโบkr/glm/etc) แทนการใช้งานบัญชี Antigravity บัญชีเดียวจนเต็มขีดจำกัด - กำหนดขีดจำกัด RPM ต่อการเชื่อมต่อ ในหน้าแก้ไขของผู้ให้บริการ Antigravity (Dashboard → Providers → Antigravity → การเชื่อมต่อ → ขีดจำกัดอัตรา) 30–60 RPM เป็นขีดจำกัดสูงสุดที่สมเหตุสมผลสำหรับการใช้งานต่อเนื่อง
- ใช้เครือข่ายต้นทางที่เสถียรและอยู่ภายใต้การควบคุมของผู้ดำเนินการ และหลีกเลี่ยงการใช้บัญชีเดียวร่วมกันระหว่างผู้ใช้หรือเวิร์กโหลดที่ไม่เกี่ยวข้องกัน
- หากถูกแบน: ยื่นอุทธรณ์ผ่าน
support.google.com→ "Restore Workspace/Account access" พร้อมบอดีการตอบกลับquota_exceeded/service disabledที่ Google ส่งมาอย่างครบถ้วน การกู้คืนบัญชีไม่มีการรับประกัน
เอกสารอ้างอิงตัวแปรสภาพแวดล้อมอธิบายผลกระทบต่อบัญชีและค่าใช้จ่ายของแต่ละโหมดเครดิตไว้แล้ว
จุดที่เกี่ยวข้อง:
open-sse/executors/antigravity.ts— อ่านprocess.env.ANTIGRAVITY_CREDITSsrc/lib/oauth/providers/antigravity.ts— การเชื่อมต่อข้อมูลรับรอง- รายงานเหตุการณ์ต้นฉบับ: การสนทนา #1183
รีจิสทรีลายนิ้วมือ CLI — open-sse/config/cliFingerprints.ts
ตารางแยกตามผู้ให้บริการที่กำหนดลำดับส่วนหัวและลำดับฟิลด์ในเนื้อหา JSON แบบ ตรงกันทุกประการ ซึ่งบันทึกจากทราฟฟิก mitmproxy ของ CLI อย่างเป็นทางการ ปัจจุบันลงทะเบียนไว้แล้ว: codex, claude รวมถึงโปรไฟล์ที่สร้างขึ้นขณะรันใน providerHeaderProfiles.ts สำหรับ antigravity และ github
interface CliFingerprint {
headerOrder: string[]; // คำนึงถึงตัวพิมพ์เล็ก-ใหญ่
bodyFieldOrder: string[]; // คีย์ JSON ระดับบนสุด
userAgent?: string | (() => string);
extraHeaders?: Record<string, string>;
}
เปิดหรือปิดแยกตามผู้ให้บริการผ่าน env (ดูด้านล่าง) เมื่อปิดใช้งาน ส่วนหัว/คีย์ในเนื้อหาจะปรากฏตามลำดับที่ Node/JSON กำหนดมา ซึ่งง่ายต่อการระบุลายนิ้วมือ
พร็อกซี MITM (Antigravity, Linux/macOS/Windows)
สำหรับ CLI ที่ไม่สามารถเปลี่ยนเส้นทางไบนารีผ่าน OPENAI_BASE_URL ได้ OmniRoute จะเรียกใช้พร็อกซีภายในเครื่องที่ยุติการเชื่อมต่อ TLS เอนด์พอยต์อยู่ภายใต้ src/app/api/cli-tools/antigravity-mitm/
| เมธอด | เอนด์พอยต์ | วัตถุประสงค์ |
|---|---|---|
| GET | /api/cli-tools/antigravity-mitm |
สถานะ — กำลังทำงาน, pid, dnsConfigured, certExists |
| POST | /api/cli-tools/antigravity-mitm |
เริ่ม MITM (ต้องมี apiKey + sudoPassword) |
| DELETE | /api/cli-tools/antigravity-mitm |
หยุด MITM |
| GET | /api/cli-tools/antigravity-mitm/alias |
แสดงรายการนามแฝงโมเดล |
| PUT | /api/cli-tools/antigravity-mitm/alias |
บันทึกนามแฝงโมเดลสำหรับเครื่องมือ |
โฮสต์เป้าหมายที่ถูกดักจับ: daily-cloudcode-pa.googleapis.com (อัปสตรีมของ Antigravity)
ลำดับการเริ่มต้น (src/mitm/manager.ts::startMitm)
- สร้างใบรับรองแบบลงนามด้วยตนเองผ่าน
selfsigned(RSA-2048, SHA-256, 1 ปี) —cert/generate.ts - ติดตั้งใบรับรองลงในคลังความเชื่อถือของระบบ —
cert/install.ts - เพิ่มรายการ hosts
127.0.0.1 daily-cloudcode-pa.googleapis.com—dns/dnsConfig.ts - เรียกใช้
src/mitm/server.cjsพร้อมROUTER_API_KEY+MITM_LOCAL_PORT(ค่าเริ่มต้น443) - บันทึก PID ลงใน
<DATA_DIR>/mitm/.mitm.pid
การตรวจหาคลังความเชื่อถือแบบไดนามิกบน Linux — cert/install.ts
getLinuxCertConfig() จะไล่ตรวจสอบรายการตามลำดับความสำคัญและเลือกไดเรกทอรีแรกที่มีอยู่:
| ตระกูลดิสโทร | ไดเรกทอรี | คำสั่งอัปเดต |
|---|---|---|
| Debian / Ubuntu | /usr/local/share/ca-certificates |
update-ca-certificates |
| Arch / CachyOS / Manjaro | /etc/ca-certificates/trust-source/anchors |
update-ca-trust |
| Fedora / RHEL / CentOS | /etc/pki/ca-trust/source/anchors |
update-ca-trust |
| openSUSE | /etc/pki/trust/anchors |
update-ca-certificates |
ชื่อไฟล์ใบรับรอง: omniroute-mitm.crt จับคู่ลายนิ้วมือผ่าน getCertFingerprint() (SHA-1 ของ DER)
นอกจากนี้ updateNssDatabases() จะติดตั้งลงในฐานข้อมูล NSS ของผู้ใช้แต่ละรายเมื่อมี certutil: ~/.pki/nssdb, ~/snap/chromium/.../nssdb และโปรไฟล์ Firefox ทั้งหมด (รวมถึง snap) โดยใช้ชื่อเล่น OmniRoute MITM Root CA
macOS / Windows
- macOS:
security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain - Windows: PowerShell ที่เรียกใช้ด้วยสิทธิ์ระดับสูง →
certutil -addstore Root
การยืนยันตัวตน
เอนด์พอยต์ MITM ทั้งหมดต้องใช้การยืนยันตัวตนสำหรับการจัดการ (requireCliToolsAuth) รหัสผ่าน sudo จะถูกแคชไว้ในขอบเขตของโมดูล (ไม่ใช่ globalThis) และถูกล้างเมื่อเรียก stopMitm()
การแทนที่ User-Agent — ตัวแปรสภาพแวดล้อม (.env.example ส่วนที่ 12)
| ตัวแปร | ค่าเริ่มต้น |
|---|---|
CLAUDE_USER_AGENT |
claude-cli/2.1.258 (external, cli) |
CODEX_USER_AGENT |
codex-cli/0.149.0 (Windows 10.0.26200; x64) |
GITHUB_USER_AGENT |
GitHubCopilotChat/0.54.0 |
ANTIGRAVITY_USER_AGENT |
antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0 |
KIRO_USER_AGENT |
AWS-SDK-JS/3.0.0 kiro-ide/1.0.0 |
QODER_USER_AGENT |
Qoder-Cli |
CURSOR_USER_AGENT |
Cursor/3.4 |
ถูกนำไปใช้โดย open-sse/executors/base.ts::buildHeaders() ผ่านการค้นหาแบบไดนามิก ให้อัปเดตค่าเหล่านี้เมื่อผู้ให้บริการเผยแพร่ CLI เวอร์ชันใหม่ — สตริง UA ที่ล้าสมัยจะเริ่มถูกปฏิเสธเนื่องจากถูกมองว่าเป็นไคลเอนต์เวอร์ชันเก่า
สวิตช์โหมดความเข้ากันได้ของ CLI (.env.example ส่วนที่ 13)
| ตัวแปร | ผลลัพธ์ |
|---|---|
CLI_COMPAT_CODEX=1 |
ลายนิ้วมือ Codex |
CLI_COMPAT_CLAUDE=1 |
ลายนิ้วมือ claude-cli |
CLI_COMPAT_GITHUB=1 |
ลายนิ้วมือ GitHub Copilot Chat |
CLI_COMPAT_ANTIGRAVITY=1 |
ลายนิ้วมือ Antigravity |
CLI_COMPAT_KIRO=1 |
Kiro |
CLI_COMPAT_CURSOR=1 |
Cursor |
CLI_COMPAT_KIMI_CODING=1 |
Kimi Coding |
CLI_COMPAT_KILOCODE=1 |
KiloCode |
CLI_COMPAT_CLINE=1 |
Cline |
CLI_COMPAT_ALL=1 |
เปิดใช้งานทั้งหมดข้างต้น |
IP ของผู้ให้บริการจะถูก คงไว้เสมอ — สวิตช์นี้เพียงปรับรูปแบบคำขอบนเครือข่ายเท่านั้น โดยไม่ได้เปลี่ยน IP ขาออก
การกรองส่วนหัวขาเข้า
OmniRoute จะล้างส่วนหัวของไคลเอนต์ขาเข้าก่อนส่งต่อ เพื่อไม่ให้คำขอที่มาจาก Cursor เปิดเผย User-Agent: Cursor/X.Y.Z ไปยังต้นทาง Claude โปรดดูรายการปฏิเสธใน src/shared/constants/upstreamHeaders.ts ซึ่งได้รับการดูแลให้สอดคล้องกับสคีมา Zod และการทดสอบหน่วยอยู่เสมอ
การอัปเดตลายนิ้วมือเมื่อผู้ให้บริการเปลี่ยนค่า
- บันทึกทราฟฟิกจาก CLI อย่างเป็นทางการด้วย
mitmproxy(การสกัดกั้น TLS + การดัมป์ข้อมูล) - แยกค่า JA3/JA4 และลำดับส่วนหัวตามตัวอักษรจริง
- อัปเดตรายการ
CLI_FINGERPRINTS[...]ที่เกี่ยวข้อง - อัปเดตค่าเริ่มต้น
*_USER_AGENTที่ตรงกันใน.env.example - หากแฮนด์เชก TLS เปลี่ยนแปลง ให้อัปเดตตัวห่อหุ้มของผู้ให้บริการที่เกี่ยวข้องหรือตัวเลือก
browser:ของ wreq-js - เรียกใช้การทดสอบ TLS เฉพาะของผู้ให้บริการและการทดสอบคานารีแบบแมนนวลกับผู้ให้บริการจริง
- เผยแพร่เป็นรุ่นแพตช์ และบันทึกรายละเอียดไว้ใน
CHANGELOG.md
การทดสอบ
open-sse/services/__tests__/claudeTlsClient.test.ts— พฤติกรรมของตัวห่อหุ้ม TLS ที่ใช้ร่วมกันtests/unit/anthropic-cache-fingerprint.test.ts— ความเป็นเชิงกำหนดของลายนิ้วมือtests/unit/chatgpt-web-source-retirement.test.ts— แหล่งที่มาเพื่อการพรางตัวทั่วไปของ ChatGPT Web ยังคงไม่มีอยู่ ขณะที่ Codex Web ยังคงมีอยู่
ดูเพิ่มเติม
- RESILIENCE_GUIDE.md — สิ่งที่จะเกิดขึ้นเมื่อเส้นทางแบบล่องหนได้รับ
403 - TROUBLESHOOTING.md
- ENVIRONMENT.md — เอกสารอ้างอิงตัวแปรสภาพแวดล้อมฉบับสมบูรณ์
- CLI-TOOLS.md — มุมมองของผู้ปฏิบัติงานต่อเวิร์กโฟลว์ MITM