mhr-cfw-domain-fronting-relay
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseMHR-CFW Domain-Fronting Relay
MHR-CFW 域名前置中继
Skill by ara.so — Daily 2026 Skills collection.
MHR-CFW (MasterHttpRelay + Cloudflare Worker) is a Python-based domain-fronting relay that routes HTTP/SOCKS5 proxy traffic through Google Apps Script (GAS) and Cloudflare Workers. Network DPI filters see only traffic to , while the actual destination is hidden inside the relay chain.
www.google.com由ara.so提供的技能 — 2026每日技能合集。
MHR-CFW(MasterHttpRelay + Cloudflare Worker)是一款基于Python的域名前置中继工具,可通过Google Apps Script(GAS)和Cloudflare Workers路由HTTP/SOCKS5代理流量。网络DPI过滤器只会检测到发往的流量,而实际目标地址则隐藏在中继链路中。
www.google.comTraffic Flow
流量流向
Client → Local Proxy (127.0.0.1:8085)
↓
Google IP (216.239.38.120) — DPI sees www.google.com
↓
Google Apps Script Web App (Relay)
↓
Cloudflare Worker
↓
Target Website客户端 → 本地代理(127.0.0.1:8085)
↓
Google IP(216.239.38.120)—— DPI仅识别www.google.com
↓
Google Apps Script Web应用(中继)
↓
Cloudflare Worker
↓
目标网站Installation
安装步骤
bash
git clone https://github.com/denuitt1/mhr-cfw.git
cd mhr-cfw
pip install -r requirements.txtIf PyPI is blocked:
bash
pip install -r requirements.txt \
-i https://mirror-pypi.runflare.com/simple/ \
--trusted-host mirror-pypi.runflare.combash
git clone https://github.com/denuitt1/mhr-cfw.git
cd mhr-cfw
pip install -r requirements.txt若PyPI被屏蔽:
bash
pip install -r requirements.txt \
-i https://mirror-pypi.runflare.com/simple/ \
--trusted-host mirror-pypi.runflare.comFull Setup Guide
完整搭建指南
Step 1: Deploy the Cloudflare Worker
步骤1:部署Cloudflare Worker
- Log in to Cloudflare Dashboard
- Navigate to Compute > Workers & Pages
- Click Create Application → Start with Hello World → Deploy
- Click Edit code, delete all default code
- Paste the contents of from the repo
script/worker.js - Edit the worker URL constant:
javascript
const WORKER_URL = "your-worker-name.workers.dev"; - Click Deploy — note your worker URL (e.g., )
your-worker-name.workers.dev
- 登录Cloudflare控制台
- 进入Compute > Workers & Pages
- 点击Create Application → Start with Hello World → Deploy
- 点击Edit code,删除所有默认代码
- 粘贴仓库中的内容
script/worker.js - 修改worker URL常量:
javascript
const WORKER_URL = "your-worker-name.workers.dev"; - 点击Deploy — 记录你的worker URL(例如:)
your-worker-name.workers.dev
Step 2: Deploy the Google Apps Script Relay
步骤2:部署Google Apps Script中继
- Go to script.google.com and create a New project
- Delete all default code
- Paste the contents of from the repo
script/Code.gs - Edit these two constants at the top:
javascript
const AUTH_KEY = "your-secret-password-here"; // choose a strong password const WORKER_URL = "https://your-worker-name.workers.dev"; - Click Deploy → New deployment
- Type: Web app
- Execute as: Me
- Who has access: Anyone
- Click Deploy and copy the Deployment ID (long random string like )
AKfycb...
- 访问script.google.com并创建一个新项目
- 删除所有默认代码
- 粘贴仓库中的内容
script/Code.gs - 修改顶部的两个常量:
javascript
const AUTH_KEY = "your-secret-password-here"; // 设置一个强密码 const WORKER_URL = "https://your-worker-name.workers.dev"; - 点击Deploy → New deployment
- 类型:Web app
- 执行身份:我
- 访问权限:任何人
- 点击Deploy并复制部署ID(类似的长随机字符串)
AKfycb...
Step 3: Configure config.json
config.json步骤3:配置config.json
config.jsonbash
cp config.example.json config.jsonEdit :
config.jsonjson
{
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": "AKfycbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"auth_key": "your-secret-password-here",
"listen_host": "127.0.0.1",
"listen_port": 8085,
"socks5_enabled": true,
"socks5_port": 1080,
"log_level": "INFO",
"verify_ssl": true
}| Field | Description |
|---|---|
| Always |
| IP of Google's infrastructure for fronting |
| Domain shown to DPI ( |
| Your GAS Deployment ID from Step 2 |
| Must match |
| Local bind address (keep |
| HTTP proxy port (default |
| Enable SOCKS5 proxy on |
| SOCKS5 proxy port (default |
| |
| Verify SSL certs; set |
bash
cp config.example.json config.json编辑:
config.jsonjson
{
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": "AKfycbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"auth_key": "your-secret-password-here",
"listen_host": "127.0.0.1",
"listen_port": 8085,
"socks5_enabled": true,
"socks5_port": 1080,
"log_level": "INFO",
"verify_ssl": true
}| 字段 | 描述 |
|---|---|
| 使用GAS中继时固定为 |
| 用于域名前置的Google基础设施IP |
| 展示给DPI的域名( |
| 步骤2中获取的GAS部署ID |
| 必须与 |
| 本地绑定地址(保持 |
| HTTP代理端口(默认 |
| 是否在 |
| SOCKS5代理端口(默认 |
| 日志级别: |
| 是否验证SSL证书;设置 |
Step 4: Run the Proxy
步骤4:运行代理
Linux/macOS:
bash
bash start.shLinux/macOS:
bash
bash start.shor
或
python3 main.py
**Windows:**start.bat
Expected output:[INFO] HTTP proxy running on 127.0.0.1:8085
[INFO] SOCKS5 proxy running on 127.0.0.1:1080
---python3 main.py
**Windows:**start.bat
预期输出:[INFO] HTTP proxy running on 127.0.0.1:8085
[INFO] SOCKS5 proxy running on 127.0.0.1:1080
---Using the Proxy
代理使用方法
Browser via FoxyProxy
浏览器通过FoxyProxy配置
Install FoxyProxy:
- Chrome: Chrome Web Store
- Firefox: Firefox Add-ons
Configure FoxyProxy:
- Proxy Type: or
HTTPSOCKS5 - Host:
127.0.0.1 - Port: (HTTP) or
8085(SOCKS5)1080
安装FoxyProxy:
- Chrome: Chrome应用商店
- Firefox: Firefox附加组件商店
配置FoxyProxy:
- 代理类型:或
HTTPSOCKS5 - 主机:
127.0.0.1 - 端口:(HTTP)或
8085(SOCKS5)1080
curl (HTTP proxy)
curl(HTTP代理)
bash
curl -x http://127.0.0.1:8085 https://ipleak.net/json/bash
curl -x http://127.0.0.1:8085 https://ipleak.net/json/curl (SOCKS5 proxy)
curl(SOCKS5代理)
bash
curl --socks5 127.0.0.1:1080 https://ipleak.net/json/bash
curl --socks5 127.0.0.1:1080 https://ipleak.net/json/Python requests
Python requests库
python
import requests
proxies = {
"http": "http://127.0.0.1:8085",
"https": "http://127.0.0.1:8085",
}
response = requests.get("https://ipleak.net/json/", proxies=proxies)
print(response.json())python
import requests
proxies = {
"http": "http://127.0.0.1:8085",
"https": "http://127.0.0.1:8085",
}
response = requests.get("https://ipleak.net/json/", proxies=proxies)
print(response.json())Python with SOCKS5
Python搭配SOCKS5
python
import requests
proxies = {
"http": "socks5://127.0.0.1:1080",
"https": "socks5://127.0.0.1:1080",
}
response = requests.get("https://ipleak.net/json/", proxies=proxies)
print(response.json())python
import requests
proxies = {
"http": "socks5://127.0.0.1:1080",
"https": "socks5://127.0.0.1:1080",
}
response = requests.get("https://ipleak.net/json/", proxies=proxies)
print(response.json())Configuration Patterns
配置示例
Minimal config (HTTP only, no SOCKS5)
极简配置(仅HTTP,无SOCKS5)
json
{
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": "YOUR_DEPLOYMENT_ID",
"auth_key": "YOUR_AUTH_KEY",
"listen_host": "127.0.0.1",
"listen_port": 8085,
"socks5_enabled": false,
"log_level": "INFO",
"verify_ssl": true
}json
{
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": "YOUR_DEPLOYMENT_ID",
"auth_key": "YOUR_AUTH_KEY",
"listen_host": "127.0.0.1",
"listen_port": 8085,
"socks5_enabled": false,
"log_level": "INFO",
"verify_ssl": true
}Debug config (verbose logging, skip SSL verification)
调试配置(详细日志,跳过SSL验证)
json
{
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": "YOUR_DEPLOYMENT_ID",
"auth_key": "YOUR_AUTH_KEY",
"listen_host": "127.0.0.1",
"listen_port": 8085,
"socks5_enabled": true,
"socks5_port": 1080,
"log_level": "DEBUG",
"verify_ssl": false
}json
{
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": "YOUR_DEPLOYMENT_ID",
"auth_key": "YOUR_AUTH_KEY",
"listen_host": "127.0.0.1",
"listen_port": 8085,
"socks5_enabled": true,
"socks5_port": 1080,
"log_level": "DEBUG",
"verify_ssl": false
}Listen on all interfaces (for LAN sharing)
监听所有接口(用于局域网共享)
json
{
"listen_host": "0.0.0.0",
"listen_port": 8085
}⚠️ Only useon trusted networks. Anyone on the LAN can use your proxy.0.0.0.0
json
{
"listen_host": "0.0.0.0",
"listen_port": 8085
}⚠️ 仅在可信网络中使用。局域网内任何人都可使用你的代理。0.0.0.0
Cloudflare Worker (script/worker.js
) — Key Structure
script/worker.jsCloudflare Worker(script/worker.js
)核心结构
script/worker.jsjavascript
// The worker receives proxied requests and forwards them to the target
const WORKER_URL = "your-worker-name.workers.dev"; // set this to your own worker
addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request));
});The worker:
- Receives requests from GAS relay
- Extracts the target URL from the request
- Fetches the target on behalf of the client
- Returns the response back through the chain
javascript
// Worker接收代理请求并转发至目标地址
const WORKER_URL = "your-worker-name.workers.dev"; // 设置为你自己的worker地址
addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request));
});Worker功能:
- 接收来自GAS中继的请求
- 从请求中提取目标URL
- 代表客户端获取目标内容
- 将响应通过链路返回
Google Apps Script (script/Code.gs
) — Key Structure
script/Code.gsGoogle Apps Script(script/Code.gs
)核心结构
script/Code.gsjavascript
const AUTH_KEY = "your-secret-password-here"; // must match config.json auth_key
const WORKER_URL = "https://your-worker.workers.dev";
function doPost(e) {
// Validates AUTH_KEY, extracts target URL, forwards via WORKER_URL
}The GAS relay:
- Exposes a public HTTPS endpoint () that acts as the domain-fronted relay
/exec - Validates on every request
AUTH_KEY - Forwards validated requests to your Cloudflare Worker
javascript
const AUTH_KEY = "your-secret-password-here"; // 必须与config.json中的auth_key一致
const WORKER_URL = "https://your-worker.workers.dev";
function doPost(e) {
// 验证AUTH_KEY,提取目标URL,通过WORKER_URL转发
}GAS中继功能:
- 暴露一个公开HTTPS端点()作为域名前置中继
/exec - 对每个请求验证
AUTH_KEY - 将验证通过的请求转发至你的Cloudflare Worker
Verifying It Works
验证代理有效性
After starting the proxy and configuring your browser:
- Visit ipleak.net — your IP should show as a Cloudflare IP
- Visit whoer.net — should reflect Cloudflare's location
- Via curl:
Look forbash
curl -x http://127.0.0.1:8085 https://ipleak.net/json/ | python3 -m json.toolshowing a Cloudflare address range."ip"
启动代理并配置浏览器后:
- 访问ipleak.net — 你的IP应显示为Cloudflare IP
- 访问whoer.net — 应显示Cloudflare的地理位置
- 通过curl验证:
查看bash
curl -x http://127.0.0.1:8085 https://ipleak.net/json/ | python3 -m json.tool字段是否为Cloudflare地址段。"ip"
Troubleshooting
故障排查
Proxy starts but no traffic gets through
代理启动但无流量通过
- Verify in
script_idis the Deployment ID, not the Script IDconfig.json - Re-check that in
auth_keyexactly matchesconfig.jsoninAUTH_KEYCode.gs - In GAS, confirm deployment is set to Execute as: Me and Who has access: Anyone
- Try redeploying the GAS app — old deployments sometimes break
- 确认中的
config.json是部署ID,而非脚本IDscript_id - 再次检查中的
config.json与auth_key中的Code.gs完全一致AUTH_KEY - 在GAS中确认部署设置为执行身份:我和访问权限:任何人
- 尝试重新部署GAS应用 — 旧部署有时会失效
SSL errors
SSL错误
json
"verify_ssl": falseSet to temporarily to diagnose. Re-enable for production use.
falsejson
"verify_ssl": false临时设置为以排查问题。生产环境请重新启用。
falsepip install
fails (PyPI blocked)
pip installpip install
失败(PyPI被屏蔽)
pip installbash
pip install -r requirements.txt \
-i https://mirror-pypi.runflare.com/simple/ \
--trusted-host mirror-pypi.runflare.combash
pip install -r requirements.txt \
-i https://mirror-pypi.runflare.com/simple/ \
--trusted-host mirror-pypi.runflare.comGAS quota exceeded
GAS配额耗尽
Google Apps Script has daily quotas (~20,000 URL fetch calls/day for free accounts). If the relay stops working mid-day:
- Use a different Google account for a fresh GAS deployment
- Deploy multiple GAS relays and alternate values
script_id
Google Apps Script有每日配额(免费账户约20,000次URL调用/天)。若中继中途停止工作:
- 使用其他Google账户重新部署GAS
- 部署多个GAS中继并轮换
script_id
Port already in use
端口已被占用
json
{
"listen_port": 8086,
"socks5_port": 1081
}Change ports in and update your browser/FoxyProxy settings.
config.jsonjson
{
"listen_port": 8086,
"socks5_port": 1081
}在中修改端口,并更新浏览器/FoxyProxy设置。
config.jsonCloudflare Worker errors (5xx)
Cloudflare Worker错误(5xx)
- Check the worker is deployed and the in
WORKER_URLmatches exactlyCode.gs - Visit directly in browser — should respond (even with an error page) rather than timeout
https://your-worker.workers.dev - Check Cloudflare Worker logs in the dashboard under Workers & Pages > your worker > Logs
- 检查Worker是否已部署,且中的
Code.gs完全匹配WORKER_URL - 在浏览器中直接访问— 应能响应(即使是错误页面)而非超时
https://your-worker.workers.dev - 在控制台的Workers & Pages > 你的worker > Logs中查看Cloudflare Worker日志
Debug logging
调试日志
json
"log_level": "DEBUG"Restart — you'll see each relay hop logged to stdout.
main.pyjson
"log_level": "DEBUG"重启 — 你将在标准输出中看到每个中继步骤的日志。
main.pyEnvironment Variable Pattern for Automation
自动化环境变量配置模式
When scripting deployment or CI, avoid hardcoding secrets. Use environment variables and generate config dynamically:
python
import json
import os
config = {
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": os.environ["GAS_DEPLOYMENT_ID"],
"auth_key": os.environ["MHR_AUTH_KEY"],
"listen_host": "127.0.0.1",
"listen_port": int(os.environ.get("MHR_PORT", "8085")),
"socks5_enabled": True,
"socks5_port": 1080,
"log_level": os.environ.get("MHR_LOG_LEVEL", "INFO"),
"verify_ssl": True
}
with open("config.json", "w") as f:
json.dump(config, f, indent=2)
print("config.json written")Then run:
bash
export GAS_DEPLOYMENT_ID="AKfycbXXXXXXXXXXXXXX"
export MHR_AUTH_KEY="$(openssl rand -hex 32)"
python3 write_config.py
python3 main.py编写部署脚本或CI流程时,避免硬编码密钥。使用环境变量动态生成配置:
python
import json
import os
config = {
"mode": "apps_script",
"google_ip": "216.239.38.120",
"front_domain": "www.google.com",
"script_id": os.environ["GAS_DEPLOYMENT_ID"],
"auth_key": os.environ["MHR_AUTH_KEY"],
"listen_host": "127.0.0.1",
"listen_port": int(os.environ.get("MHR_PORT", "8085")),
"socks5_enabled": True,
"socks5_port": 1080,
"log_level": os.environ.get("MHR_LOG_LEVEL", "INFO"),
"verify_ssl": True
}
with open("config.json", "w") as f:
json.dump(config, f, indent=2)
print("config.json written")然后运行:
bash
export GAS_DEPLOYMENT_ID="AKfycbXXXXXXXXXXXXXX"
export MHR_AUTH_KEY="$(openssl rand -hex 32)"
python3 write_config.py
python3 main.pyProject File Reference
项目文件说明
| File | Purpose |
|---|---|
| Entry point — starts HTTP and SOCKS5 proxy listeners |
| Runtime configuration (copy from |
| Template configuration with placeholder values |
| Cloudflare Worker source — deploy to Cloudflare |
| Google Apps Script relay source — deploy to GAS |
| Windows launcher |
| Linux/macOS launcher |
| Python dependencies |
| 文件 | 用途 |
|---|---|
| 入口文件 — 启动HTTP和SOCKS5代理监听 |
| 运行时配置(从 |
| 配置模板,包含占位符值 |
| Cloudflare Worker源码 — 部署至Cloudflare |
| Google Apps Script中继源码 — 部署至GAS |
| Windows启动脚本 |
| Linux/macOS启动脚本 |
| Python依赖列表 |