Cloudflare Tunnel로 포트포워딩 없이 집 서버를 도메인에 연결하는 방법
공유기 포트를 열지 않고 집에 둔 Mac mini를 내 도메인으로 공개하는 순서입니다. cloudflared 설치, 터널 생성, DNS 연결, config.yml 작성, 서비스 등록, 연결 확인까지와 석 달 넘게 운영하며 알게 된 것, 무료 플랜의 한도를 적었습니다.
집에 둔 Mac mini에서 API, 관리자 화면, 고객용 리포트 페이지를 돌리고 있고, 전부 Cloudflare Tunnel로 내 도메인에 연결해서 공개합니다. 공유기 관리 화면은 한 번도 열지 않았고, 석 달 넘게 쓰는 동안 집 IP가 몇 번 바뀌었지만 DNS를 고친 적이 없습니다.
이 글은 설정 순서 여섯 단계와 연결 확인 방법, 운영하면서 알게 된 것, 무료 플랜의 한도를 적습니다. 도메인이 Cloudflare에 등록돼 있다는 전제입니다.

Cloudflare Tunnel이 포트포워딩과 다른 점
포트포워딩은 밖에서 집 공유기로 들어오는 포트를 여는 방식입니다. 공유기에 포트 매핑을 걸어야 하고, 집 IP가 바뀌면 주소도 바뀝니다. 가정용 회선은 IP가 바뀌는 경우가 많고, 통신사가 특정 포트를 막아 두기도 합니다.
Tunnel은 연결 방향이 반대입니다. 공식 문서 설명대로 서버 안의 cloudflared가 Cloudflare 쪽으로 나가는 연결만 만들고, 밖에서 온 요청은 Cloudflare가 받아서 그 연결로 서버에 넘깁니다(Cloudflare Tunnel 문서).
| 포트포워딩 | Cloudflare Tunnel | |
|---|---|---|
| 공유기 설정 | 포트를 연다 | 건드리지 않는다 |
| 고정 IP | 필요 | 필요 없음 |
| 집 IP 노출 | 노출됨 | 노출되지 않음 |
| IP가 바뀌면 | 주소를 다시 맞춘다 | cloudflared가 다시 연결 |
1~4단계: cloudflared 설치, 로그인, 터널 생성, DNS 연결
맥에서는 Homebrew로 설치합니다.
# 1. 설치
brew install cloudflared
# 2. 로그인 (브라우저에서 인증하고 도메인을 고르면 cert.pem 이 저장됨)
cloudflared tunnel login
# 3. 터널 생성 → <UUID>.json 자격증명 파일이 생김
cloudflared tunnel create calmdev
# 4. 도메인을 터널로 연결 (CNAME 자동 생성)
cloudflared tunnel route dns calmdev api.calmdev.kr
route dns는 Cloudflare DNS에 <UUID>.cfargotunnel.com을 가리키는 CNAME을 만들어 줍니다. DNS 레코드를 직접 만들 필요가 없습니다.
설정 전에 한 번 시험해 보고 싶으면 로그인 없이 임시 주소를 받는 방법도 있습니다. 아래 명령은 trycloudflare.com 임시 주소로 로컬 포트를 엽니다.
cloudflared tunnel --url http://localhost:8000
5단계: config.yml로 터널 하나에 여러 서비스 연결하기
config.yml의 ingress에 호스트네임마다 안쪽 서비스(로컬 포트)를 적습니다. 어디에도 해당하지 않는 요청은 마지막 줄에서 404로 돌려보냅니다.
tunnel: <터널-UUID>
credentials-file: /Users/<계정>/.cloudflared/<UUID>.json
ingress:
- hostname: api.calmdev.kr
service: http://localhost:8080
- hostname: admin.calmdev.kr
service: http://localhost:3000
- service: http_status:404 # 해당 없으면 404 (필수, 맨 끝)
- 규칙은 위에서 아래로 순서대로 적용됩니다. 마지막
http_status:404줄은 반드시 있어야 하고 맨 끝에 둡니다. - 서비스를 추가할 때는 hostname 블록을 하나 더 넣고 그 도메인을
route dns로 연결합니다. - 서비스 주소는 cloudflared가 보는 기준으로 적습니다. 같은 컴퓨터에서 돌면
localhost:포트, Docker 네트워크 안이면 그 네트워크의 서비스 이름입니다.
6단계: 실행하고 부팅 때 자동으로 켜지게 하기
시험할 때는 직접 실행합니다.
cloudflared tunnel run calmdev
계속 쓸 때는 서비스로 등록해서 부팅 때마다 켜지게 합니다.
cloudflared service install
연결됐는지 확인하는 방법
cloudflared tunnel list # 터널이 목록에 있고 연결(CONNECTIONS)이 잡혀 있는지
cloudflared tunnel info calmdev # 연결된 커넥터 확인
curl -I https://api.calmdev.kr # 밖에서 응답이 오는지
curl 결과가 404면 ingress의 hostname이 요청한 도메인과 다르게 적혀 있는지 봅니다. 502면 터널은 연결됐는데 안쪽 서비스가 그 포트에서 응답하지 않는 것입니다.
석 달 넘게 운영하면서 알게 된 것
포트 하나에 도메인 여러 개를 연결할 수 있습니다. ingress는 호스트네임 기준이라, 고객 포털, 리포트 열람, API 세 도메인이 같은 로컬 포트 하나로 들어가고 뒤의 앱이 Host 헤더로 나눠 처리합니다. 서비스가 늘어도 포트를 새로 열지 않습니다.
터널을 둘로 나눠 돌립니다. 회사 시스템용은 Docker 컨테이너(cloudflare/cloudflared 이미지)로, 다른 서비스용은 launchd 서비스로 따로 띄웁니다. 컨테이너로 돌리면 서버가 재시작될 때 다른 컨테이너와 같이 올라오고, 한쪽 설정을 잘못 건드려도 다른 쪽 터널은 계속 돌아갑니다.
config.yml은 고치기 전에 백업합니다. 그 터널로 들어오는 서비스가 전부 이 파일을 거치기 때문에 한 줄이 틀리면 전부 같이 멈춥니다. 날짜를 붙인 백업 파일을 옆에 두고 고친 뒤 재시작합니다.
무료 플랜으로 되는 것과 안 되는 것
Cloudflare Tunnel은 무료 플랜에서 쓸 수 있습니다. 도메인 몇 개를 공개하는 용도로는 추가 결제 없이 씁니다(2026년 10월 기준).
| 항목 | 무료 플랜 |
|---|---|
| HTTP(S) 사이트 공개 | 가능 |
| 요청 본문 크기 | 100MB까지 |
| SSH 같은 TCP 접속 | 별도 설정 필요 |
- 요청 본문 상한은 Cloudflare 공식 한도 표 기준으로 Free와 Pro가 100MB, Business가 200MB입니다. 넘으면 413 오류가 납니다. 큰 파일을 올리는 서비스에는 맞지 않습니다.
- SSH 같은 TCP 접속은 Cloudflare Access나
cloudflared access를 따로 설정해야 합니다.
나만 접속할 서버라면 Tailscale
Tunnel은 누구에게나 보여 줄 주소를 여는 방법입니다. 저만 ssh로 들어가는 용도는 Tailscale로 따로 씁니다. 설정은 Tailscale로 집 서버·맥·안드로이드 폰을 한 네트워크로 묶는 방법에 적었습니다. 서버 자체의 구성과 비용은 중고 Mac mini 2018을 회사 서버로 쓰는 글에 있습니다.
자주 묻는 질문
Cloudflare Tunnel 은 포트포워딩과 뭐가 다른가요?
포트포워딩은 외부에서 들어오는 포트를 공유기에 여는 방식이라 고정 IP 가 필요하고 통신사 포트 차단에 막힐 수 있습니다. Tunnel 은 서버의 cloudflared 가 Cloudflare 로 나가는 연결을 유지하고 외부 요청이 그 연결을 타고 들어와, 인바운드 포트를 하나도 열지 않습니다.
터널 하나로 여러 서비스를 노출할 수 있나요?
가능합니다. config.yml 의 ingress 에 호스트네임별로 로컬 포트를 매핑하고 맨 끝에 http_status:404 를 둡니다. 호스트네임 기준이라 여러 도메인을 같은 포트 하나로 보낼 수도 있습니다.
비용이 드나요?
Cloudflare Tunnel 자체는 무료 플랜에서 쓸 수 있습니다. 다만 무료 범위는 HTTP(S) 트래픽 위주이고 프록시를 거치는 요청은 본문 100MB 상한이 있어, SSH 같은 TCP 나 큰 파일 업로드에는 별도 설정이나 다른 방식이 필요합니다.