
트래픽을 GAS(Google Apps Script)를 통해 라우팅하고 Cloudflare Workers로 전달하는 도메인 프론팅 릴레이입니다. DPI를 우회하도록 설계되었습니다.
클라이언트 -> 로컬 릴레이 -> Google/CDN 프론트 -> GAS (Google Apps Script) 릴레이 -> Cloudflare Worker -> 출구
|
+-> 네트워크 DPI 필터에 www.google.com으로 표시
클라이언트 -> 로컬 릴레이 -> Google/CDN 프론트 -> GAS (Google Apps Script) 릴레이 -> Cloudflare Worker -> 자체 호스팅 업스트림 포워더 -> 출구
|
+-> 네트워크 DPI 필터에 www.google.com으로 표시
일반적인 사용 시, 브라우저는 컴퓨터에서 실행 중인 프록시로 트래픽을 보냅니다.
프록시는 해당 트래픽을 Google 인프라를 통해 전송하여 네트워크가 www.google.com과 같은 허용된 도메인만 보게 합니다.
그런 다음 배포된 릴레이가 cloudflare worker를 통해 실제 웹사이트를 가져와 동일한 경로를 통해 응답을 반환합니다.
즉, 필터는 정상적인 Google 트래픽처럼 보지만 실제 목적지는 릴레이 요청 내에 숨겨져 있습니다.
git clone https://github.com/denuitt1/mhr-cfw.git
cd mhr-cfw
pip install -r requirements.txt
PyPI에 직접 접근할 수 없나요? 대신 다음 미러를 사용하세요:
pip install -r requirements.txt -i https://mirror-pypi.runflare.com/simple/ --trusted-host mirror-pypi.runflare.com
worker.js 파일(deploy/ 아래)을 열고 모든 내용을 복사하여 Apps Script 편집기에 붙여넣습니다.const WORKER_URL = "myworker.workers.dev";
Code.gs 파일(deploy/ 아래)을 열고 모든 내용을 복사하여 Apps Script 편집기에 붙여넣습니다.const AUTH_KEY = "your-secret-password-here";
const WORKER_URL = "https://myworker.workers.dev";
⚠️ 3단계에서 설정한 비밀번호를 기억하세요. 아래 구성 파일에서 동일한 비밀번호를 사용합니다.
run.bat 파일 (Windows) 또는 run.sh 파일 (Linux)을 클릭하여 릴레이를 시작합니다.
처음 실행하는 경우 AUTH_KEY와 Google Apps Script Deployment ID를 입력해야 하는 설정 마법사가 나타납니다.
HTTP 프록시가 127.0.0.1:8085에서 실행 중이라는 메시지가 표시되어야 합니다.
v2rayN 클라이언트를 사용하고 socks5 프록시를 구성하는 것을 권장합니다.
FoxyProxy의 Chrome 확장 프로그램 또는 Firefox 확장 프로그램을 사용하여 브라우저에서 이 프록시를 사용할 수도 있습니다.
브라우저에서 ipleak.net을 열면 IP 주소가 Cloudflare의 것으로 설정된 것을 확인할 수 있습니다.
가상 머신(VM)을 실행하면 호스트와 분리된 네트워크 환경에서 작동합니다. 기본적으로 VM은 호스트 머신의 localhost에서 실행 중인 서비스(이 프록시 포함)에 직접 접근할 수 없습니다.
이를 해결하려면 하이퍼바이저가 호스트에 할당한 게이트웨이 IP를 찾은 다음, VM 내에서 프록시를 구성할 때 localhost 대신 해당 IP를 사용해야 합니다.
예: VirtualBox (NAT 모드)
호스트는 VM 내에서 10.0.2.2로 항상 접근 가능합니다. 프록시를 설정하세요:
export http_proxy="http://10.0.2.2:8085"
export https_proxy="http://10.0.2.2:8085"
export all_proxy="socks5://10.0.2.2:8085"
영구적으로 적용하려면 위 줄을 ~/.bashrc에 추가하고 source ~/.bashrc를 실행하세요.
이 프록시는 SSL 검사를 수행하므로 인증서 오류가 발생할 수 있습니다. 포함된 ca.crt를 설치하여 해결하세요:
sudo cp ca.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates
추가 소프트웨어 없이 동일한 네트워크에 있는 휴대폰이나 다른 기기에서 이 프록시를 사용할 수 있습니다.
1. 호스트 IP 찾기
# Windows
ipconfig
# Linux / macOS
ip addr
라우터에 연결된 어댑터의 IP(예: 192.168.1.8)를 찾으세요.
2. 포트 포워딩 (Windows 전용, 서비스가 localhost에 바인딩된 경우)
관리자 권한으로 CMD를 실행하세요:
netsh interface portproxy add v4tov4 listenaddress=192.168.1.8 listenport=8085 connectaddress=127.0.0.1 connectport=8085
netsh advfirewall firewall add rule name="Proxy 8085" dir=in action=allow protocol=TCP localport=8085
3. 휴대폰에서 프록시 구성
휴대폰을 동일한 Wi-Fi에 연결한 후 수동으로 프록시를 설정하세요:
192.168.1.8)8085Android: 설정 → Wi-Fi → 네트워크 수정 → 프록시 → 수동
iPhone: 설정 → Wi-Fi → (네트워크) → HTTP 프록시 → 수동
4. CA 인증서 설치
ca.crt를 휴대폰으로 전송한 후:
CAPTCHA(Cloudflare Turnstile/봇 챌린지, reCAPTCHA, hCaptcha)는 챌린지를 해결한 IP에 토큰을 바인딩합니다.
Cloudflare Workers는 요청마다 다른 에지 IP를 통해 나가므로, 챌린지를 해결해도 대상 사이트에서의 인증이 실패합니다.
이 선택적 추가 기능을 사용하면 Worker가 모든 fetch() 호출을 안정적인 IP를 가진 VPS에서 실행하는 작은 Node 서버로 전달하여 대상 사이트에 일관된 출구 주소를 제공합니다.
cf_clearance)이 필요한 경우.이러한 문제가 없다면 구성하지 않은 상태로 두세요. Worker는 이전과 동일하게 동작합니다.
Cloudflare Workers는 안정적인 아웃바운드 IP를 제공하지 않습니다. fetch()는 회전하는 Cloudflare 에지 IP 풀을 통해 나가며, 이 때문에 IP에 바인딩된 CAPTCHA 토큰이 깨집니다. Cloudflare의 정적 이그레스 옵션(BYOIP, Egress Workers)은 Enterprise 등급이므로, 정적 IP를 가진 소형 VPS가 실용적인 해결책입니다. 포워더는 안정적인 주소에서 fetch()를 다시 발행하는 얇은 프록시일 뿐입니다.
참조 구현은 deploy/upstream-forwarder/upstream_forwarder.js입니다.
Node 18+가 필요하며 종속성이 없습니다. Caddy 또는 nginx와 함께 TLS로 실행하세요. Worker는 HTTPS가 아닌 포워더 URL을 거부합니다.
# VPS에서 (Ubuntu/Debian 예시):
sudo apt install -y nodejs # 반드시 18+여야 함
export AUTH_KEY="some-long-random-string-at-least-32-chars"
export PORT=8787
node deploy/upstream-forwarder/upstream_forwarder.js
Caddy로 자동 TLS를 구성하세요:
forwarder.example.com {
reverse_proxy 127.0.0.1:8787
}
빠른 동작 확인:
curl -X POST https://forwarder.example.com/fwd \
-H "x-upstream-auth: $AUTH_KEY" \
-H "content-type: application/json" \
-d '{"u":"https://httpbin.org/ip","m":"GET","h":{}}'
디코딩된 응답 본문에 VPS의 IP가 표시되어야 합니다.
Cloudflare 대시보드 → Worker → Settings → Variables and Secrets:
저장하고 Worker를 재배포합니다.
프록시를 통해 https://httpbin.org/ip를 방문하면 Cloudflare의 IP가 아닌 VPS의 IP가 표시되어야 합니다. 그런 다음 작동하지 않던 CAPTCHA 보호 사이트를 다시 방문하면 챌린지가 이제 유효하게 됩니다.
포워더는 인증을 요구해야 합니다.
AUTH_KEY없이는 시작을 거부합니다. URL과 키를 가진 사람은 누구나 릴레이로 사용할 수 있으므로 둘 다 비밀로 유지하세요.
기본적으로 Worker가 처리하는 모든 요청이 포워더를 통해 라우팅되므로 관련 없는 트래픽도 VPS 대역폭을 소모합니다. 안정적인 출구 IP가 필요한 사이트만 VPS를 통해 보내려면 config.json의 forwarder_hosts에 나열하세요. bypass_hosts와 동일한 구문(정확한 호스트명 또는 .suffix)을 사용합니다. 일치하지 않는 항목은 Worker에서 직접 fetch()로 대체됩니다.
{
...
"forwarder_hosts": [
"example.com",
".cf-protected-suffix"
]
...
}
목록을 비우거나 키를 제거하면 기존의 "모든 항목 전달" 동작이 유지됩니다.
MHR-CFW는 교육, 테스트 및 연구 목적으로만 제공됩니다.
| Name | Type | Value |
|---|
UPSTREAM_FORWARDER_URL | Secret | https://forwarder.example.com/fwd |
UPSTREAM_AUTH_KEY | Secret | VPS에 설정한 것과 동일한 AUTH_KEY |
UPSTREAM_FAIL_MODE | Variable | closed (기본값) — 포워더 실패 시 502 반환. open을 사용하여 직접 fetch로 대체. |
UPSTREAM_TIMEOUT_MS | Variable (선택사항) | 기본값 25000 |