Cloudflare Workers를 활용한 IP 로테이션 프록시 서버
"프록시 서비스 비용을 내기 싫은데 IP rolling을 어떻게 구현할 것인가?"에 대한 의문에서 시작해서 Cloudflare Workers 무료 tier만으로 동일한 IP 로테이션 기능을 구현했습니다.
| 서비스 | 가격 | 요청 수 |
|---|---|---|
| ScraperAPI | $49/월 | 10만 |
| ZenRows | $69/월 | 25만 (기본) |
| Bright Data | $499/월 | Growth 플랜 |
| 이 프로젝트 | $0 | N × 10만/일 |
Cloudflare Workers 무료 tier로 동일한 IP 로테이션을 구현합니다.
| 플랫폼 | 무료 한도 | IP 다양성 | 제약 |
|---|---|---|---|
| Cloudflare Workers | 10만 요청/일/Worker | 에지 노드별 다른 IP | CONNECT 미지원 |
| AWS Lambda | 100만 요청/월 | NAT Gateway IP 고정 | 비용 발생 |
| Vercel/Netlify | 제한적 | IP 풀 작음 | 상업적 사용 제한 |
Cloudflare 선택 이유:
- Worker 개수 무제한 → N개 Worker = N × 10만 요청/일
- 전 세계 300+ 에지 노드 → 다양한 IP 풀
- 완전 무료 (Free tier)
flowchart LR
A[Client] -->|X-Target-Url| B[Main Server]
B -->|라운드로빈| C1[Worker 1]
B -->|라운드로빈| C2[Worker 2]
B -->|라운드로빈| CN[Worker N]
C1 -->|fetch| D[Target]
C2 -->|fetch| D
CN -->|fetch| D
- 클라이언트 → Main Server (인증, Worker 선택)
- Main Server → Worker (라운드로빈)
- Worker → 대상 서버 (
fetch()) - 각 Worker는 다른 Cloudflare 에지 IP 사용
import httpx
response = await client.get(
"http://localhost:8000/proxy",
headers={
"X-Proxy-Key": "your_secret",
"X-Target-Url": "https://httpbin.org/ip",
},
)
print(response.json()) # {"origin": "104.28.xxx.xxx"}curl -H "X-Proxy-Key: secret" \
-H "X-Target-Url: https://ifconfig.me/ip" \
http://localhost:8000/proxy| 엔드포인트 | 설명 |
|---|---|
GET/POST/... /proxy |
프록시 요청 |
GET /workers |
Worker 목록 |
GET /health |
헬스체크 |
필수 헤더: X-Proxy-Key, X-Target-Url
응답 헤더: X-Proxy-Worker (사용된 Worker ID)
- 표준 프록시 형태 미지원 (
proxies={"http": "..."}) - Cloudflare가 CONNECT 메서드 차단 - WebSocket 미지원
cloudflare_proxy/
├── server/ # Main Server (FastAPI)
│ ├── main.py # 프록시 엔드포인트
│ ├── proxy.py # Worker 요청 전달
│ ├── pool_manager.py # Worker Pool 관리
│ └── cloudflare_client.py # Cloudflare API
│
├── worker/ # Cloudflare Worker
│ └── src/worker.js # HTTP fetch 릴레이
│
├── tests/ # 테스트
│ └── test_ip.py # IP 로테이션 테스트
│
└── Makefile
cp .env.example .envPROXY_SECRET=your_secret_key
CF_API_KEY=your_global_api_key
CF_EMAIL=your@email.com
CF_ACCOUNT_ID=your_account_id
CF_SUBDOMAIN=your_workers_subdomainmake dev # 서버 실행 (Worker 자동 배포)
python test_ip.py # 테스트.env에 GCP 설정 추가:
GCP_PROJECT_ID=your_gcp_project_id
GCP_REGION=us-central1 # 무료 tier: us-central1, us-east1, us-west1# 1. Artifact Registry 생성 (최초 1회)
gcloud artifacts repositories create cloudflare-proxy \
--repository-format=docker \
--location=us-central1
# 2. Docker 인증
gcloud auth configure-docker us-central1-docker.pkg.dev
# 3. 배포
make push # 이미지 빌드 & 푸시
make infra-init # Terraform 초기화 (최초 1회)
make deploy # Cloud Run 배포