19 Commits

Author SHA1 Message Date
eli 9ca581c1e9 fix: ECH 默认 DNS 8.8.8.8 -> 9.9.9.9(Quad9,实测不被屏蔽;8.8.8.8 偶发断)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 15:25:23 +08:00
eli 9385f02421 fix: ECH 默认查询改用 udp://8.8.8.8(明文 UDP53,墙内实测最稳)
8.8.8.8:443 DoH 墙内不稳(疑似被 passwall 本机代理劫进代理通道);
源码只有 udp:///https:///h2c:// 三个分支,tcp:// 不存在。
full 策略下 UDP 投毒只会断连不会静默降级,风险可接受。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 13:13:23 +08:00
eli e362c3d3fd fix: ECH default DoH -> 8.8.8.8 IP 字面量(实测连通;免 dns.google 域名二次解析)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 12:30:54 +08:00
eli e8787278b7 fix: ECH default DoH endpoint cloudflare-dns.com -> dns.google
Xray ECH DoH 是 RFC8484 wireformat(POST application/dns-message 走 h2),
/resolve 是 JSON 调试接口不认。cloudflare-dns.com/1.1.1.1 墙内实测被封,
dns.google:443 可达。备选 alidns / IP 字面量形式见 README 与 ECH_CONFIG。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 12:24:43 +08:00
eli 36e9b06976 feat: CDN links carry ech= — dynamic DoH query form by default
静态 ECH 快照随 CF 密钥轮换很快失效(实测),改为默认内嵌
"CDN域名+https://cloudflare-dns.com/dns-query":客户端 Xray ≥25.7.26
拨号时用内置 DoH 自查并按 TTL 刷新,轮换无感。ECH_CONFIG=off 关闭,
=其他值(静态 base64 / 其他 DoH 端点)原样嵌入。仅 CDN 链接携带
(直连 TLS 在 Caddy 终止,无 ECH)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 12:12:30 +08:00
eli f4d11671c1 feat: XHTTP extra padding on by default (XHTTP_PADDING=0 to disable)
升级注意:旧 setup.env 存的 XHTTP_PADDING 为空,upgrade 后会自动开启并
重新生成 header/key——XHTTP 链接变更,忽略 extra= 的旧客户端会 400。
想保持关闭需在 setup.env 里显式写 XHTTP_PADDING=0。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 12:12:16 +08:00
eli 4e4d0f489b feat: optional XHTTP extra padding via XHTTP_PADDING=1 (link carries extra=)
Share-link standard §4.3.19 supports extra= (URL-encoded XHttpObject JSON),
and passwall exposes it as XHTTP Extra. Verified end-to-end with real xray
v26.3.27 + caddy: matching client+server extra → 204 through the full TLS
h2 chain. Default off because a client that ignores the extra param gets
400 from a padding-enabled server.

Also correct the previous claim that links can't carry extra.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 00:09:31 +08:00
eli 15d91b2b7a fix: drop XHTTP extra/xPadding block — breaks every link-imported client (400)
End-to-end matrix with real xray v26.3.27 + caddy:
- server with extra padding + plain client: 400 (direct AND via caddy)
- server without extra + plain client: 204 (direct AND via caddy, TLS h2)

Padding placement/key names must match on both ends, but share links cannot
carry these params and mainstream clients can't configure them — so a
server-side-only extra block rejects every real client. Removed from the
template along with XPADDING_HEADER/XPADDING_KEY.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 23:55:38 +08:00
eli 2d10c12e9f fix: default hy2 masquerade to engineersblog.net (match xray camouflage)
www.people.com answers every non-browser request with a Cloudflare JS
challenge (cf-mitigated: challenge) — the masquerade instantly fails
active probing, and the open reverse proxy gets the VPS IP flagged by
CF for scraping. engineersblog.net serves real 200 content without a
challenge; using the same target as the Xray fallback makes 443 and
8443 present the same site, which strengthens the disguise.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 19:37:53 +08:00
eli ba99627efb docs: fix HTTP/3 toggle location (Speed > Settings) and dig HTTPS syntax
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 19:04:50 +08:00
eli c78cac6d8b docs: ECH is default-on for Free zones; clarify HTTPS redirect, TLS 1.2, ACM
Verified against Cloudflare docs: ECH is enabled by default on Free zones
(no toggle shown); Always Use HTTPS does not loop with Caddy's one-way
http->https redirect; Minimum TLS 1.0->1.2 is a free hardening; HTTP/3
toggle lives under Network; ACM is unrelated paid addon.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 18:56:22 +08:00
eli 72cf63b08b docs: drop Enterprise-only Origin Rule from CDN guide — Preserve works
Host/SNI/DNS-record overrides in Origin Rules are Enterprise-only (greyed
out on free plans). The architecture never needed them: CF origins with
SNI/Host=CDN_DOMAIN, Xray REALITY falls through to Caddy, and Caddy's CDN
site block matches on that SNI directly. Guide now says leave everything
at Preserve.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 18:46:32 +08:00
eli b8fba66302 docs: Cloudflare origin setup guide for current 2026 dashboard
DNS grey/orange split for REALITY vs CDN domains, Full (strict) mode,
Origin Rule (Host/SNI/DNS override to DOMAIN), ECH/Always-Use-HTTPS/HTTP3,
WebSockets toggle, common pitfalls, and minimal firewall port list.
Also dedup ECH paragraph in optional-enhancements (points to the guide).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 18:36:13 +08:00
eli eb9a0c90ca feat: ACTION=upgrade — non-interactive upgrade of all components
Install is already idempotent-upgrade (apt install caddy / xray install script /
get.hy2.sh all fetch latest); upgrade mode additionally requires an existing
setup.env (dies instead of accidentally installing) and never prompts.
Legacy setup.env without HY2_CERT_MODE infers dns when CF_API_TOKEN present,
so upgrades keep wildcard certs instead of silently switching to http mode.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 15:27:32 +08:00
eli 31facd9c7a feat: optional VLESS post-quantum encryption (XRAY_VLESS_ENC), README index + ECH/PQ docs
- XRAY_VLESS_ENC=1 generates ML-KEM-768 keypair via xray vlessenc, applies
  to all three VLESS inbounds, share links carry client encryption param,
  keys persisted in setup.env
- README: project intro + script index at top, optional-enhancements section
  (VLESS PQ, ECH for CDN_DOMAIN, hy2 obfs/mimic pointers)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 15:20:15 +08:00
eli 70a19d126c feat: default hysteria2 cert to ACME HTTP-01 via Caddy port-80 proxy
hy2 certmagic HTTP-01 listens only on 127.0.0.1:9180 (altPort); Caddy's
port-80 block reverse-proxies /.well-known/acme-challenge/ to it. Non-wildcard
DOMAIN cert, auto-renewed and hot-applied, no DNS API token needed, no new
public ports. TLS-ALPN is unusable (CA only connects to TCP 443 = Xray) and
reusing Caddy's cert files needs permission/copy hooks, so HTTP-01 is the
minimal stable default. HY2_CERT_MODE=dns keeps Cloudflare DNS-01 wildcard
as fallback (CF_API_TOKEN required only in dns mode).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 12:57:49 +08:00
eli 50c0de2d60 docs: usage docs for caddy+xray+hysteria script, archive original templates
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 00:37:04 +08:00
eli e4bb6ee07c Diagnose team-name typos: explain HTTP 404 on enrollment JWT fetch
A 404 from <team>.cloudflareaccess.com/warp means the team domain does
not exist (misspelled team name) — print that explicitly and suggest
copying the team name from Zero Trust > Settings instead of typing it.
README FAQ updated accordingly.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-23 22:39:32 +08:00
eli 3b4beb9d41 Add README with 2026 Zero Trust enrollment paths, improve JWT error diagnostics
- README.md: step-by-step dashboard guide using current navigation
  (Access controls > Service credentials > Service Tokens;
  Team & Resources > Devices > Management > Device enrollment
  permissions), incl. the two classic pitfalls: policy Action must be
  Service Auth (not Allow), and Free plan still requires a payment
  method on file. Also documents team name vs domain, verification,
  FAQ (403/429, device seats, plain-WireGuard limitations), and the
  supply-chain notes.
- Script: when the enrollment JWT fetch fails, print HTTP status and
  the Location redirect target plus a 3-point checklist (Service Auth
  vs Allow, policy not attached to enrollment permissions, bad/expired
  credentials) — a 302 to /cdn-cgi/access/login/ is now immediately
  recognizable as a wrong policy action.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-23 22:18:44 +08:00