Skip to content

Commit c12ffd4

Browse files
therealalephclaude
andcommitted
chore: redact val.town from code and docs, rename exit-node script
The val.town founder asked us not to promote using their service. This commit removes every val.town reference from the codebase and rewrites the exit-node guides to be platform-agnostic. Changes: - Renamed assets/exit_node/valtown.ts → assets/exit_node/exit_node.ts. TypeScript itself is unchanged — same web-standard Request/Response/ fetch API that runs on any serverless runtime. - Rewrote assets/exit_node/README.md and README.fa.md to recommend Deno Deploy as the primary host for users who want a free serverless TS endpoint, with fly.io and your-own-VPS as alternatives. CF Workers is explicitly called out as not-helpful (CF outbound is still on CF's flagged IP space). - Updated all val.town mentions in source comments (src/config.rs, src/domain_fronter.rs, src/bin/ui.rs) to neutral wording. - Updated config.exit-node.example.json `_comment` strings and the example URL. - Updated main README.md FAQ entries (Persian + English) and docs/guide.md / docs/guide.fa.md. - Old changelog files (v1.9.4 / v1.9.5 / v1.9.9) had val.town mentions retroactively replaced too — same redaction principle. - Bumped to v1.9.10 with a changelog noting the rename + Telegram channel brief format from earlier today. Users who already have an exit node deployed (on whichever host they picked) don't need to change anything — the wire protocol is identical and the renamed script is byte-identical to the old one. Tests: 179 lib + 35 tunnel-node green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6c69244 commit c12ffd4

16 files changed

Lines changed: 271 additions & 244 deletions

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mhrv-rs"
3-
version = "1.9.9"
3+
version = "1.9.10"
44
edition = "2021"
55
description = "Rust port of MasterHttpRelayVPN -- DPI bypass via Google Apps Script relay with domain fronting"
66
license = "MIT"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ If something doesn't work:
154154

155155
**YouTube videos don't play.** YouTube's video chunks come from `googlevideo.com`, which Apps Script can't reach (Google blocks Apps Script from accessing Google's own video CDN). The page itself loads fine; only video playback is affected. Fix: Full Tunnel + VPS, or add `.googlevideo.com` to `passthrough_hosts` in your config (browser hits it directly, but on Iran ISPs it's still throttled).
156156

157-
**ChatGPT / Claude / Grok shows a Cloudflare CAPTCHA.** Cloudflare flags Google datacenter IPs as bots. Fix: set up an **exit node** (a free 5-minute thing on val.town that bridges Apps Script → val.town → claude.ai). See [`assets/exit_node/README.md`](assets/exit_node/README.md).
157+
**ChatGPT / Claude / Grok shows a Cloudflare CAPTCHA.** Cloudflare flags Google datacenter IPs as bots. Fix: set up an **exit node** — a small TypeScript handler you deploy on a serverless host (Deno Deploy, fly.io, your own VPS) that bridges Apps Script → your exit node → claude.ai. See [`assets/exit_node/README.md`](assets/exit_node/README.md).
158158

159159
**Telegram is unstable.** Telegram uses MTProto, which Apps Script doesn't speak. Pair with [xray](https://github.com/XTLS/Xray-core) on your machine — see [Telegram via xray in the full guide](docs/guide.md#telegram-via-xray).
160160

@@ -324,7 +324,7 @@ System Settings → Network → Wi-Fi → Details → **Proxies** → هر دو
324324

325325
**ویدیوی یوتیوب پخش نمی‌شود.** chunkهای ویدیوی یوتیوب از `googlevideo.com` می‌آیند و Apps Script نمی‌تواند به آن برسد (گوگل اجازهٔ دسترسی Apps Script به CDN ویدیوی خودش را نمی‌دهد). صفحهٔ خود یوتیوب لود می‌شود، فقط پخش ویدیو تحت تأثیر است. راه‌حل: Full Tunnel + VPS، یا `.googlevideo.com` را به `passthrough_hosts` در کانفیگت اضافه کن (مرورگر مستقیم می‌رود اما روی ISP ایران throttle می‌خورد).
326326

327-
**ChatGPT / Claude / Grok کپچای Cloudflare نشان می‌دهد.** Cloudflare آی‌پی‌های دیتاسنتر گوگل را به‌عنوان bot شناسایی می‌کند. راه‌حل: یک **exit node** راه‌اندازی کن (پنج دقیقه روی val.town رایگان — پل بین Apps Script و سایت Cloudflare). [`assets/exit_node/README.fa.md`](assets/exit_node/README.fa.md).
327+
**ChatGPT / Claude / Grok کپچای Cloudflare نشان می‌دهد.** Cloudflare آی‌پی‌های دیتاسنتر گوگل را به‌عنوان bot شناسایی می‌کند. راه‌حل: یک **exit node** راه‌اندازی کن — یک handler کوچک TypeScript که روی یک host serverless (Deno Deploy، fly.io، VPS شخصی) deploy می‌کنی و پل می‌سازه از Apps Script به سایت Cloudflare. [`assets/exit_node/README.fa.md`](assets/exit_node/README.fa.md).
328328

329329
**تلگرام پایدار نیست.** تلگرام از MTProto استفاده می‌کند که Apps Script نمی‌فهمد. روی کامپیوترت با [xray](https://github.com/XTLS/Xray-core) جفتش کن — [بخش تلگرام در راهنمای کامل](docs/guide.fa.md#تلگرام-با-xray).
330330

assets/exit_node/README.fa.md

Lines changed: 70 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
<div dir="rtl">
2+
13
# Exit node — دور زدن CF anti-bot برای ChatGPT / Claude / Grok / X
24

35
بسیاری از سرویس‌های پشت Cloudflare، traffic از رنج IP datacenter
@@ -14,9 +16,9 @@ Script از همان رنج IP datacenter Google خروج می‌کنه، پس
1416
`502 Relay error` می‌ده چون Code.gs در حال wrap کردن صفحه‌ی HTML
1517
challenge CF است که کلاینت نمی‌تونه parse کنه.
1618

17-
**Exit node** یک endpoint کوچک TypeScript HTTP است که روی یک پلتفرم
18-
serverless (val.town، Deno Deploy، fly.io، …) deploy می‌شه + بین Apps
19-
Script و destination قرار می‌گیره. مسیر traffic این می‌شه:
19+
**Exit node** یک handler کوچک HTTP به زبان TypeScript است که روی یک
20+
پلتفرم serverless TypeScript که خودت تأییدش می‌کنی deploy می‌شه و بین
21+
Apps Script و destination قرار می‌گیره. مسیر traffic این می‌شه:
2022

2123
```
2224
Browser ─┐ ┌─→ Destination
@@ -30,14 +32,14 @@ Browser ─┐ ┌─→ Destinat
3032
│ │
3133
│ UrlFetchApp.fetch(EXIT_NODE_URL) │
3234
▼ │
33-
val.town (non-Google IP)
35+
exit node خودت (IP غیر گوگل)
3436
│ │
3537
│ fetch(real_url) │
3638
└──────────────────────────────────────────────────┘
3739
```
3840

39-
Destination IP val.town رو می‌بینه، نه Google datacenter. heuristic
40-
anti-bot CF نمی‌سوزه + صفحه واقعی برمی‌گرده.
41+
Destination IP خروجی exit node رو می‌بینه، نه IP datacenter گوگل.
42+
Heuristic anti-bot CF نمی‌سوزه + صفحه واقعی برمی‌گرده.
4143

4244
**نکته مهم:** leg user-side (Iran ISP → Apps Script) **بدون تغییر**
4345
است. ISP فقط TLS به Google IP می‌بینه — second hop کاملاً درون
@@ -46,46 +48,65 @@ evasion property که mhrv-rs براش ساخته شده، دست نمی‌خو
4648

4749
## راه‌اندازی
4850

49-
1. **در [val.town](https://val.town) ثبت‌نام کنید** (free tier کافی
50-
است — bandwidth outbound free tier برای personal use کافی).
51-
2. **یک HTTP val جدید بسازید** (TypeScript). در val.town: New → HTTP.
52-
3. **محتوای `valtown.ts`** از این directory رو paste کنید.
53-
4. **PSK رو در بالای فایل تنظیم کنید**:
51+
handler در [`exit_node.ts`](exit_node.ts) plain TypeScript است که از
52+
APIهای web-standard (`Request`، `Response`، `fetch`) استفاده می‌کنه و
53+
روی هر پلتفرمی که serverless-fetch runtime داره اجرا می‌شه.
54+
55+
### مراحل عمومی (روی هر host)
56+
57+
۱. فایل [`exit_node.ts`](exit_node.ts) رو باز کنید و PSK پیش‌فرض رو در
58+
ابتدا عوض کنید:
5459
```ts
5560
const PSK = "<your-strong-secret>";
5661
```
5762
Strong secret تولید کنید با `openssl rand -hex 32` از terminal.
58-
**placeholder رو در production نگذارید** — کد val.town عمداً
59-
fail-closed است (در هر request 503 برمی‌گردونه) تا placeholder
60-
replace نشده، تا جلوی serve شدن به‌عنوان open relay accidentally
61-
گرفته بشه.
62-
5. **Save** کنید val رو. URL public val رو copy کنید — به این شکل:
63-
`https://your-handle-mhrv.web.val.run`.
64-
6. **در `config.json` mhrv-rs**، block `exit_node` اضافه کنید:
63+
**placeholder رو در production نگذارید** — کد عمداً fail-closed است
64+
(در هر request 503 برمی‌گردونه) تا placeholder replace نشده، تا
65+
جلوی serve شدن به‌عنوان open relay accidentally گرفته بشه.
66+
۲. فایل رو روی host انتخابی **deploy** کنید (گزینه‌ها در ادامه).
67+
۳. URL public deployment رو **copy** کنید.
68+
۴. در `config.json` mhrv-rs، block `exit_node` اضافه کنید:
6569
```json
6670
"exit_node": {
6771
"enabled": true,
68-
"relay_url": "https://your-handle-mhrv.web.val.run",
69-
"psk": "<همان PSK که در گام 4 گذاشتید>",
72+
"relay_url": "https://your-deployed-exit-node.example.com",
73+
"psk": "<همان PSK که در گام ۱ گذاشتید>",
7074
"mode": "selective",
7175
"hosts": ["chatgpt.com", "claude.ai", "x.com", "grok.com", "openai.com"]
7276
}
7377
```
74-
7. **mhrv-rs رو restart کنید** (Disconnect + Connect، یا `kill` +
78+
۵. mhrv-rs رو **restart** کنید (Disconnect + Connect، یا `kill` +
7579
restart binary).
76-
8. **تست کنید**`chatgpt.com` یا `grok.com` رو از browser pointed به
77-
mhrv-rs proxy باز کنید. صفحه login واقعی رو می‌بینید، نه CF challenge.
80+
۶. **تست** کنید — `chatgpt.com` یا `grok.com` رو از browser pointed به
81+
mhrv-rs proxy باز کنید. صفحه login واقعی رو می‌بینید، نه CF
82+
challenge.
7883

7984
config مثال کامل در
8085
[`config.exit-node.example.json`](../../config.exit-node.example.json)
8186
در root repo.
8287

88+
### گزینه‌های hosting
89+
90+
اسکریپت یک فایل self-contained است. هر host که می‌توانید signup کنید +
91+
به‌اش اعتماد دارید رو انتخاب کنید:
92+
93+
| Host | توضیحات |
94+
|---|---|
95+
| **Deno Deploy** ([deno.com/deploy](https://deno.com/deploy)) | free tier برای personal use کافی است. با `deployctl deploy --prod exit_node.ts` یا GitHub Actions deploy کنید. همان web-standard API. |
96+
| **fly.io** | free tier با محدودیت. handler رو در یک server thin بسته‌بندی کنید (`Deno.serve(handler)` برای Deno یا یک Express wrapper برای Node) + Dockerfile اضافه کنید. IP دائم، region جغرافیایی قابل انتخاب. |
97+
| **VPS شخصی خودت** | `deno run --allow-net wrapper.ts` که `wrapper.ts` کارش `Deno.serve({ port: 8443 }, handler)` است. حداکثر کنترل، ~۳-۵ دلار در ماه. |
98+
| **Cloudflare Workers** | **کمک نمی‌کنه.** CF Workers از IP space خود CF خروج می‌کنن، که CF anti-bot هنوز به‌عنوان worker-internal flag می‌کنه. |
99+
100+
برای اکثر کاربرانی که مسیر local رو اجرا می‌کنن، Deno Deploy
101+
سریع‌ترین setup است. برای deployment طولانی‌مدت تحت کنترل کامل
102+
خودت، VPS کوچک شخصی ایده‌آل است.
103+
83104
## انتخاب `selective` vs `full`
84105

85106
| Mode | چی می‌کنه | کی استفاده کنید |
86107
|---|---|---|
87108
| `selective` (default) | فقط hosts در `hosts` از طریق exit node می‌رن؛ بقیه از مسیر Apps Script عادی | توصیه می‌شه. exit-node hop ~۲۰۰-۵۰۰ms به هر request اضافه می‌کنه — برای سایت‌هایی reserve کنید که نیاز به non-Google IP دارن. |
88-
| `full` | همه‌ی request‌ها از طریق exit node می‌رن | فقط زمانی که کل workload شما CF-anti-bot affected است، یا exit node خود از Apps Script سریع‌تر روی مسیر شبکه شما (rare). budget runtime val.town رو برای سایت‌هایی که نیاز ندارن می‌سوزونه. |
109+
| `full` | همه‌ی request‌ها از طریق exit node می‌رن | فقط زمانی که کل workload شما CF-anti-bot affected است، یا exit node خود سریع‌تر روی مسیر شبکه شما (rare). budget runtime host رو برای سایت‌هایی که نیاز ندارن می‌سوزونه. |
89110

90111
## رفتار در صورت failure
91112

@@ -98,39 +119,25 @@ exit node down شما رو fully offline نمی‌کنه.
98119

99120
## Security model
100121

101-
PSK تنها چیز است که مانع می‌شه val.town endpoint یک public open proxy
122+
PSK تنها چیز است که مانع می‌شه endpoint deployed یک public open proxy
102123
بشه. مثل password برخورد کنید:
103124

104-
- **commit نکنید** PSK رو به source control. منبع val.town به‌طور
105-
default برای account شما private است؛ همان‌طور نگه دارید.
125+
- **commit نکنید** PSK رو به source control. اکثر hostها به‌طور default
126+
کد deployed رو private نگه می‌دارن؛ همان‌طور نگه دارید.
106127
- **publicly share نکنید** PSK رو. هر کسی که هم URL هم PSK رو داره
107-
می‌تونه quota val.town شما رو به‌عنوان proxy خود استفاده کنه.
108-
- **rotate** اگر leak مشکوک هست. PSK رو در val.town source تغییر بدید،
109-
save کنید، سپس `psk` در `config.json` mhrv-rs رو update + restart.
128+
می‌تونه quota host شما رو به‌عنوان proxy خود استفاده کنه.
129+
- **rotate** اگر leak مشکوک هست. PSK رو در source deployed تغییر بدید،
130+
redeploy کنید، سپس `psk` در `config.json` mhrv-rs رو update + restart.
110131

111-
اسکریپت val.town شامل **loop guard** هم هست (refuse می‌کنه fetch host
112-
خود) + **placeholder check** (در صورت `PSK === "CHANGE_ME_TO_A_STRONG_SECRET"`
132+
اسکریپت همچنین شامل **loop guard** هست (refuse می‌کنه fetch host خود)
133+
+ **placeholder check** (در صورت `PSK === "CHANGE_ME_TO_A_STRONG_SECRET"`
113134
return 503 می‌کنه) تا یک fresh deploy بدون setup نتونه به‌طور
114135
accidentally به‌عنوان open relay سرو بشه.
115136

116-
## پلتفرم‌های جایگزین
117-
118-
اسکریپت `valtown.ts` plain TypeScript است که از web-standard APIs
119-
(`Request`، `Response`، `fetch`) استفاده می‌کنه. اجرا می‌شه روی:
120-
121-
- **val.town** — ساده‌ترین، free tier کافی برای personal use
122-
- **Deno Deploy** — API مشابه؛ deploy با `deployctl`
123-
- **fly.io** — نیاز به `Dockerfile` wrapper؛ region geographic ثابت
124-
- **Cloudflare Workers** — کمک نمی‌کنه (CF Workers از IP space خود CF
125-
خروج می‌کنن، که CF anti-bot هنوز به‌عنوان worker-internal flag می‌کنه)
126-
127-
برای اکثر کاربران، val.town انتخاب درست است. Deno Deploy اگر option
128-
non-val.town برای redundancy می‌خواید.
129-
130137
## چرا default-on نیست
131138

132139
- ۲۰۰-۵۰۰ms به هر request اضافه می‌کنه (hop اضافی)
133-
- budget bandwidth free-tier val.town رو می‌سوزونه
140+
- budget bandwidth free-tier host رو می‌سوزونه
134141
- برای سایت‌هایی که CF anti-bot ندارن benefit نداره
135142
- Setup یک account جداگانه روی پلتفرم third-party می‌خواد
136143

@@ -140,35 +147,38 @@ Grok اهمیت می‌دن opt in؛ همه‌ی دیگران lighter اجرا
140147
## Troubleshooting
141148

142149
**`exit node refused or errored: unauthorized`** — PSK mismatch.
143-
بررسی کنید `psk` در `config.json` دقیقاً با `PSK` constant در val.town
144-
match هست. whitespace + quoting مهم است.
150+
بررسی کنید `psk` در `config.json` دقیقاً با `PSK` constant در source
151+
deployed match هست. whitespace + quoting مهم است.
145152

146153
**`exit node refused or errored: exit_node misconfigured: PSK is still
147154
the placeholder`** — فراموش کردید `CHANGE_ME_TO_A_STRONG_SECRET` رو
148-
در val.town جایگزین کنید. val رو edit + save کنید.
155+
در source جایگزین کنید. فایل deployed رو edit + save + redeploy کنید.
149156

150-
**`exit node failed for ...: connection refused`** — URL val.town
151-
اشتباه است یا val deploy نشده. با hit کردن URL مستقیم از browser
152-
verify کنید — باید `{"e":"method_not_allowed"}` برگردونه (val expects
157+
**`exit node failed for ...: connection refused`** — URL اشتباه است
158+
یا deployment live نیست. با hit کردن URL مستقیم از browser verify
159+
کنید — باید `{"e":"method_not_allowed"}` برگردونه (handler expects
153160
POST).
154161

155-
**`exit node failed for ...: timeout`** — outbound val.town slow است
156-
یا destination slow. region val.town متفاوت رو امتحان کنید، یا latency
162+
**`exit node failed for ...: timeout`** — outbound host slow است
163+
یا destination slow. region متفاوت رو امتحان کنید، یا latency
157164
trade-off رو accept کنید.
158165

159166
**سایت همچنان CF challenge نشون می‌ده بعد از enable exit node** — CF
160-
IP val.town رو هم flag می‌کنه. برخی customers CF صراحتاً val.town رو
161-
blocklist کردن. workarounds: Deno Deploy رو امتحان کنید، یا سایت رو
162-
به `passthrough_hosts` اضافه کنید (MITM رو bypass می‌کنه؛ از real
163-
IP ISP شما استفاده می‌کنه).
167+
IP host شما رو هم flag کرده. بعضی hosting provider‌ها outbound IP
168+
space‌شون روی CF bot blocklist است. workarounds: host دیگه امتحان
169+
کنید (VPS شخصی شما clean IP می‌ده)، یا سایت رو به `passthrough_hosts`
170+
اضافه کنید (MITM رو bypass می‌کنه؛ از real IP ISP شما استفاده
171+
می‌کنه).
164172

165173
## همچنین ببینید
166174

167175
- [English version](README.md) of this doc
168-
- [`valtown.ts`](valtown.ts) — منبع val.town (با hardening)
176+
- [`exit_node.ts`](exit_node.ts) — منبع handler (با hardening)
169177
- [`config.exit-node.example.json`](../../config.exit-node.example.json)
170178
— config مثال کامل
171179
- Issue [#382](https://github.com/therealaleph/MasterHttpRelayVPN-RUST/issues/382)
172180
— thread tracking canonical Cloudflare anti-bot
173181
- Issue [#309](https://github.com/therealaleph/MasterHttpRelayVPN-RUST/issues/309)
174182
— roadmap CF WARP integration (approach جایگزین، longer-horizon)
183+
184+
</div>

0 commit comments

Comments
 (0)