Cloudflare Tunnel 설치 가이드 – 포트포워딩 없이 집 서버 외부 공개하는 법
공유기 설정 만지다 지쳤다면, Cloudflare Tunnel을 써보세요
집에서 NAS나 홈서버를 운영하면서 외부에서 접속하고 싶을 때, 대부분 공유기 포트포워딩을 설정합니다. 그런데 이 과정이 생각보다 만만치 않죠. 공유기 관리 페이지에 들어가서 포트 번호를 열고, 방화벽 규칙을 만들고, DDNS를 설정하고… 여기에 보안 걱정까지 더해지면 머리가 아파집니다. 내 집 IP가 외부에 노출되고, 열어둔 포트로 누군가 공격을 시도할 수도 있으니까요.
Cloudflare Tunnel은 이런 고민을 깔끔하게 해결해 줍니다. 포트포워딩 없이, 내 집 IP 노출 없이, 집에서 돌아가는 웹서비스를 안전하게 인터넷에 공개할 수 있습니다. 무료 플랜으로도 충분히 사용할 수 있고, 설정도 생각보다 간단합니다. 오늘은 Cloudflare Tunnel의 개념부터 실제 설치, 그리고 실전 활용 팁까지 하나씩 알려드리겠습니다.
Cloudflare Tunnel이 뭔가요? — 원리부터 이해하기
Cloudflare Tunnel(구 Argo Tunnel)은 내 서버에서 Cloudflare 네트워크로 아웃바운드 연결을 만들어 외부 트래픽을 안전하게 전달하는 서비스입니다. 핵심은 ‘아웃바운드’라는 점에 있습니다.
기존 포트포워딩 방식의 문제점
전통적인 포트포워딩 방식에서는 외부에서 내 집 공유기의 특정 포트로 직접 접속합니다. 이 구조에는 몇 가지 근본적인 문제가 있습니다.
- IP 노출: 내 집 공인 IP가 그대로 드러나서 DDoS 등 공격 대상이 될 수 있습니다.
- 포트 스캔 취약: 열려 있는 포트를 자동으로 스캔하는 봇이 24시간 돌아다니고 있습니다.
- ISP 제한: 일부 인터넷 서비스 제공업체는 특정 포트를 차단하거나 CGNAT(공유 IP) 환경을 사용합니다.
- 공유기 의존: 공유기 모델마다 설정 방법이 다르고, 펌웨어 업데이트 시 설정이 초기화되기도 합니다.
- SSL 인증서 관리: HTTPS를 적용하려면 Let’s Encrypt 등 인증서를 직접 발급하고 갱신해야 합니다.
Cloudflare Tunnel의 작동 방식
Cloudflare Tunnel은 완전히 다른 접근 방식을 사용합니다. 내 서버에 설치된 cloudflared라는 경량 데몬이 Cloudflare 네트워크로 나가는 연결을 만듭니다. 외부 사용자가 내 도메인에 접속하면, Cloudflare가 이 터널을 통해 내 서버로 트래픽을 전달하는 구조입니다.
- 인바운드 포트 불필요: 공유기에 포트를 열 필요가 전혀 없습니다.
- IP 숨김: 외부에서는 Cloudflare의 IP만 보이고, 내 집 IP는 노출되지 않습니다.
- 자동 SSL: Cloudflare가 HTTPS 인증서를 자동으로 관리합니다.
- CGNAT 환경에서도 작동: 아웃바운드 연결이므로 ISP의 NAT 제한에 영향을 받지 않습니다.
- DDoS 보호: Cloudflare의 글로벌 네트워크가 자동으로 DDoS 공격을 방어합니다.
쉽게 비유하면, 포트포워딩은 집 현관문을 열어두고 손님을 기다리는 것이고, Cloudflare Tunnel은 안전한 비밀 통로를 만들어 손님을 안내하는 것입니다. 현관문(포트)을 열 필요가 없으니 훨씬 안전하죠.

사전 준비 — 시작하기 전에 갖춰야 할 것들
Cloudflare Tunnel을 설정하기 전에 몇 가지를 미리 준비해야 합니다. 하나씩 확인해 봅시다.
1. 도메인 등록과 Cloudflare DNS 연결
Cloudflare Tunnel을 사용하려면 본인 소유의 도메인이 필요합니다. 도메인은 가비아, Namecheap, Cloudflare Registrar 등 어디서든 구입할 수 있습니다. 도메인을 구입했다면, 해당 도메인의 네임서버(NS)를 Cloudflare로 변경해야 합니다.
- Cloudflare에 무료 계정을 만듭니다. (dash.cloudflare.com)
- “Add a site”로 도메인을 추가합니다.
- Free 플랜을 선택합니다.
- Cloudflare가 알려주는 네임서버 2개를 도메인 등록기관에서 설정합니다.
- 네임서버 변경이 반영되기까지 최대 24시간이 걸릴 수 있지만, 보통 30분~1시간이면 완료됩니다.
2. 외부에 공개할 서비스 준비
터널을 통해 외부에 공개할 서비스가 내 서버에서 이미 동작하고 있어야 합니다. 예를 들어 웹 서버, Nextcloud, Jellyfin, Home Assistant, Gitea 같은 서비스들이 로컬에서 정상 작동하는 상태여야 합니다. 서비스가 localhost:포트번호로 접속 가능한 상태인지 먼저 확인하세요.
3. 서버 환경 확인
cloudflared는 Linux, macOS, Windows, Docker 환경 모두 지원합니다. 시놀로지 NAS에서도 Docker를 통해 실행할 수 있습니다. 이 글에서는 가장 범용적인 Docker 방식과 Linux 직접 설치 방식 두 가지를 모두 다루겠습니다.
실전 설치 — Cloudflare Tunnel 구축하기
이제 본격적으로 터널을 만들어 봅시다. Cloudflare 대시보드에서 터널을 생성하는 GUI 방식을 사용하면 더 직관적입니다.
Step 1: Cloudflare 대시보드에서 터널 생성
먼저 Cloudflare 대시보드에서 터널을 만듭니다.
- Cloudflare 대시보드(dash.cloudflare.com)에 로그인합니다.
- 왼쪽 메뉴에서 Zero Trust를 클릭합니다. (처음이라면 팀 이름을 설정하라고 나올 수 있는데, 원하는 이름을 입력하면 됩니다.)
- Networks → Tunnels로 이동합니다.
- Create a tunnel 버튼을 클릭합니다.
- 터널 타입으로 Cloudflared를 선택합니다.
- 터널 이름을 입력합니다. 예를 들어 “home-server”나 “nas-tunnel” 같이 알아보기 쉬운 이름으로 지정합니다.
- 생성이 완료되면 설치 토큰이 표시됩니다. 이 토큰을 복사해 둡니다. 이 토큰은 cloudflared가 Cloudflare 네트워크에 인증할 때 사용하는 일종의 비밀 열쇠입니다.
Step 2-A: Docker로 cloudflared 실행하기 (권장)
Docker를 사용하는 방법이 가장 간편하고, 시놀로지 NAS를 포함한 다양한 환경에서 동일하게 적용할 수 있습니다.
터미널에서 다음 명령어를 실행합니다.
docker run -d \
--name cloudflared-tunnel \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run \
--token YOUR_TUNNEL_TOKEN_HERE
YOUR_TUNNEL_TOKEN_HERE 부분에 Step 1에서 복사한 토큰을 붙여넣으면 됩니다. Docker Compose를 선호하신다면 아래와 같이 docker-compose.yml 파일을 만들 수 있습니다.
version: '3'
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared-tunnel
restart: unless-stopped
command: tunnel --no-autoupdate run --token YOUR_TUNNEL_TOKEN_HERE
network_mode: host
여기서 network_mode: host를 사용하면 cloudflared가 호스트 네트워크를 직접 사용하므로, localhost에서 돌아가는 서비스에 바로 접근할 수 있습니다. 만약 Docker 네트워크를 분리하고 싶다면, 서비스 주소를 host.docker.internal이나 컨테이너 이름으로 지정해야 합니다.
Step 2-B: Linux에 직접 설치하기
Docker 없이 직접 설치하고 싶다면, 아래 과정을 따릅니다.
Debian/Ubuntu 계열:
curl -L https://pkg.cloudflare.com/cloudflare-main.gpg \
| sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] \
https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install cloudflared
설치 후 서비스로 등록합니다.
sudo cloudflared service install YOUR_TUNNEL_TOKEN_HERE
이렇게 하면 cloudflared가 시스템 서비스(systemd)로 등록되어, 서버가 재시작되어도 자동으로 터널이 연결됩니다.

Step 3: 도메인과 서비스 연결 (Public Hostname 설정)
cloudflared가 실행되면, Cloudflare 대시보드의 터널 상태가 HEALTHY로 바뀝니다. 이제 어떤 도메인으로 접속했을 때 어떤 서비스로 연결할지를 설정합니다.
- 터널 설정 페이지에서 Public Hostname 탭으로 이동합니다.
- Add a public hostname를 클릭합니다.
- Subdomain에 원하는 서브도메인을 입력합니다. 예: nas
- Domain에서 본인의 도메인을 선택합니다. 예: example.com
- 결과적으로 nas.example.com으로 접속할 수 있게 됩니다.
- Service Type은 보통 HTTP를 선택합니다.
- URL에 로컬 서비스 주소를 입력합니다. 예: localhost:5000
이 설정 하나로 nas.example.com에 접속하면 내 서버의 5000번 포트에서 동작하는 서비스로 자동 연결됩니다. DNS 레코드도 Cloudflare가 자동으로 추가해 주고, SSL 인증서도 자동으로 적용됩니다. 정말 편리하죠.
여러 서비스를 운영한다면, Public Hostname을 추가로 만들면 됩니다.
- cloud.example.com → localhost:8080 (Nextcloud)
- media.example.com → localhost:8096 (Jellyfin)
- git.example.com → localhost:3000 (Gitea)
- home.example.com → localhost:8123 (Home Assistant)
하나의 터널에 여러 서브도메인을 연결할 수 있으므로, 서비스마다 터널을 따로 만들 필요는 없습니다.
보안 강화 — Cloudflare Access로 접근 제어 추가하기
Cloudflare Tunnel을 통해 서비스를 외부에 공개하면 누구나 접속할 수 있게 됩니다. 블로그처럼 공개 서비스라면 상관없지만, NAS 관리 페이지나 Home Assistant 같은 서비스는 나만 접속할 수 있어야 합니다. 이때 Cloudflare Access를 활용합니다.
Cloudflare Access란?
Cloudflare Access는 Zero Trust 보안 모델에 기반한 접근 제어 서비스입니다. 쉽게 말해, 특정 도메인에 접속하기 전에 인증 단계를 추가하는 것입니다. 무료 플랜에서도 최대 50명까지 사용할 수 있어서, 개인 용도로는 충분합니다.
Access 정책 설정하기
- Cloudflare Zero Trust 대시보드에서 Access → Applications으로 이동합니다.
- Add an application을 클릭하고 Self-hosted를 선택합니다.
- 보호할 도메인(예: nas.example.com)을 입력합니다.
- Policy에서 접근 허용 조건을 설정합니다.
가장 간단한 방법은 이메일 인증입니다. 허용할 이메일 주소를 등록하면, 해당 도메인에 접속할 때 이메일로 일회용 코드(OTP)가 발송됩니다. 코드를 입력해야만 서비스에 접근할 수 있습니다.
이메일 인증 외에도 다양한 인증 방식을 지원합니다.
- Google/GitHub/Azure AD 등 소셜 로그인 연동
- 일회용 PIN (이메일 OTP)
- IP 대역 제한 (특정 IP에서만 접근 허용)
- 국가 기반 제한 (한국에서만 접근 허용 등)
- 서비스 토큰 (API 접근용)
여러 조건을 조합할 수도 있습니다. 예를 들어 “한국 IP이면서 내 이메일로 인증한 경우에만 허용”처럼 설정하면 보안을 더욱 강화할 수 있습니다.
실용적인 보안 팁
Access 정책 외에도 몇 가지 추가 보안 조치를 적용하면 좋습니다.
- WAF(웹 애플리케이션 방화벽) 규칙 활성화: Cloudflare 대시보드의 Security → WAF에서 Managed Rules를 켜면, SQL 인젝션이나 XSS 같은 일반적인 웹 공격을 자동으로 차단합니다.
- Bot Fight Mode 활성화: Security → Bots에서 Bot Fight Mode를 켜면, 악의적인 봇의 접근을 줄일 수 있습니다.
- 서비스 자체의 인증도 유지: Cloudflare Access를 설정했더라도, 서비스 자체의 로그인 기능은 그대로 유지하세요. 보안은 여러 겹으로 적용하는 것이 좋습니다.
- cloudflared 버전 업데이트: Docker를 사용한다면 주기적으로 이미지를 업데이트하세요. Watchtower 같은 도구로 자동화할 수도 있습니다.

실전 활용 시나리오 — 이렇게 쓰면 유용합니다
Cloudflare Tunnel을 어떤 상황에서 활용할 수 있는지, 실제로 유용한 시나리오를 살펴봅시다.
시나리오 1: 시놀로지 NAS 외부 접속
시놀로지 NAS의 DSM 관리 페이지를 외부에서 접속하고 싶을 때, QuickConnect 대신 Cloudflare Tunnel을 사용할 수 있습니다. QuickConnect는 편리하지만 속도가 느리고 커스텀 도메인을 쓸 수 없습니다. 시놀로지 NAS에서 Docker(Container Manager)를 지원하는 모델이라면, 위에서 설명한 Docker 방식으로 cloudflared를 설치할 수 있습니다.
DSM은 보통 5000(HTTP) 또는 5001(HTTPS) 포트를 사용합니다. 터널의 Service를 https://localhost:5001로 설정하고, 추가 옵션에서 No TLS Verify를 활성화하면 됩니다. 시놀로지의 자체 인증서를 Cloudflare가 신뢰할 필요가 없기 때문입니다.
시나리오 2: 개발 중인 프로젝트 외부 시연
로컬에서 개발 중인 웹 애플리케이션을 클라이언트나 팀원에게 잠깐 보여줘야 할 때가 있습니다. 이럴 때 Cloudflare의 Quick Tunnel 기능을 사용하면, 토큰이나 대시보드 설정 없이 한 줄 명령어로 임시 터널을 만들 수 있습니다.
cloudflared tunnel --url http://localhost:3000
이 명령어를 실행하면 https://random-name.trycloudflare.com 같은 임시 URL이 생성됩니다. 이 URL을 공유하면 상대방이 바로 접속할 수 있습니다. ngrok의 무료 대안으로 매우 유용하고, 별도 계정 등록도 필요 없습니다.
시나리오 3: IoT 기기 원격 제어
Home Assistant를 집에서 운영하면서 외출 시에도 스마트홈을 제어하고 싶다면, Home Assistant의 웹 인터페이스(포트 8123)를 Cloudflare Tunnel로 노출하고 Access 정책을 걸어두면 됩니다. Nabu Casa 구독료(월 약 6.5달러)를 절약할 수 있는 방법이기도 합니다.
시나리오 4: 미디어 서버 가족 공유
Jellyfin이나 Plex 같은 미디어 서버를 가족에게 공유하고 싶을 때, 포트를 열지 않고도 media.example.com 같은 깔끔한 주소로 접속할 수 있습니다. Cloudflare Access에 가족의 이메일을 등록해 두면, 가족만 접속할 수 있게 됩니다.
Tailscale과 Cloudflare Tunnel, 뭐가 다른가요?
이 블로그에서 이전에 Tailscale도 소개한 적이 있는데요, 두 도구는 목적이 다릅니다. 용도에 맞게 선택하거나 함께 사용할 수 있습니다.
- Tailscale은 사설(Private) 접근에 최적화되어 있습니다. 내 기기들끼리만 연결되는 메시 VPN이라서, 나만 접속할 용도에 적합합니다. SSH 원격 접속, 내부 관리 페이지 접근 등에 좋습니다.
- Cloudflare Tunnel은 공개(Public) 서비스 노출에 최적화되어 있습니다. 불특정 다수 또는 허가된 사용자에게 웹 서비스를 공개할 때 적합합니다. CDN, DDoS 보호, WAF 같은 웹 보안 기능이 함께 제공됩니다.
두 도구를 동시에 사용하는 것도 좋은 전략입니다. 예를 들어, NAS 관리(DSM)와 SSH는 Tailscale로 나만 접근하고, 블로그나 미디어 서버 같은 공개 서비스는 Cloudflare Tunnel로 노출하는 식입니다. 이렇게 하면 관리 인터페이스는 인터넷에 아예 노출되지 않으면서, 공개 서비스는 Cloudflare의 보안 인프라 뒤에서 안전하게 서빙할 수 있습니다.
트러블슈팅 — 자주 겪는 문제와 해결법
Cloudflare Tunnel을 설정하다 보면 몇 가지 문제를 마주칠 수 있습니다. 가장 흔한 케이스들을 정리했습니다.
502 Bad Gateway 에러
가장 자주 발생하는 에러입니다. cloudflared는 잘 연결됐지만, 뒷단 서비스에 접근하지 못할 때 나타납니다.
- 로컬 서비스가 실제로 실행 중인지 확인하세요.
curl http://localhost:포트번호로 직접 테스트합니다. - Docker로 cloudflared를 실행했다면, network_mode: host를 사용하고 있는지 확인하세요. 기본 Docker 네트워크에서는 localhost가 컨테이너 자신을 가리킵니다.
- 서비스가 HTTPS를 사용하고 있다면, Service Type을 HTTPS로 바꾸고 No TLS Verify 옵션을 켜세요.
터널이 자꾸 끊어지는 경우
- 네트워크 상태를 확인합니다. cloudflared는 재연결을 자동으로 시도하지만, 기반 네트워크 자체가 불안정하면 끊길 수 있습니다.
- Docker의 restart: unless-stopped 또는 systemd의 Restart=always 설정이 되어 있는지 확인합니다.
- cloudflared 로그를 확인합니다. Docker 환경이면
docker logs cloudflared-tunnel로 볼 수 있습니다.
WebSocket이 동작하지 않는 경우
Home Assistant 같은 서비스는 WebSocket을 사용합니다. Cloudflare 대시보드에서 해당 도메인의 Network 설정에서 WebSockets이 활성화되어 있는지 확인하세요. 무료 플랜에서도 WebSocket을 지원합니다.
업로드 파일 크기 제한
Cloudflare 무료 플랜에서는 업로드 크기가 100MB로 제한됩니다. Nextcloud에 큰 파일을 업로드하려면, Cloudflare의 유료 플랜을 사용하거나 큰 파일 전송은 Tailscale을 통해 하는 것이 좋습니다.

마무리 — 포트포워딩은 이제 그만
Cloudflare Tunnel은 홈서버 운영자에게 정말 고마운 서비스입니다. 무료로 사용할 수 있으면서도, 포트포워딩의 번거로움과 보안 위험을 동시에 해결해 줍니다. SSL 자동 적용, DDoS 보호, CDN 캐싱까지 덤으로 따라오니, 안 쓸 이유가 없죠.
특히 시놀로지 NAS를 운영하시는 분들이라면, QuickConnect의 느린 속도에서 벗어나 커스텀 도메인으로 쾌적하게 접속하는 경험을 꼭 해보시길 바랍니다. 처음 설정하는 데 30분이면 충분하고, 한번 세팅해 두면 그 이후로는 신경 쓸 것이 거의 없습니다.
공유기 포트포워딩 설정과 씨름하던 시간을, 이제는 더 재미있는 셀프호스팅 프로젝트에 투자해 보세요.
이미지는 Claude AI 로 생성되었습니다.


