개발 서버에 22번 포트만 열려 있다면? 팀원들이 API를 테스트하려면 모두 SSH 터널링을 해야 할까요?
Cloudflare Tunnel을 사용하면 인바운드 포트 개방 없이 외부에서 접근 가능한 공개 URL을 단 한 줄로 만들 수 있습니다.
문제 상황
개발 서버에 NestJS API를 띄웠지만, 외부에서는 22번 포트(SSH)만 접근 가능한 상황이었습니다.
팀원들에게 API를 공유하려면 각자 SSH 터널링을 설정해야 해서 매우 번거로웠습니다.
[팀원 브라우저] --SSH--> [개발 서버 :22] --> [NestJS API :3000 내부]
❌ 팀원마다 터널링 설정 필요
Cloudflare Tunnel이란?
Cloudflare Tunnel(구 Argo Tunnel)은 아웃바운드 연결만으로 서버를 외부에 공개할 수 있는 서비스입니다.
서버가 Cloudflare 엣지 서버에 먼저 연결을 맺고, 외부 트래픽은 그 연결을 통해 역방향으로 들어옵니다.
방화벽 인바운드 규칙과 무관하게 동작하는 이유입니다.
[팀원 브라우저] --HTTPS--> [Cloudflare Edge] <--아웃바운드-- [개발 서버(cloudflared)]
✅ 인바운드 포트 개방 불필요
빠른 시작 — 계정 없이 3분 만에
1단계 — cloudflared 설치
서버에서 GitHub 접근이 막혀 있다면 로컬에서 다운받아 SCP로 전송합니다.
# Linux 서버에서 직접 다운로드 가능한 경우
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
# Windows에서 다운로드 후 서버로 전송
Invoke-WebRequest -Uri "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64" -OutFile cloudflared
scp cloudflared user@서버IP:/home/user/cloudflared
2단계 — 실행 권한 부여 및 터널 시작
chmod +x cloudflared
./cloudflared tunnel --url http://localhost:3000
3단계 — URL 확인
실행 후 수 초 내에 로그에 공개 URL이 출력됩니다.
https://continental-scanner-blacks-samples.trycloudflare.com
# 이 URL을 팀원들에게 공유하면 끝!
⚡ 핵심 포인트
cloudflared 프로세스가 실행 중인 동안만 URL이 유효합니다. 재시작 시 URL이 바뀌므로, 지속적인 사용은 아래 Named Tunnel 방식을 권장합니다.
임시 vs 영구 터널 비교
구분 Quick Tunnel (계정 불필요) Named Tunnel (계정 필요)
| 설정 | 명령어 1줄로 즉시 사용 | Cloudflare 대시보드 설정 필요 |
| URL | 재시작마다 변경 | 고정 서브도메인 사용 가능 |
| 안정성 | uptime 보장 없음 | 재시작 후에도 URL 유지 |
| 용도 | 개발·테스트 | 운영·스테이징 환경 |
tmux로 백그라운드 실행
SSH 세션이 끊겨도 터널이 유지되도록 tmux를 사용합니다.
# 새 tmux 세션 생성
tmux new -s tunnel
# 터널 실행
./cloudflared tunnel --url http://localhost:3000
# Ctrl+B, D 로 세션 분리 (터널은 계속 실행)
# 다시 연결하려면
tmux attach -t tunnel
언제 쓰면 좋을까?
- 폐쇄망 개발 서버 — 방화벽 규칙을 변경할 수 없는 환경에서 팀 공유가 필요할 때
- 웹훅 테스트 — 로컬 개발 중인 엔드포인트를 외부 서비스(Slack, GitHub 등)에 연결해야 할 때
- 제한된 네트워크 환경 — 포트 포워딩이 불가능한 환경(카페, 회사 내부망)에서 데모를 공유해야 할 때
- 임시 공유 — 배포 전 QA팀이나 클라이언트에게 빠르게 접근 URL을 전달해야 할 때
🔒 보안 주의사항
Quick Tunnel URL은 인터넷에 공개됩니다. 인증이 없는 API라면 팀 내부 테스트 후 반드시 터널을 종료하세요.
운영 환경에서는 Cloudflare Access를 함께 사용해 인증을 추가하는 것을 권장합니다.
'개발 & IT > 백엔드' 카테고리의 다른 글
| Ubuntu 서버에서 Docker / Laravel Sail 문제 해결 기록 (0) | 2026.02.06 |
|---|---|
| Laravel 운영 서버에서 env() 함수가 null을 반환하는 이유 (0) | 2025.12.03 |
| MySQL 타임존 SYSTEM 설정과 UTC 저장 문제 해결하기 (0) | 2025.10.30 |
| Sequelize vs Prisma: Node.js ORM 비교 분석 (0) | 2025.10.26 |
| Prisma로 Next.js 블로그 만들기: 데이터베이스 설정부터 마이그레이션까지 (0) | 2025.10.26 |