😤 522 에러와의 전쟁#
홈서버 운영하시는 분들 공감하실 거예요. 외부에서 접속하려고 하면 되다가 안 되다가… 특히 Cloudflare 522 에러 보신 적 있으시죠?
저도 n8n, 블로그, Cusdis 댓글 시스템을 홈서버에서 운영 중인데요. 어느 날 갑자기 n8n에 접속이 안 되는 거예요. 로컬에서는 잘 되는데 외부에서만 522…
🤔 기존 구성의 문제점#
제가 쓰던 구성은 전형적인 홈서버 셋업이었어요.
인터넷 → 공유기 포트포워딩 (80, 443) → Nginx Proxy Manager → 각 서비스
문제는 이랬습니다:
- 공유기 NAT 테이블이 불안정해지면 끊김
- ISP에서 가끔 연결이 끊어짐
- SPA(Single Page Application)는 초기 로딩 시 JS/CSS 파일을 동시에 10~20개씩 요청하는데, 중간에 몇 개가 타임아웃
- 공유기 재부팅하면 IP 바뀔까봐 DDNS 걱정
서버 자체는 문제없었어요. 로컬에서 동시 요청 20개 테스트해도 전부 200 OK. 공유기 ↔ 외부 인터넷 구간이 병목이었던 거죠.
💡 Cloudflare Tunnel이란?#
그러다 발견한 게 Cloudflare Tunnel이에요. 개념이 완전 다릅니다.
기존 포트포워딩 방식
인터넷 → 공유기 포트포워딩 → NPM → 서비스
↑
공인 IP 노출 😰
포트 열어야 함
IP 바뀌면 DDNS 필요
Cloudflare Tunnel 방식
인터넷 → Cloudflare ← Tunnel ← 홈서버 (cloudflared)
↑
아웃바운드 연결만!
포트 안 열어도 됨
IP 노출 없음 😎
핵심은 아웃바운드 연결이에요. 서버가 Cloudflare에 먼저 연결을 맺고 유지하니까, 공유기에서 포트를 열 필요가 없어요!
🛠️ 설정 방법#
1단계: Zero Trust 대시보드 접속#
https://one.dash.cloudflare.com 접속
→ Networks → Tunnels → Create a tunnel
→ Cloudflared 선택 → 터널 이름 입력
→ 토큰 복사
참고로 Zero Trust는 별도 대시보드예요. 일반 Cloudflare 대시보드에서 왼쪽 메뉴 맨 아래 “Zero Trust"를 클릭하거나, 직접 URL로 접속하세요.
2단계: Docker로 cloudflared 실행#
저는 다른 서비스들도 Docker로 운영 중이라 컨테이너로 띄웠어요.
docker run -d \
--name cloudflared \
--restart unless-stopped \
--network host \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token 여기에_토큰_붙여넣기
--network host 옵션을 주면 localhost로 다른 서비스에 접근할 수 있어서 편해요.
로그 확인:
docker logs cloudflared
Registered tunnel connection 메시지가 4개 나오면 성공!
3단계: Public Hostname 설정#
이제 어떤 도메인으로 어떤 서비스에 연결할지 설정해요.
Zero Trust → Networks → Tunnels
→ 만든 터널 클릭 → Public Hostname 탭
→ Add a public hostname
설정 예시:
| 하위도메인 | 도메인 | 형식 | URL |
|---|---|---|---|
| n8n | yourdomain.com | HTTP | 192.168.x.x:5678 |
| (비움) | yourblog.com | HTTP | 192.168.x.x:9572 |
| comments | yourblog.com | HTTP | 192.168.x.x:3000 |
중요! 형식은 HTTP예요. 컨테이너 내부는 HTTP로 돌아가고, Cloudflare가 외부에 HTTPS로 제공해줍니다.
4단계: DNS 설정#
Tunnel에 hostname을 추가하면 자동으로 CNAME이 생성돼요.
근데 저처럼 기존에 A레코드가 있었다면 충돌이 생겨요. 기존 A레코드 삭제하고, 자동 생성 안 되면 수동으로 CNAME 추가하세요:
Type: CNAME
Name: @ (또는 서브도메인)
Target: 터널ID.cfargotunnel.com
Proxy: ON
🔧 트러블슈팅: CORS 문제#
블로그에 Cusdis 댓글 시스템을 쓰는데, Tunnel 전환 후 댓글창이 안 나오더라고요.
교차 출처 요청 차단: 'Access-Control-Allow-Origin' CORS 헤더가 없음
Cusdis의 CORS_ORIGIN 환경변수는 API 요청에만 적용되고, 정적 파일(JS/CSS)에는 안 먹혀요.
해결: Cloudflare 변환 규칙 추가
dash.cloudflare.com → 도메인 선택
→ 규칙 → 변환 규칙 → 응답 헤더 수정 → 규칙 생성
필드: 호스트 이름
연산자: 같음
값: comments.yourblog.com
작업: 설정 (← "정적 추가" 아님!)
헤더 이름: Access-Control-Allow-Origin
값: *
📊 비교: 기존 vs Tunnel#
| 항목 | 포트포워딩 + NPM | Cloudflare Tunnel |
|---|---|---|
| 포트포워딩 | 필요 (80, 443) | 불필요 |
| 공인 IP 노출 | O | X |
| SSL 인증서 | Let’s Encrypt 관리 | Cloudflare 자동 |
| IP 변경 시 | DDNS 필요 | 영향 없음 |
| 안정성 | 공유기 NAT 의존 | 매우 안정적 |
| 속도 | 공유기 병목 | QUIC 프로토콜로 빠름 |
| 비용 | 무료 | 무료 |
🎁 무료로 얻는 것들#
Cloudflare가 진짜 무섭긴 해요. 이거 다 무료거든요:
- ✅ DNS
- ✅ SSL 인증서
- ✅ CDN
- ✅ DDoS 방어
- ✅ Tunnel (무제한)
- ✅ 대역폭 무제한
전략이 “일단 무료로 깔아놓고 → 기업 고객한테 돈 받기"라서… 개인 사용자는 개꿀이에요 🍯
🚀 없앤 것들 vs 얻은 것들#
삭제한 것들:
- 공유기 포트포워딩 설정
- Nginx Proxy Manager 컨테이너
- DDNS 설정
- Let’s Encrypt 갱신 걱정
- 522 에러 스트레스
얻은 것들:
- 안정적인 외부 접속
- 더 빠른 응답 속도
- IP 숨김 (보안 강화)
- 공유기 재부팅해도 자동 재연결
- 마음의 평화 😌
💬 마무리#
522 에러로 고생하시는 분들, Cloudflare Tunnel 강력 추천드려요. 설정도 어렵지 않고, 무료고, 훨씬 안정적이에요.
특히 저처럼 홈서버에서 여러 서비스 운영하시는 분들! 포트포워딩 삽질에서 해방되세요 🎉
혹시 설정하다가 막히는 부분 있으시면 댓글로 남겨주세요. 같이 해결해봐요!
참고 링크:
