Cloudflare Tunnel을 활용한 Mac 원격 HTTPS 접근 - 포트포워딩 없이 안전하게 연결하기
집에 있는 Mac을 외부에서 안전하게 접근하고 싶지만, 공유기 포트포워딩 설정이나 복잡한 네트워크 구성이 부담스러우신가요? Cloudflare Tunnel을 사용하면 포트포워딩 없이도 HTTPS로 안전하게 Mac에 접근할 수 있습니다. 이 글에서는 Cloudflare Tunnel의 기본 개념부터 실제 설정 방법까지 단계별로 알아보겠습니다. DNS 서버 이전이 어려운 환경에서도 사용할 수 있는 무료 도메인 활용 방법, 커스텀 도메인 설정, 그리고 Zero Trust를 통한 보안 강화까지 모두 다룹니다.

목 차
1. Cloudflare Tunnel이란 무엇인가
Cloudflare Tunnel은 Cloudflare가 제공하는 무료 서비스로, 로컬 네트워크에 있는 서버나 애플리케이션을 인터넷에 안전하게 노출시킬 수 있는 솔루션입니다. 전통적인 방식처럼 공유기에서 포트를 열거나 방화벽 설정을 변경할 필요 없이, 역방향 프록시(Reverse Proxy) 방식으로 안전한 연결을 제공합니다.특히 Mac과 같은 개인 컴퓨터를 외부에서 접근해야 하는 개발자나 재택근무자에게 유용한 도구입니다.
이 서비스는 이전에는 Argo Tunnel이라는 이름으로 제공되었으나, 현재는 Cloudflare Tunnel로 통합되어 더욱 강력한 기능을 제공합니다. 무료 플랜에서도 충분히 사용할 수 있으며, 추가적인 비용 없이 HTTPS 인증서, DDoS 보호, 트래픽 암호화 등의 기능을 모두 이용할 수 있습니다. cloudflared라는 경량 클라이언트 프로그램을 통해 간단하게 구성할 수 있으며, 설정 파일 하나로 여러 서비스를 동시에 관리할 수 있습니다.
[!] 역방향 프록시(Reverse Proxy)란? 클라이언트가 서버에 직접 접근하는 대신, 중간에 위치한 프록시 서버를 통해 요청을 전달하는 방식입니다. Cloudflare가 이 역할을 수행하여 실제 서버의 위치를 숨기고 보안을 강화합니다.
2. 왜 Cloudflare Tunnel을 사용해야 하는가
기존의 원격 접근 방식은 공유기에서 특정 포트를 외부로 개방하는 포트포워딩을 사용했습니다. 하지만 이 방식은 여러 보안 위험과 설정의 복잡성을 동반합니다. 공개된 IP 주소와 포트는 인터넷에서 누구나 스캔할 수 있어 무차별 대입 공격(Brute Force Attack)이나 취약점 공격의 대상이 될 수 있습니다. 또한 동적 IP 환경에서는 IP가 변경될 때마다 DNS 설정을 수동으로 업데이트해야 하는 번거로움이 있습니다.
Cloudflare Tunnel은 이러한 문제들을 근본적으로 해결합니다.
- 첫째, 포트포워딩이 전혀 필요하지 않아 공유기 설정을 변경할 필요가 없습니다.
- 둘째, 자동으로 SSL/TLS 인증서가 적용되어 HTTPS 연결이 보장됩니다.
- 셋째, Cloudflare의 글로벌 네트워크를 통해 DDoS 공격으로부터 자동으로 보호받을 수 있습니다.
- 넷째, 동적 IP 문제에서 자유롭습니다. Mac의 IP가 변경되더라도 Cloudflare와의 터널 연결만 유지되면 되기 때문입니다.
개발자 입장에서는 로컬 개발 환경을 팀원이나 클라이언트와 공유할 때 매우 유용합니다. 별도의 서버 구축 없이 자신의 Mac에서 실행 중인 애플리케이션을 즉시 외부에 공개할 수 있습니다. 또한 웹훅(Webhook)을 테스트하거나 OAuth 인증 콜백을 받아야 할 때도 간단하게 활용할 수 있습니다. 무엇보다 모든 트래픽이 Cloudflare를 경유하기 때문에 접속 로그와 분석 데이터를 Cloudflare 대시보드에서 확인할 수 있어 모니터링도 용이합니다.
3. Cloudflare Tunnel의 작동 원리
Cloudflare Tunnel의 핵심은 '역방향 연결(Outbound Connection)' 방식입니다. 일반적인 인바운드 연결과 달리, Mac에 설치된 cloudflared 클라이언트가 먼저 Cloudflare 서버로 아웃바운드 연결을 시도합니다. "최신 cloudflared는 QUIC 프로토콜(UDP 기반)을 사용하여 Cloudflare 서버와 연결합니다. QUIC은 HTTP/3의 기반 프로토콜로, 기존 TCP WebSocket 방식보다 빠르고 안정적입니다.
Mac에서는 임의의 UDP 포트 (ephemeral ports)를 사용하여 아웃바운드 연결을 생성하므로, 방화벽에서 나가는 UDP 트래픽만 허용되면 됩니다. 일반적으로 모든 방화벽은 아웃바운드 UDP를 허용하므로 별도의 방화벽 설정이 필요 없습니다. Cloudflare 서버는 이 연결을 유지하면서 외부 요청을 이미 열려 있는 터널을 통해 Mac으로 전달합니다.
sequenceDiagram
participant Service as Mac localhost:8080
participant Client as cloudflared
participant Edge as Cloudflare Edge
participant User as 인터넷 사용자
Note over Client: 로컬 메트릭 포트
Client->>Client: TCP :20241 LISTEN
Note over Client,Edge: 1. QUIC 연결 (UDP 기반)
Client->>Edge: UDP :50747 → Cloudflare (QUIC)
Client->>Edge: UDP :51799 → Cloudflare (QUIC)
Client->>Edge: UDP :63846 → Cloudflare (QUIC)
Client->>Edge: UDP :62534 → Cloudflare (QUIC)
Edge-->>Client: QUIC 연결 수락 (4개 병렬)
Note over Edge,Client: 2. 터널 유지 상태
Note over User,Service: 3. 외부 요청 처리
User->>Edge: HTTPS 요청
Edge->>Client: QUIC 터널로 전달
Client->>Service: HTTP 요청
Service-->>Client: HTTP 응답
Client-->>Edge: QUIC 터널로 전달
Edge-->>User: HTTPS 응답
구체적인 동작 과정을 살펴보면 다음과 같습니다.
- 먼저 cloudflared가 시작되면 Cloudflare의 글로벌 네트워크에 있는 가장 가까운 엣지 서버로 안전한 WebSocket 연결을 생성합니다. 이때 TLS 암호화가 자동으로 적용되어 모든 통신이 보호됩니다.
- 외부 사용자가 설정된 도메인(예: mac.yourdomain.com)으로 접근하면, 요청은 Cloudflare의 엣지 네트워크로 전달됩니다.
- Cloudflare는 이미 열려 있는 터널을 통해 요청을 Mac으로 라우팅하고,
- Mac의 로컬 서비스가 응답을 생성하면 동일한 터널을 통해 다시 사용자에게 전달됩니다.
이 방식의 가장 큰 장점은 Mac이 직접 인터넷에 노출되지 않는다는 점입니다. 외부에서는 Cloudflare의 IP만 보이며, 실제 Mac의 위치나 IP 주소는 완전히 숨겨집니다. 또한 모든 연결이 Cloudflare를 경유하기 때문에 악성 트래픽은 Cloudflare의 보안 시스템에서 필터링됩니다. 설정 파일(config.yml)에서 여러 서비스를 정의할 수 있어, 하나의 터널로 여러 로컬 애플리케이션을 동시에 서비스할 수 있습니다.
[!] WebSocket 연결이란? HTTP와 달리 클라이언트와 서버 간 양방향 통신을 지속적으로 유지하는 프로토콜입니다. Cloudflare Tunnel은 이를 활용하여 항상 연결된 상태를 유지합니다.
4. 사전 준비사항
Cloudflare Tunnel을 사용하기 위해서는 몇 가지 준비물이 필요합니다.
가장 먼저 Cloudflare 계정이 필요하며, 무료 플랜으로도 충분히 사용할 수 있습니다. 계정이 없다면 cloudflare.com에서 이메일로 간단하게 가입할 수 있습니다.
커스텀 도메인을 사용하려면 본인 소유의 도메인이 필요하지만, 이번 가이드에서는 Cloudflare가 제공하는 무료 서브도메인(cfargotunnel.com)을 사용하는 방법도 소개하므로 도메인이 없어도 시작할 수 있습니다.
Mac에는 관리자 권한이 필요합니다. cloudflared를 시스템 서비스로 등록하거나 특정 폴더에 파일을 생성할 때 관리자 권한이 요구되기 때문입니다. 터미널 사용에 대한 기본적인 이해가 있으면 좋지만, 이 가이드를 따라하면서 충분히 익힐 수 있습니다. Homebrew 패키지 매니저가 설치되어 있으면 cloudflared 설치가 더욱 간편하지만, Homebrew 없이도 직접 다운로드하여 설치할 수 있습니다.
로컬에서 실행할 서비스도 준비되어 있어야 합니다. 예를 들어 웹 서버, 데이터베이스, n8n 같은 자동화 도구, 또는 개발 중인 애플리케이션 등이 Mac의 특정 포트에서 실행되고 있어야 합니다. 가장 기본적인 테스트를 위해서는 간단한 Python HTTP 서버로도 충분합니다. 터미널에서 python3 -m http.server 8080 명령으로 8080 포트에 간단한 웹 서버를 띄울 수 있으며, 이것으로 Cloudflare Tunnel 설정을 테스트할 수 있습니다.
[!] 주의사항: Mac이 절전 모드나 잠자기 상태로 들어가면 터널 연결이 끊어질 수 있습니다. 지속적인 외부 접근이 필요하다면 에너지 절약 설정에서 디스플레이만 꺼지도록 설정하고 컴퓨터는 깨어 있도록 유지해야 합니다.
5. Cloudflared 설치하기
Cloudflared는 Cloudflare Tunnel을 Mac에서 실행하기 위한 클라이언트 프로그램입니다. 설치 방법은 크게 두 가지가 있으며, Homebrew를 사용하는 방법이 가장 간편합니다. Homebrew가 설치되어 있다면 터미널에서 다음 명령어 한 줄로 설치가 완료됩니다. Homebrew는 macOS용 패키지 관리자로, 아직 설치하지 않았다면 brew.sh에서 설치 방법을 확인할 수 있습니다.
# Homebrew를 사용한 설치 (권장)
brew install cloudflare/cloudflare/cloudflared
Homebrew를 사용하지 않는 경우에는 GitHub에서 직접 바이너리 파일을 다운로드할 수 있습니다. Mac의 프로세서 종류에 따라 다운로드할 파일이 다르므로 주의해야 합니다. Intel 기반 Mac이라면 darwin-amd64 버전을, Apple Silicon(M1/M2/M3 등) Mac이라면 darwin-arm64 버전을 다운로드해야 합니다. 터미널에서 uname -m 명령으로 확인할 수 있으며, x86_64가 나오면 Intel, arm64가 나오면 Apple Silicon입니다.
# Apple Silicon (M1/M2/M3) Mac용
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-arm64.tgz | tar -xz
# Intel Mac용
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-amd64.tgz | tar -xz
# 실행 권한 부여 및 시스템 경로로 이동
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
설치가 완료되었는지 확인하려면 터미널에서 버전을 확인해봅니다. 설치가 정상적으로 완료되었다면 cloudflared의 버전 정보가 표시됩니다. 이제 Cloudflare 계정과 연동하는 단계로 넘어갈 준비가 되었습니다.
# 설치 확인
cloudflared --version
[!] curl과 tar 명령어란? curl은 URL에서 파일을 다운로드하는 명령어이고, tar는 압축 파일을 푸는 명령어입니다. 파이프(|)로 연결하여 다운로드와 동시에 압축을 해제합니다.
6. Named Tunnel 생성 및 설정
Cloudflared가 설치되었다면 이제 Cloudflare 계정과 연동하고 터널을 생성해야 합니다. 첫 단계는 Cloudflare 인증입니다. 터미널에서 로그인 명령을 실행하면 자동으로 브라우저가 열리고 Cloudflare 로그인 페이지가 나타납니다. 로그인 후 터널을 생성할 도메인을 선택하는 화면이 표시되며, 이때 커스텀 도메인이 없어도 괜찮습니다. 인증이 완료되면 홈 디렉토리의 .cloudflared 폴더에 cert.pem 파일이 생성됩니다.
# Cloudflare 계정 인증
cloudflared tunnel login
인증이 완료되면 Named Tunnel을 생성합니다. Named Tunnel은 고정된 이름과 ID를 가진 터널로, 재시작해도 동일한 URL을 유지할 수 있어 안정적인 운영에 적합합니다. 터널 이름은 영문과 하이픈(-)만 사용할 수 있으며, 의미 있는 이름을 지정하는 것이 좋습니다. 예를 들어 'mac-home', 'development-server', 'personal-mac' 같은 이름을 사용할 수 있습니다.
# 터널 생성 (예: mac-home)
cloudflared tunnel create mac-home
# 생성된 터널 목록 확인
cloudflared tunnel list
터널이 생성되면 고유한 터널 ID가 부여됩니다. 이 터널 ID는 UUID 형식의 긴 문자열로, .cloudflared 폴더에 JSON 형식의 인증 파일로 저장됩니다. 예를 들어 abc123def-456-789-ghi-jkl012mno345.json과 같은 파일이 생성됩니다. 이 파일에는 터널 인증에 필요한 중요한 정보가 포함되어 있으므로 외부에 노출되지 않도록 주의해야 합니다.
이제 설정 파일을 생성합니다. .cloudflared/config.yml 파일을 만들어 터널 설정을 정의합니다. 이 파일에서 어떤 도메인으로 어떤 로컬 서비스에 연결할지 정의합니다. 가장 기본적인 설정은 다음과 같습니다.
# ~/.cloudflared/config.yml
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/사용자명/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
ingress:
- service: http://localhost:8080
위 설정에서 tunnel 항목에는 앞서 생성한 터널 ID를, credentials-file에는 인증 파일의 전체 경로를 입력합니다. ingress 섹션에서는 로컬 서비스의 주소를 지정합니다. 여러 서비스를 운영한다면 ingress 규칙을 여러 개 추가할 수 있지만, 기본 설정에서는 하나만 지정해도 됩니다.
[!] YAML 파일 형식 : YAML은 설정 파일에 자주 사용되는 형식으로, 들여쓰기로 계층 구조를 표현합니다. 공백 2칸 또는 4칸으로 일관되게 들여쓰기해야 하며, 탭 문자는 사용할 수 없습니다.
7. 무료 cfargotunnel.com 도메인 사용하기
Cloudflare는 커스텀 도메인이 없는 사용자를 위해 무료 서브도메인을 제공합니다.
DNS 서버 이전이 어렵거나 도메인 구입이 부담스러운 경우에 매우 유용한 옵션입니다. 앞서 생성한 터널에는 자동으로 터널ID.cfargotunnel.com 형식의 URL이 할당됩니다. 이 URL은 터널이 삭제되지 않는 한 영구적으로 유지되며, Mac을 재시작하거나 터널을 다시 실행해도 변경되지 않습니다.
터널을 실행하면 자동으로 이 도메인을 통해 접근할 수 있습니다. 별도의 DNS 설정이나 도메인 구매 없이 즉시 사용 가능하다는 것이 큰 장점입니다. Cloudflare가 전 세계에 분산된 엣지 서버 네트워크를 운영하기 때문에, 접속 지역에 따라 가장 가까운 서버로 자동 연결되어 빠른 응답 속도를 보장합니다.
# 터널 실행
cloudflared tunnel run mac-home
터미널에 다음과 같은 메시지가 출력되면 성공적으로 연결된 것입니다. 출력되는 URL을 복사하여 브라우저에 입력하면 Mac의 로컬 서비스에 접근할 수 있습니다.
INFO Connection established connIndex=0 location=ICN
INFO Connection established connIndex=1 location=ICN
INFO Registered tunnel connection connIndex=0 connection=abc123def-456-789-ghi-jkl012mno345.cftunnel.com
만약 더 빠른 테스트를 원한다면 Quick Tunnel 기능도 사용할 수 있습니다. 이 방식은 터널을 생성하지 않고 즉시 임시 URL을 발급받는 방법으로, 설정 파일도 필요 없습니다. 하지만 터널을 중지하고 다시 실행할 때마다 URL이 변경되므로 일회성 테스트나 데모 용도로만 적합합니다.
# Quick Tunnel (임시 URL 즉시 생성)
cloudflared tunnel --url http://localhost:8080
Quick Tunnel을 실행하면 https://random-words-1234.trycloudflare.com과 같은 형태의 임시 URL이 생성됩니다. 이 URL은 매번 랜덤하게 변경되므로 영구적인 서비스에는 적합하지 않지만, 팀원에게 빠르게 로컬 개발 환경을 공유하거나 웹훅 테스트를 할 때 유용합니다.
8. 커스텀 도메인으로 전문적인 서비스 구축하기
무료 cfargotunnel.com 도메인도 충분히 유용하지만, 프로덕션 환경이나 전문적인 서비스를 운영하려면 커스텀 도메인을 사용하는 것이 좋습니다. 커스텀 도메인은 짧고 기억하기 쉬우며, 브랜딩 효과도 있습니다. 예를 들어 abc123def-456-789.cfargotunnel.com 대신 n8n.mydomain.com과 같이 깔끔한 URL을 사용할 수 있습니다.
도메인 구매 및 준비
먼저 본인 소유의 도메인이 필요합니다. 도메인은 국내외 여러 등록 대행사에서 구매할 수 있으며, 연간 비용은 대략 10,000원에서 30,000원 정도입니다. 국내 서비스로는 가비아, 후이즈, 카페24가 있고, 해외 서비스로는 Namecheap, GoDaddy, Cloudflare Registrar 등이 있습니다.
Cloudflare Registrar는 도매가 수준의 가격으로 도메인을 제공하므로 비용 절감에 유리합니다. 또한 Tunnel구성을 Cloudflare에서 진행하면 되므로 DNS서버 설정 등의 불필요한 작업없이 터널작업만 할 수 있으므로 매우 간편하고 안정적인 서비스를 구축하고 있어 Cloudflare에서 도메인을 구매하시는 것을 권장 드립니다.
도메인 선택 시 고려사항은 다음과 같습니다. .com이나 .net은 전통적이고 신뢰도가 높습니다. .dev나 .io는 개발자 친화적인 이미지를 줍니다. .me나 .kr은 개인 또는 국가 브랜딩에 적합합니다. 가능한 한 짧고 발음하기 쉬운 도메인을 선택하는 것이 좋으며, 하이픈이나 숫자는 피하는 것을 추천합니다.
Cloudflare에 도메인 추가하기 | Cloudflare에서 구매한 도메인은 자동 설정됨
도메인을 구매했다면 Cloudflare에 등록해야 합니다. Cloudflare 대시보드에 로그인한 후 "Add a Site" 버튼을 클릭하고 도메인 이름을 입력합니다. 플랜 선택 화면에서는 Free 플랜을 선택하면 됩니다. 무료 플랜으로도 Cloudflare Tunnel의 모든 기능을 사용할 수 있습니다.
Cloudflare가 제공하는 네임서버 주소가 화면에 표시됩니다. 일반적으로 다음과 같은 형식입니다.
# Cloudflare 이름 서버
# Cloudflare의 모든 DNS 영역에는 Cloudflare 브랜드 이름 서버 집합이 할당됩니다.
# 형식 값
NS dale.ns.cloudflare.com
NS simone.ns.cloudflare.com
이 네임서버 주소를 복사한 후, 도메인을 구매한 등록 대행사의 관리 페이지로 이동합니다. 네임서버 설정 메뉴를 찾아 기존 네임서버를 Cloudflare가 제공한 주소로 변경합니다. 변경 후 DNS 전파에는 보통 1시간에서 최대 24시간이 소요될 수 있습니다. 전파가 완료되면 Cloudflare 대시보드에서 도메인 상태가 활성화됩니다.
DNS 레코드 생성하기 | 9. DNS 레코드 설정 참조
DNS가 Cloudflare로 이전되었다면 이제 터널과 연결할 DNS 레코드를 생성합니다. 가장 간편한 방법은 cloudflared CLI를 사용하는 것입니다. 다음 명령어로 자동으로 CNAME 레코드를 생성할 수 있습니다.
# 자동 DNS 레코드 생성 (권장)
cloudflared tunnel route dns mac-home n8n.yourdomain.com
cloudflared tunnel route dns mac-home api.yourdomain.com
cloudflared tunnel route dns mac-home portainer.yourdomain.com
또는 Cloudflare 대시보드에서 수동으로 추가할 수도 있습니다. Cloudflare 홈 → 도메인 선택 → DNS → Records 탭으로 이동한 후 "Add record" 버튼을 클릭합니다. 다음과 같이 설정합니다.
| 항목 | 값 | 설명 |
| Type | CNAME | 항상 CNAME 타입 사용 |
| Name | n8n | 서브도메인 부분 (원하는 이름) |
| Target | abc123def-456-789.cfargotunnel.com | 터널 ID.cfargotunnel.com |
| Proxy status | Proxied (주황색) | 반드시 Proxied 활성화 |
| TTL | Auto | 자동 설정 |
Proxied 상태(주황색 구름)를 활성화하면 Cloudflare의 모든 보안 기능과 성능 최적화가 적용됩니다. 이 상태에서는 외부에서 실제 서버 IP를 확인할 수 없으며, DDoS 보호와 캐싱이 자동으로 적용됩니다.
config.yml에 호스트네임 추가하기
DNS 레코드를 생성했다면 config.yml 파일을 수정하여 각 서브도메인에 대응하는 로컬 서비스를 지정해야 합니다. 여러 서비스를 운영하는 경우 다음과 같이 설정할 수 있습니다.
# ~/.cloudflared/config.yml
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/사용자명/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
ingress:
- hostname: n8n.yourdomain.com
service: http://localhost:5678
- hostname: portainer.yourdomain.com
service: http://localhost:9000
- hostname: grafana.yourdomain.com
service: http://localhost:3000
- service: http_status:404
ingress 규칙은 순서대로 평가되며, 마지막 규칙은 반드시 hostname 없이 기본 처리 방식을 정의해야 합니다. 위 예시에서는 매칭되지 않는 요청에 대해 404 에러를 반환하도록 설정했습니다.
SSL/TLS 설정 확인
Cloudflare는 자동으로 무료 SSL 인증서를 발급하고 관리합니다.
Let's Encrypt를 직접 설정할 필요가 없으며, 인증서 갱신도 자동으로 처리됩니다. SSL/TLS 암호화 모드를 확인하려면 Cloudflare 대시보드 → SSL/TLS 탭으로 이동합니다.
권장 설정은 "Full" 또는 "Full(Strict)" 모드입니다. 이 모드에서는 사용자와 Cloudflare 간, 그리고 Cloudflare와 Mac 간 모두 암호화됩니다. Mac의 로컬 서비스가 자체 서명 인증서를 사용하거나 HTTP만 지원해도 문제없이 작동합니다. "Full (Strict)" 모드는 Mac에서 유효한 인증서를 사용할 때만 선택합니다.
| SSL/TLS모드 | 설명 | 권장 여부 |
| Off | 암호화 없음 | [!] 절대 사용 금지 |
| Flexible | 브라우저 ↔ Cloudflare만 암호화 | [!] 비추천 |
| Full | 전체 구간 암호화, 자체 서명 인증서 허용 | [v] 권장 |
| Full (Strict) | 전체 구간 암호화, 유효한 인증서 필요 | [v] 고급 사용자용 |
9. DNS 레코드 설정 | 터널과 도메인을 연결하는 필수 단계
터널을 생성하고 config.yml 파일까지 완벽하게 작성했다면 이제 마지막 단계만 남았습니다. 바로 DNS 레코드 설정입니다. 많은 사용자들이 "터널은 HEALTHY 상태인데 왜 접속이 안 되지?"라는 문제를 겪는데, 그 원인의 99%는 DNS 레코드를 추가하지 않았기 때문입니다. 이 챕터에서는 Zero Trust UI 방식과 터미널 방식의 DNS 처리 차이를 명확히 이해하고, 직접 DNS 레코드를 추가하는 방법을 단계별로 알아보겠습니다.
Zero Trust UI vs 터미널 방식 - DNS 처리의 결정적 차이
Cloudflare Tunnel 설정 방법에는 크게 두 가지가 있습니다. Zero Trust 웹 인터페이스를 사용하는 방법과 터미널에서 config.yml 파일을 직접 작성하는 방법입니다. 두 방식 모두 동일한 터널을 만들지만, DNS 레코드 처리 방식에서 결정적인 차이가 있습니다. 이 차이를 이해하지 못하면 터널은 정상 작동하는데 웹사이트에 접속할 수 없는 상황에 빠지게 됩니다.
Zero Trust UI 방식에서는 Public Hostname을 추가할 때 DNS 레코드가 자동으로 생성됩니다. 웹 인터페이스에서 서브도메인(예: obsidian)과 도메인(예: yourdomain.com)을 입력하고 저장 버튼을 누르면, Cloudflare가 알아서 CNAME 레코드를 DNS에 추가해줍니다. 사용자는 DNS 설정을 전혀 신경 쓸 필요가 없으며, Public Hostname 추가와 동시에 바로 웹사이트에 접속할 수 있습니다.
반면 터미널에서 config.yml 파일을 작성하는 방식은 DNS 레코드를 반드시 수동으로 추가해야 합니다. config.yml에 hostname: obsidian.yourdomain.com이라고 작성하고 터널을 실행해도, Cloudflare DNS에는 아무런 레코드가 생성되지 않습니다. 사용자가 직접 Cloudflare 대시보드에 접속해서 CNAME 레코드를 하나하나 추가해야만 도메인과 터널이 연결됩니다. 이것이 터미널 방식이 Zero Trust UI보다 설정이 복잡한 이유입니다.
| 비교 항목 | Zero Trust UI 방식 | 터미널 config.yml 방식 |
| DNS 레코드 생성 | 자동 생성 (Public Hostname 추가 시) | 수동 추가 필요 (Cloudflare 대시보드에서) |
| 설정 위치 | Zero Trust 웹 인터페이스 | Cloudflare DNS 관리 페이지 |
| 난이도 | 쉬움 (클릭 몇 번) | 중간 (터널 ID 확인 및 CNAME 생성 필요) |
| 초보자 추천도 | 매우 높음 | 낮음 (DNS 개념 이해 필요) |
[!] 주의사항
config.yml 파일에 hostname을 작성하는 것만으로는 충분하지 않습니다. 반드시 Cloudflare DNS에 CNAME 레코드를 추가해야 터널이 작동합니다. 이 단계를 빠뜨리면 터널 상태는 HEALTHY로 표시되지만 웹사이트 접속이 불가능합니다.
DNS 레코드가 없을 때 발생하는 증상
DNS 레코드를 추가하지 않으면 어떤 문제가 발생할까요?
터널 자체는 완벽하게 작동하고 Zero Trust 대시보드에도 HEALTHY 상태로 표시되지만, 사용자는 웹사이트에 전혀 접속할 수 없습니다. 브라우저에 도메인을 입력하면 "이 사이트에 연결할 수 없음" 또는 "DNS_PROBE_FINISHED_NXDOMAIN" 같은 오류 메시지가 나타납니다. 이는 DNS 서버가 해당 도메인의 IP 주소를 찾을 수 없기 때문에 발생하는 현상입니다.
터널이 정상 작동하는지 확인하는 방법은 간단합니다.
cloudflared 로그를 보면 "Registered tunnel connection" 메시지와 함께 4개의 연결이 모두 등록되었다는 내용이 나타납니다. Zero Trust 대시보드의 Networks -> Tunnels 메뉴에서도 터널 상태가 초록색 점으로 HEALTHY라고 표시됩니다. 그런데 웹사이트 접속이 안 된다면, DNS 레코드가 없다는 것을 의미합니다.
이런 상황에서 사용자가 브라우저에 host.yourdomain.com을 입력하면 다음과 같은 과정이 진행됩니다. 먼저 브라우저가 DNS 서버에게 "host.yourdomain.com의 IP 주소가 뭐야?"라고 질문합니다. 그런데 Cloudflare DNS에 해당 도메인의 레코드가 없으므로 DNS 서버는 "그런 도메인 모르는데요"라고 응답합니다. 결국 브라우저는 어디로 접속해야 할지 몰라서 오류 페이지를 표시하게 됩니다. 터널은 멀쩡히 대기 중인데 DNS가 없어서 연결의 시작점을 찾지 못하는 것입니다.
# DNS 레코드가 없을 때 nslookup 결과
$ nslookup obsidian.yourdomain.com
Server: 8.8.8.8
Address: 8.8.8.8#53
** server can't find obsidian.yourdomain.com: NXDOMAIN
위의 명령어 결과에서 "NXDOMAIN"은 "Non-Existent Domain", 즉 존재하지 않는 도메인이라는 뜻입니다. DNS 레코드를 추가하면 이 응답이 Cloudflare의 IP 주소로 바뀌면서 정상 접속이 가능해집니다.
터널 ID 확인하기 | DNS 레코드 생성의 핵심 정보
DNS 레코드를 추가하려면 먼저 터널 ID를 알아야 합니다.
터널 ID는 터널을 고유하게 식별하는 UUID 형식의 문자열로, abc123def-456-789-ghi-jkl012mno345와 같은 형태입니다. 이 ID는 DNS 레코드의 Target 값으로 사용되므로 정확하게 확인하는 것이 중요합니다. 터널 ID를 확인하는 방법은 여러 가지가 있으며, 사용 중인 운영체제에 따라 조금씩 다릅니다.
Mac이나 Linux에서는 터미널을 열고 config.yml 파일을 직접 확인하는 것이 가장 빠릅니다.
~/.cloudflared/config.yml 파일을 열면 첫 줄에 tunnel: 항목이 있고, 그 옆에 긴 UUID 문자열이 터널 ID입니다. 또는 cloudflared tunnel list 명령어를 실행하면 생성한 모든 터널의 목록과 함께 각 터널의 ID, 이름, 생성 시간이 표형식으로 출력됩니다.
# Mac/Linux에서 config.yml로 터널 ID 확인
$ cat ~/.cloudflared/config.yml | grep tunnel:
tunnel: abc123def-456-789-ghi-jkl012mno345
# cloudflared 명령어로 터널 목록 확인
$ cloudflared tunnel list
ID NAME CREATED
abc123def-456-789-ghi-jkl012mno345 mac-home 2026-01-20T10:30:00Z
Synology NAS에서는 Docker 컨테이너로 cloudflared를 실행하므로 파일 경로가 다릅니다. SSH로 NAS에 접속한 다음 /volume1/docker/cloudflared/config.yml 파일을 확인하거나, Docker 명령어를 사용해서 터널 목록을 조회할 수 있습니다. Docker 방식에서는 볼륨 마운트 경로에 주의해야 하며, 컨테이너 내부 경로가 아닌 호스트 경로에서 파일을 확인해야 합니다.
# Synology NAS에서 config.yml로 터널 ID 확인
$ cat /volume1/docker/cloudflared/config.yml | grep tunnel:
tunnel: 35411f8d-fcd5-4f49-920c-8d72dd3332a2
# Docker로 터널 목록 확인
$ sudo docker run -it --rm \
-v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest \
tunnel list
터널 ID를 복사할 때는 공백이나 줄바꿈이 포함되지 않도록 주의해야 합니다. 나중에 DNS 레코드의 Target 항목에 이 ID를 붙여넣을 때 .cfargotunnel.com을 뒤에 추가해야 하므로, ID만 정확하게 복사해두는 것이 중요합니다.
Cloudflare DNS 레코드 추가하기 - 단계별 가이드
터널 ID를 확인했다면 이제 Cloudflare 대시보드에서 DNS 레코드를 추가할 차례입니다.
먼저 웹 브라우저에서 https://dash.cloudflare.com에 접속하여 Cloudflare 계정으로 로그인합니다. 메인 화면에서 DNS 레코드를 추가할 도메인을 클릭하면 해당 도메인의 관리 페이지로 이동합니다. 왼쪽 사이드바 메뉴에서 "DNS"를 찾아 클릭한 다음, "레코드" 탭을 선택하면 현재 등록된 DNS 레코드 목록이 나타납니다.
페이지 상단의 "레코드 추가" 버튼을 클릭하면 새 DNS 레코드를 입력하는 폼이 나타납니다. 여기서 가장 중요한 것은 올바른 Type과 Target을 입력하는 것입니다. Type은 반드시 "CNAME"을 선택해야 하며, A 레코드나 다른 타입을 선택하면 터널과 연결되지 않습니다. Name 항목에는 서브도메인만 입력하면 되는데, 예를 들어 host.yourdomain.com으로 접속하고 싶다면 "host"만 입력합니다.
Target 항목이 가장 중요한 부분인데, 여기에는 터널 ID 뒤에 .cfargotunnel.com을 붙인 값을 입력해야 합니다. 예를 들어 터널 ID가 abc123def-456-789-ghi-jkl012mno345라면 Target은 abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com이 됩니다. 주의할 점은 마지막 .cfargotunnel.com 부분을 절대 빠뜨리면 안 된다는 것입니다. 이 부분이 없으면 Cloudflare가 어느 터널로 연결해야 할지 알 수 없습니다.
Proxy 상태는 반드시 "Proxied" (주황색 구름 아이콘)로 설정해야 합니다. 이것은 Cloudflare를 통해 트래픽을 프록시한다는 의미로, 터널이 작동하려면 필수입니다. 만약 "DNS only" (회색 구름)로 설정하면 Cloudflare가 단순히 DNS 조회만 제공하고 터널 연결은 시도하지 않으므로 접속이 불가능합니다. TTL은 "Auto"로 두면 Cloudflare가 자동으로 관리합니다.
[DNS 레코드 추가 양식]
Type: CNAME
Name: obsidian
Target: abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com
Proxy status: Proxied (주황색 구름)
TTL: Auto
모든 항목을 정확히 입력했다면 "저장" 버튼을 클릭합니다. DNS 레코드가 추가되면 레코드 목록에 새로운 항목이 나타나며, 주황색 구름 아이콘이 표시되어 있는지 확인합니다. 이제 1-2분 정도 기다리면 DNS가 전파되어 브라우저에서 도메인으로 접속할 수 있게 됩니다.
여러 서비스를 위한 DNS 레코드 일괄 추가
실제로 config.yml 파일에는 하나의 hostname이 아니라 여러 개의 서비스가 정의되어 있는 경우가 많습니다. 예를 들어 Obsidian, 개발 서버, Grafana 모니터링 대시보드 등 다양한 서비스를 하나의 터널로 운영할 수 있습니다. 이런 경우 config.yml에 정의된 모든 hostname에 대해 각각 DNS 레코드를 추가해야 합니다. 한 개라도 빠뜨리면 해당 서비스만 접속이 불가능합니다.
다음은 여러 서비스를 운영하는 config.yml 예시입니다. 이 파일에는 총 3개의 hostname이 정의되어 있으므로, Cloudflare DNS에도 3개의 CNAME 레코드를 만들어야 합니다. 각 레코드의 Name은 hostname의 서브도메인 부분이고, Target은 모두 동일한 터널 ID를 가리킵니다. 하나의 터널로 여러 서비스를 라우팅하는 것이 Cloudflare Tunnel의 강력한 기능 중 하나입니다.
# config.yml 예시
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/username/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
ingress:
- hostname: obsidian.yourdomain.com
service: http://localhost:27123
- hostname: dev.yourdomain.com
service: http://localhost:3000
- hostname: grafana.yourdomain.com
service: http://localhost:3001
- service: http_status:404
위의 config.yml에 대응하는 DNS 레코드는 다음과 같이 3개를 추가해야 합니다. 모든 레코드가 같은 터널 ID를 Target으로 가리키지만, cloudflared는 요청이 들어온 hostname을 보고 config.yml의 ingress 규칙에 따라 적절한 로컬 서비스로 라우팅합니다. 이것이 가능한 이유는 HTTP 요청의 Host 헤더를 검사하기 때문입니다.
| Name | Type | Target | Proxy |
| obsidian | CNAME | abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com | Proxied |
| dev | CNAME | abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com | Proxied |
| grafana | CNAME | abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com | Proxied |
DNS 레코드를 하나씩 추가하는 것이 번거롭다면, Cloudflare API를 사용해서 자동화할 수도 있습니다. 하지만 처음 설정할 때는 웹 인터페이스에서 수동으로 추가하면서 각 항목의 의미를 정확히 이해하는 것이 좋습니다. 나중에 서비스를 추가하거나 변경할 때도 같은 패턴을 따르면 되므로 한 번만 제대로 배워두면 계속 활용할 수 있습니다.
DNS 전파 확인 및 문제 해결
DNS 레코드를 추가한 직후에는 바로 적용되지 않을 수 있습니다. DNS는 전 세계에 분산된 수많은 서버에 정보가 복제되어야 하므로 전파에 시간이 걸립니다. Cloudflare DNS는 비교적 빠른 편이어서 보통 1-2분 이내에 전파되지만, 때로는 최대 24시간까지 걸릴 수 있습니다. DNS 전파 상태를 확인하는 방법은 여러 가지가 있으며, 터미널에서 명령어를 사용하거나 온라인 도구를 활용할 수 있습니다.
가장 간단한 확인 방법은 nslookup 명령어를 사용하는 것입니다. 터미널을 열고 nslookup obsidian.yourdomain.com을 입력하면 DNS 조회 결과가 나타납니다. 정상적으로 설정되었다면 "canonical name"으로 터널 도메인이 표시되고, 최종 IP 주소는 Cloudflare의 IP (보통 104.21.x.x 또는 172.67.x.x 대역)가 나와야 합니다. 만약 "NXDOMAIN" 오류가 나타나면 아직 DNS가 전파되지 않았거나 레코드 설정이 잘못된 것입니다.
# DNS 전파 확인 - 성공 케이스
$ nslookup obsidian.yourdomain.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
obsidian.yourdomain.com canonical name = abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com
Name: abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com
Address: 104.21.50.100
온라인 도구를 사용하면 전 세계 여러 지역에서 DNS 조회 결과를 확인할 수 있습니다. https://dnschecker.org에 접속해서 도메인을 입력하고 Type을 "CNAME"으로 선택하면, 전 세계 주요 도시의 DNS 서버에서 조회한 결과를 한눈에 볼 수 있습니다. 모든 지역에서 초록색 체크 표시가 나타나면 DNS 전파가 완료된 것입니다. 일부 지역에서만 빨간색 X가 나타난다면 조금 더 기다려야 합니다.
DNS가 정상적으로 전파되었는데도 웹사이트 접속이 안 된다면 다른 문제를 확인해야 합니다. 첫 번째로 Cloudflare SSL/TLS 설정을 확인합니다. Cloudflare 대시보드에서 SSL/TLS 메뉴로 이동하여 암호화 모드가 "Flexible"로 설정되어 있는지 확인합니다. config.yml에서 service: http://localhost:5678처럼 HTTP를 사용한다면 반드시 Flexible 모드여야 하며, Full이나 Full (strict) 모드에서는 526 오류가 발생합니다.
두 번째로 브라우저 캐시를 완전히 삭제합니다. 특히 이전에 다른 DNS 설정으로 같은 도메인을 사용했다면 브라우저가 오래된 DNS 정보를 캐시하고 있을 수 있습니다. Chrome이나 Edge에서 Ctrl + Shift + Delete를 누르고 "캐시된 이미지 및 파일"을 삭제한 다음, 시크릿 모드로 다시 접속해봅니다. 그래도 안 된다면 터널 상태를 확인합니다.
# 터널 상태 확인 (Mac/Linux)
$ cloudflared tunnel info mac-home
# Synology NAS의 경우 cloudflared 로그 확인
$ sudo docker logs cloudflared | grep "Registered tunnel"
# 정상 출력 예시 (4개 연결 모두 등록됨)
# INF Registered tunnel connection connIndex=0 location=ICN
# INF Registered tunnel connection connIndex=1 location=ICN
# INF Registered tunnel connection connIndex=2 location=ICN
# INF Registered tunnel connection connIndex=3 location=ICN
마지막으로 자주 하는 실수 몇 가지를 확인합니다. DNS Target에 .cfargotunnel.com을 빠뜨리지 않았는지, Proxy가 "Proxied" (주황색)로 설정되어 있는지, Type이 CNAME인지 체크합니다. 이 세 가지만 제대로 설정되어 있으면 대부분의 문제는 해결됩니다. 그래도 해결되지 않는다면 Cloudflare Community나 Discord에서 도움을 요청할 수 있습니다.
[i] DNS 전파 시간 단축 팁
Cloudflare의 TTL을 "Auto"로 설정하면 기본값이 300초(5분)입니다. 테스트 단계에서는 레코드를 추가한 후 5분 정도 기다렸다가 확인하는 것이 좋습니다. 급하다면 브라우저 캐시뿐만 아니라 운영체제의 DNS 캐시도 플러시해야 합니다. Mac에서는 sudo dscacheutil -flushcache, Windows에서는 ipconfig /flushdns 명령어를 사용합니다.
DNS 레코드 설정은 Cloudflare Tunnel을 완성하는 마지막이자 가장 중요한 단계입니다. Zero Trust UI 방식은 DNS를 자동으로 생성해주지만, 터미널 방식은 사용자가 직접 CNAME 레코드를 추가해야 합니다. 터널 ID를 정확히 확인하고, Cloudflare 대시보드에서 올바른 Type과 Target으로 레코드를 추가하며, Proxy를 반드시 "Proxied"로 설정하는 것이 핵심입니다. config.yml의 모든 hostname마다 DNS 레코드를 추가해야 하며, 하나라도 빠뜨리면 해당 서비스는 접속할 수 없습니다.
DNS 전파는 보통 1-2분 내에 완료되지만 최대 24시간까지 걸릴 수 있으므로 인내심을 가지고 기다려야 합니다. nslookup이나 dnschecker.org 같은 도구로 전파 상태를 확인하고, 문제가 발생하면 SSL 모드와 브라우저 캐시를 먼저 확인합니다. 이 챕터에서 배운 내용을 따라 했다면 이제 터널을 통해 안전하고 편리하게 홈 서버에 접속할 수 있을 것입니다.
10. 서비스로 등록하여 자동 실행 설정
터미널에서 수동으로 cloudflared를 실행하는 것은 테스트에는 적합하지만, Mac을 재시작할 때마다 다시 실행해야 하는 번거로움이 있습니다. 이를 해결하기 위해 cloudflared를 macOS의 시스템 서비스로 등록하면 자동으로 시작되도록 설정할 수 있습니다.
macOS는 launchd라는 서비스 관리 시스템을 사용하며, cloudflared는 이를 지원하는 명령어를 제공합니다.
서비스 설치는 한 번의 명령으로 간단하게 완료됩니다. 이 명령을 실행하면 cloudflared가 시스템 서비스로 등록되며, Mac이 부팅될 때 자동으로 시작됩니다. 관리자 권한이 필요하므로 sudo를 사용해야 하며, 비밀번호 입력이 요구됩니다.
# 서비스로 설치
sudo cloudflared service install
설치가 완료되면 서비스를 수동으로 시작할 수 있습니다. 이후 Mac을 재시작하더라도 자동으로 터널이 실행됩니다. 터미널을 닫아도 백그라운드에서 계속 실행되므로 안정적인 운영이 가능합니다.
# 서비스 시작
sudo launchctl start com.cloudflare.cloudflared
# 서비스 상태 확인
sudo launchctl list | grep cloudflared
>> 1062 1 com.cloudflare.cloudflared
서비스 상태를 확인했을 때 프로세스 ID가 표시되면 정상적으로 실행 중인 것입니다. 만약 서비스를 중지하거나 삭제해야 할 경우에는 다음 명령어를 사용할 수 있습니다.
# 서비스 중지
sudo launchctl stop com.cloudflare.cloudflared
# 서비스 제거
sudo cloudflared service uninstall
서비스로 실행 중인 cloudflared의 로그를 확인하려면 시스템 로그 파일을 확인해야 합니다. macOS는 서비스 로그를 /Library/Logs/ 디렉토리에 저장하며, 에러가 발생했을 때 문제를 진단하는 데 유용합니다.
# 에러 로그 확인
sudo tail -f /Library/Logs/com.cloudflare.cloudflared.err.log
# 표준 출력 로그 확인
sudo tail -f /Library/Logs/com.cloudflare.cloudflared.out.log
설정 파일을 수정한 후에는 서비스를 재시작해야 변경사항이 적용됩니다. 단순히 중지 후 시작하거나, 서비스를 재설치하는 방법도 있습니다. 설정 파일 경로나 터널 ID를 변경한 경우에는 반드시 재시작이 필요합니다.
[!] launchd란? macOS와 iOS에서 사용하는 시스템 서비스 관리 도구입니다. Windows의 서비스 관리자, Linux의 systemd와 유사한 역할을 수행합니다.
11. Zero Trust UI로 터널 생성하기
Zero Trust는 Cloudflare가 제공하는 통합 보안 플랫폼으로, Access 정책을 통한 접근 제어뿐만 아니라 터널 생성과 관리까지 웹 UI에서 모두 처리할 수 있습니다. 초보자에게는 터미널에서 복잡한 명령어를 입력하는 것보다 Zero Trust 대시보드에서 클릭 몇 번으로 터널을 설정하는 것이 훨씬 직관적이고 쉽습니다. 이 방법을 사용하면 config.yml 파일을 직접 편집할 필요도 없으며, 모든 설정을 시각적인 인터페이스에서 관리할 수 있습니다. 터미널 작업은 단 한 번, 간단한 토큰 등록만으로 끝나고 나머지는 모두 웹 브라우저에서 처리합니다.
Zero Trust 대시보드 접근하기
Zero Trust 대시보드에 접근하는 방법은 두 가지가 있습니다.
첫 번째는 Cloudflare 메인 대시보드에서 접근하는 방법입니다. cloudflare.com에 로그인한 후 왼쪽 사이드바에서 "Zero Trust" 메뉴를 클릭하면 Zero Trust 대시보드로 이동합니다. 처음 접속하는 경우 팀 이름(Team Name)을 설정하는 화면이 나타나는데, 이는 나중에 변경할 수 없으므로 신중하게 입력해야 합니다. 팀 이름은 영문 소문자, 숫자, 하이픈만 사용할 수 있으며, 'my-team', 'personal-cloud' 같은 형식으로 입력합니다.
두 번째 방법은 직접 URL로 접근하는 방법입니다. 브라우저에서 https://one.dash.cloudflare.com을 입력하면 바로 Zero Trust 대시보드로 이동합니다. 이미 팀 이름을 설정한 경우에는 https://one.dash.cloudflare.com/<팀이름>으로 직접 접근할 수도 있습니다. Zero Trust 대시보드는 Cloudflare 메인 대시보드와는 별도의 인터페이스이므로 처음에는 약간 혼란스러울 수 있지만, 한 번 익숙해지면 훨씬 강력한 기능을 제공합니다.
[!] Team Name이란? Zero Trust 서비스를 사용하기 위한 고유한 조직 식별자입니다. 한 번 설정하면 변경할 수 없으므로 개인 사용자는 'personal' 또는 본인 이름을 사용하는 것이 좋습니다.
Zero Trust에서 터널 생성하기 (UI 방식)
터미널 명령어 없이 웹 UI만으로 터널을 생성하는 방법을 단계별로 살펴보겠습니다. 이 방식은 config.yml 파일을 직접 작성할 필요가 없어 초보자에게 매우 적합합니다.
1단계 | Networks > Connector 메뉴로 이동
Zero Trust 대시보드에 접속한 후 왼쪽 사이드바를 확인합니다. 메뉴 구조는 다음과 같습니다.

왼쪽 사이드바에서 "Networks" 메뉴를 클릭하면 하위 메뉴가 펼쳐집니다. 그중에서 "Connector"를 선택합니다. 처음 접속하는 경우 "You don't have any tunnels yet" 메시지와 함께 빈 화면이 표시됩니다.
2단계 | Create a tunnel 시작
화면 오른쪽 상단 또는 중앙부의 파란색 "Create a tunnel (+터널 생성)" 버튼을 클릭합니다. 터널 생성 방식을 선택하는 화면이 나타나며, 두 가지 옵션이 제공됩니다.
옵션 1: Cloudflared (권장)
- 가장 일반적인 방식으로, Mac이나 서버에 cloudflared를 설치하는 방법입니다
- 안정적이고 모든 기능을 지원합니다
- 이 가이드에서는 이 방식을 사용합니다
옵션 2: WARP Connector
- 모바일 기기나 전체 네트워크를 연결할 때 사용하는 방식입니다
- 일반적인 웹 서비스 노출에는 적합하지 않습니다
"Cloudflared"를 선택하고 "Next" 버튼을 클릭합니다.
3단계 | 터널 이름 설정
터널의 이름을 입력하는 화면이 나타납니다. 여기서 입력하는 이름은 나중에 터널을 식별하는 데 사용되므로 의미 있는 이름을 지정하는 것이 좋습니다.
터널 이름 예시:
- mac-home: 집에 있는 Mac
- development-server: 개발 서버
- personal-services: 개인 서비스들
- office-mac: 사무실 Mac
터널 이름은 영문 소문자, 숫자, 하이픈만 사용할 수 있으며, 공백은 사용할 수 없습니다. 이름을 입력한 후 "Save tunnel" 버튼을 클릭합니다.
4단계 | Connector 설치 (Mac 설정)
터널이 생성되면 다양한 운영체제별 설치 방법이 표시됩니다. Mac을 선택하면 설치 명령어가 자동으로 생성됩니다.
화면에 표시되는 내용:

"커넥터 설치 및 실행" 섹션에 있는 긴 문자열이 바로 터널 토큰입니다. 이 토큰 하나로 터널 ID, 인증 정보, Cloudflare 서버 주소 등 모든 필요한 정보가 포함되어 있습니다. 터미널에서 복잡한 config.yml 파일을 작성할 필요 없이 이 명령어 한 줄만 실행하면 됩니다.
Mac에서 실행할 작업:
- 터미널을 엽니다
- cloudflared가 설치되어 있지 않다면 먼저 설치합니다:
brew install cloudflare/cloudflare/cloudflared
- 화면에 표시된 sudo cloudflared service install 명령어 전체를 복사합니다
- 터미널에 붙여넣고 Enter를 누릅니다
- 관리자 비밀번호를 입력합니다
명령어가 성공적으로 실행되면 다음과 같은 메시지가 표시됩니다:
INFO Installing Cloudflare Tunnel as a system service...
INFO Successfully installed service to launch on system startup
이제 cloudflared가 macOS 서비스로 등록되어 Mac이 부팅될 때 자동으로 시작됩니다. "Next" 버튼을 클릭하여 다음 단계로 진행합니다.
[!] Service Install이란? cloudflared를 시스템 서비스로 등록하여 Mac 재부팅 시 자동으로 실행되도록 하는 것입니다. launchd라는 macOS 서비스 관리자가 이를 담당합니다.
5단계 | Public Hostname 추가 (라우팅 설정)
이제 가장 중요한 단계인 라우팅 설정입니다. 어떤 도메인으로 들어오는 요청을 Mac의 어떤 서비스로 연결할지 지정하는 단계입니다.
화면 구성 - 게시된 응용 프로그램 경로:

Public Hostname 섹션:
- Subdomain: 원하는 서브도메인을 입력합니다. 외부에서 웹브라우저 주소창에 입력하는 호스트명이라고 생각하면 쉽습니다. (예: mac, app, dev)
- Domain: 드롭다운에서 Cloudflare에 등록된 도메인을 선택합니다. 도메인을 등록하고 DNS설정을 변경하는 것은 " 8. 커스텀 도메인으로 전문적인 서비스 구축하기" 챕터를 참고해주세요.
- 도메인이 없는 경우: 이 섹션을 건너뛰고 나중에 설정할 수 있습니다
- 무료 cfargotunnel.com 사용 방법은 아래 참조
Service 섹션:
- Type: 서비스 프로토콜을 선택합니다
- HTTP: 일반 웹 서비스 (가장 흔함)
- HTTPS: SSL이 적용된 로컬 서비스
- TCP: 데이터베이스 등 TCP 기반 서비스
- SSH: SSH 서버
- RDP: Windows 원격 데스크톱
- URL: Mac에서 실행 중인 내부 서비스로 외부에 연결할 주소를 입력합니다. 내부 서비스가 연결된 포트번호가 중요합니다.
- 형식: localhost:포트번호 또는 127.0.0.1:포트번호
- 예시:
- localhost:8080 - 간단한 웹 서버
- localhost:5678 - n8n
- localhost:3000 - React 개발 서버
- localhost:8000 - Python Django
설정 예시 1: 간단한 웹 서버 : Python으로 구성된 간단한 웹서버를 시작하시면 됩니다.
Python으로 간단한 웹서버를 띄우는 방법을 코드 블럭으로 보여드리겠습니다.
# Python 3의 내장 HTTP 서버 실행
# 터미널에서 실행
python3 -m http.server 8080
# 또는 기본 포트 8000 사용
python3 -m http.server
# 특정 디렉토리를 웹 서버로 서빙
# 현재 위치가 아닌 다른 폴더를 서빙하고 싶을 때
cd /path/to/your/folder
python3 -m http.server 8080
# 특정 IP 주소에 바인딩 (기본은 0.0.0.0)
python3 -m http.server 8080 --bind 127.0.0.1
간단한 샘플페이지를 만들어서 웹서버를 동작해 볼 수도 있습니다.
# Python 스크립트로 커스텀 웹 서버 만들기
# simple_server.py 파일로 저장하고 실행
from http.server import HTTPServer, SimpleHTTPRequestHandler
class MyHandler(SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b"""
<html>
<head><title>Test Server</title></head>
<body>
<h1>Cloudflare Tunnel Test</h1>
<p>This is a simple Python web server!</p>
<p>Current time: """ + str(self.date_time_string()).encode() + b"""</p>
</body>
</html>
""")
else:
super().do_GET()
# 서버 시작
server = HTTPServer(('localhost', 8080), MyHandler)
print("Server running on http://localhost:8080")
print("Press Ctrl+C to stop")
server.serve_forever()
사용법:
# 간단한 방법 (현재 폴더 서빙)
python3 -m http.server 8080
# 커스텀 서버 실행
python3 simple_server.py
# 브라우저에서 테스트
# http://localhost:8080
# 실행결과 : 아래와 같은 문자가 브라우저에 나타납니다
Cloudflare Tunnel Test
This is a simple Python web server!
Current time: Thu, 22 Jan 2026 13:52:39 GMT
설정 예시 2: n8n 자동화 도구
Subdomain: n8n
Domain: yourdomain.com
Type: HTTP
URL: localhost:5678
결과: https://n8n.yourdomain.com → http://localhost:5678
모든 정보를 입력한 후 "Save tunnel" 버튼을 클릭합니다.
6단계 | 터널 상태 확인
설정이 완료되면 Tunnels 목록 페이지로 돌아가며, 방금 생성한 터널이 표시됩니다.

Cloudflare는 안정성을 위해 여러 개의 중복 연결을 유지합니다.
무료 cfargotunnel.com 도메인 사용하기 (UI 방식)
커스텀 도메인이 없어도 Cloudflare가 제공하는 무료 도메인을 사용할 수 있습니다. Zero Trust UI에서는 Public Hostname을 추가하지 않고 터널만 생성하면 자동으로 무료 도메인이 할당됩니다.
cfargotunnel.com 도메인 확인하기
터널을 생성하고 Public Hostname을 추가하지 않은 상태에서:
- Networks → Tunnels 메뉴로 이동
- 생성한 터널 이름을 클릭하여 상세 페이지로 이동
- 상단에 표시되는 "Tunnel ID"를 확인합니다
Tunnel Details
─────────────────────────────────────
Name: mac-home
Tunnel ID: abc123def-456-789-ghi-jkl012mno345
Status: ● HEALTHY
무료 도메인 형식:
https://<Tunnel-ID>.cfargotunnel.com
예시:
https://abc123def-456-789-ghi-jkl012mno345.cfargotunnel.com
이 URL로 접속하면 Mac의 localhost:8080(또는 설정한 포트)에 바로 연결됩니다. 별도의 DNS 설정 없이 즉시 사용 가능하며, 영구적으로 유지됩니다.
UI에서 여러 서비스 추가하기
하나의 터널로 여러 서비스를 동시에 운영할 수 있습니다. 터미널에서 config.yml의 ingress 규칙을 추가하는 것과 동일한 작업을 UI에서 수행합니다.
Public Hostname 추가 방법
- Networks → Tunnels 메뉴로 이동
- 터널 이름을 클릭하여 상세 페이지로 이동
- "Public Hostname(게시된 응용 프로그램 경로)" 탭을 선택
- 오른쪽 상단의 "Add a public hostname(게시된 응용 프로그램 경로 추가)" 버튼 클릭
여러 서비스 설정 예시:

각 Public Hostname을 추가할 때마다 "Save hostname" 버튼을 클릭합니다. 모든 설정은 즉시 적용되며, cloudflared를 재시작할 필요가 없습니다. 하나의 터널이 생성되면 그 터널을 이용해서 다양한 서비스를 추가적으로 연결할 수 있습니다. 하나의 서비스에 하나의 터털을 연결하게되면, 관리의 문제가 발생할 수 있습니다.
UI에서 터널 수정 및 관리
Zero Trust UI의 가장 큰 장점은 터널 설정을 실시간으로 수정할 수 있다는 것입니다. 터널을 수정하고 싶으시면 '터널ID'를 선택하시고, 세부적인 서비스를 수정하고 싶으면 '생성된 서비스 프로그램 경로'를 선택하시면 '수정/편집'이 가능한 창으로 이동하고, 생성때와 동일하게 내용을 수정하고 저장하시면 됩니다.
마이그레이션 가이드
시나리오 1 | 터미널 방식 → UI 하이브리드 방식
이미 터미널에서 cloudflared tunnel create로 터널을 생성하고 config.yml을 작성한 경우 기존 터미널 방식으로 생성한 터널도 Zero Trust UI에 자동으로 표시됩니다. config.yml은 유지하되, ingress 규칙만 UI로 옮길 수 있습니다.
기존 터널을 UI에서 관리하기
config.yml로 생성한 터널도 Zero Trust UI에 표시됩니다.
- Networks → Tunnels 메뉴로 이동
- 기존 터널이 목록에 표시됨
- 터널 클릭 → "Public Hostname" 탭
- "Add a public hostname" 버튼으로 추가 서비스 설정
주의사항:
- config.yml과 UI 설정이 병합됩니다
- config.yml의 ingress 규칙이 우선순위가 높습니다
- 충돌 시 config.yml이 적용됩니다
config.yml을 최소화하고 UI로 전환
UI에서만 관리하려면 config.yml의 ingress 섹션을 제거합니다.
- 기존 config.yml 백업:
cp ~/.cloudflared/config.yml ~/.cloudflared/config.yml.backup
- config.yml을 최소화:
# ~/.cloudflared/config.yml
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/사용자명/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
# ingress 섹션 삭제 - UI에서 관리
- cloudflared 재시작:
sudo launchctl stop com.cloudflare.cloudflared
sudo launchctl start com.cloudflare.cloudflared
- Zero Trust UI에서 Public Hostname 추가
이제 모든 라우팅 설정을 UI에서만 관리할 수 있습니다.
시나리오 2 | 순수 토큰 방식 사용 중
Zero Trust UI에서 터널을 생성하고 sudo cloudflared service install <토큰> 명령으로 설치한 경우
이 경우 config.yml 파일이 전혀 생성되지 않습니다. 모든 설정이 토큰에 포함되어 있고, Public Hostname은 Cloudflare 서버에 저장됩니다.
파일 구조
# config.yml 없음
~/.cloudflared/ ← 이 폴더 자체가 없음
# sudo find /Library/LaunchDaemons -name "*cloudflare*" 2>/dev/null ✔ │ 21:58:01
# Password:
/Library/LaunchDaemons/com.cloudflare.cloudflared.plist
# 토큰은 launchd plist에 저장
/Library/LaunchDaemons/com.cloudflare.cloudflared.plist
# 또는
~/Library/LaunchAgents/com.cloudflare.cloudflared.plist
토큰 확인 방법
# 실행 중인 프로세스에서 토큰 확인
ps aux | grep cloudflared | grep -v grep
# plist 파일에서 토큰 확인
sudo cat /Library/LaunchDaemons/com.cloudflare.cloudflared.plist
이 방식의 특징
- config.yml 불필요 - 파일이 생성되지 않음
- 토큰에 모든 정보 포함 - 터널 ID, 인증 정보, 엔드포인트
- UI에서만 관리 - Public Hostname 설정은 웹에서만
- 마이그레이션 불필요 - 처음부터 UI 방식
시나리오 3 | 순수 토큰 방식 → config.yml 방식 전환 (역방향)
토큰 방식을 사용 중이지만, config.yml로 세밀한 제어를 원하는 경우 (고급 사용자)
토큰 방식은 편리하지만, 고급 설정(복잡한 originRequest, 조건부 라우팅 등)이 필요한 경우 config.yml 방식으로 전환할 수 있습니다.
전환 절차
- 터널 ID 확인:
# 실행 중인 프로세스에서 토큰 추출
ps aux | grep cloudflared
# 또는 Zero Trust UI에서 확인
# Networks → Tunnels → 터널 클릭 → Tunnel ID 복사
- 터널 인증 파일 다운로드:
# Zero Trust에서 자격증명 다시 생성
mkdir -p ~/.cloudflared
# Tunnel 상세 페이지에서 "Connetor" 클릭
# 커넥터 목록에서 우측의 더보기(세점) 아이콘을 클릭 > 구성 > 커넥터 설치 및 실행 화면
# 또는 CLI로 재생성:
cloudflared tunnel token <tunnel-id> > ~/.cloudflared/<tunnel-id>.json
![터널 [구성] 상세보기를 통해 초기에 설치시 참조했던 TOKEN 정보를 확인할 수 있습니다](https://blog.kakaocdn.net/dna/w4yFl/dJMcafyCmIl/AAAAAAAAAAAAAAAAAAAAAMWWPudJbUU-lRco4tnaBTJI2Lyt1nmdOJst3ligJMD5/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1772290799&allow_ip=&allow_referer=&signature=SziUVLZVGv6CwHQAuNQ2u36Xdck%3D)
- config.yml 생성:
# ~/.cloudflared/config.yml
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/사용자명/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
ingress:
- hostname: service1.yourdomain.com
service: http://localhost:8080
- hostname: service2.yourdomain.com
service: http://localhost:3000
originRequest:
connectTimeout: 30s
noTLSVerify: true
- service: http_status:404
- 서비스 재설치:
# 기존 토큰 기반 서비스 제거
sudo launchctl unload /Library/LaunchDaemons/com.cloudflare.cloudflared.plist
sudo rm /Library/LaunchDaemons/com.cloudflare.cloudflared.plist
# config.yml 기반으로 재설치
sudo cloudflared service install
- 서비스 시작:
sudo launchctl start com.cloudflare.cloudflared
# 로그 확인
sudo tail -f /Library/Logs/com.cloudflare.cloudflared.err.log
방식 선택 가이드
순수 토큰 방식 추천 대상:
- Cloudflare Tunnel 초보자
- 소수의 서비스만 운영 (1-5개)
- 웹 UI 선호
- 복잡한 설정 불필요
- 빠른 설정 변경 필요
config.yml 방식 추천 대상:
- 고급 사용자 또는 개발자
- 다수의 서비스 통합 관리 (10개 이상)
- Git으로 설정 버전 관리 필요
- 복잡한 originRequest 설정 필요
- Infrastructure as Code 선호
- 자동화 스크립트 작성
하이브리드 방식 추천 대상:
- 기존 config.yml 사용자가 UI의 편리함을 원하는 경우
- 일부 서비스는 복잡한 설정, 나머지는 간단한 경우
- 점진적 전환을 원하는 경우
마이그레이션의 필요성:
- 토큰 방식 사용 중 → 마이그레이션 불필요 (이미 UI 방식)
- config.yml 방식 사용 중 → UI로 마이그레이션 선택 가능
- 고급 기능 필요 → config.yml로 전환 고려
대부분의 사용자는 순수 토큰 방식만으로 충분하며, 이 경우 config.yml을 전혀 만질 필요가 없습니다. Zero Trust UI에서 모든 것을 관리할 수 있습니다.
문제 해결 | UI 방식 사용 시 발생할 수 있는 문제들입니다.
터널 상태가 DOWN으로 표시됨
증상: Zero Trust UI에서 터널이 빨간색 DOWN 상태
원인 및 해결:
# 1. cloudflared 서비스 상태 확인
sudo launchctl list | grep cloudflared
# 2. 서비스가 없는 경우 다시 설치
sudo cloudflared service install <토큰>
# 3. 서비스가 있지만 작동하지 않는 경우 재시작
sudo launchctl stop com.cloudflare.cloudflared
sudo launchctl start com.cloudflare.cloudflared
# 4. 로그 확인
sudo tail -f /Library/Logs/com.cloudflare.cloudflared.err.log
Public Hostname을 추가했는데 접속 안됨
증상: 502 Bad Gateway 오류
원인 및 해결:
- Mac에서 해당 포트의 서비스가 실행 중인지 확인:
lsof -i :8080 # 8080은 예시, 실제 포트 번호 사용
- localhost 대신 127.0.0.1 사용 시도:
- UI에서 URL을 127.0.0.1:8080으로 변경
- 서비스가 localhost가 아닌 0.0.0.0에서 리스닝하는지 확인
Access 로그인 화면이 무한 반복됨
증상: 인증 후 계속 로그인 화면으로 돌아감
원인: 브라우저 쿠키 차단
해결:
- 브라우저 설정에서 쿠키 허용 확인
- 시크릿/프라이빗 모드 종료
- *.cloudflareaccess.com 도메인 쿠키 허용
- 브라우저 캐시 및 쿠키 삭제 후 재시도
이메일 OTP 코드가 오지 않음
원인 및 해결:
- 스팸 폴더 확인
- 이메일 주소 오타 확인
- Cloudflare 이메일(no-reply@cloudflareaccess.com) 수신 허용 설정
- 5분 후 다시 시도 (이전 코드 만료)
12. Zero Trust로 보안 강화하기
이제 Zero Trust UI를 활용하여 터널을 생성하고, 여러 서비스를 관리하며, Access 정책으로 보안을 강화하는 모든 과정을 웹 브라우저에서 완료할 수 있습니다. 초보자도 복잡한 터미널 명령어 없이 안전하고 전문적인 홈 서버를 구축할 수 있으며, UI의 직관적인 인터페이스 덕분에 설정 실수를 줄이고 빠르게 문제를 해결할 수 있습니다.
Cloudflare Tunnel을 통해 Mac의 서비스를 외부에 노출했다면, 이제 누가 접근할 수 있는지를 제어하는 것이 중요합니다. 기본적으로 터널을 통해 공개된 서비스는 URL을 아는 누구나 접근할 수 있습니다. n8n이나 Portainer 같은 관리 도구는 민감한 정보를 포함하고 있으므로, 추가적인 인증 계층이 필요합니다. 이때 사용하는 것이 Cloudflare Zero Trust의 Access 기능입니다.
Zero Trust와 Cloudflare Access 개념
Zero Trust는 "신뢰하지 말고 항상 검증하라"는 보안 원칙에 기반한 접근 방식입니다. 전통적인 VPN은 네트워크 내부에 있으면 모든 리소스에 접근할 수 있지만, Zero Trust는 매번 사용자와 디바이스를 검증합니다. Cloudflare Access는 이 원칙을 구현한 서비스로, 애플리케이션 앞단에 인증 계층을 추가하여 승인된 사용자만 접근할 수 있도록 합니다.
Cloudflare의 무료 플랜에서는 최대 50명의 사용자를 관리할 수 있으며, 개인 프로젝트나 소규모 팀에서 사용하기에 충분합니다. 이메일 OTP, Google OAuth, GitHub OAuth 등 다양한 인증 방식을 지원하며, 특정 이메일 도메인이나 IP 주소를 기준으로 접근을 제어할 수 있습니다. 모든 접근 시도는 로그로 기록되어 감사(Audit) 목적으로 활용할 수 있습니다.
Zero Trust 대시보드 접근 및 설정
Cloudflare 대시보드에 로그인한 후 왼쪽 메뉴에서 "Zero Trust"를 클릭합니다. 처음 접근하는 경우 팀 이름을 설정하는 화면이 나타납니다. 팀 이름은 인증 URL에 사용되므로 식별하기 쉬운 이름으로 설정합니다. 예를 들어 'my-team'으로 설정하면 인증 URL은 https://my-team.cloudflareaccess.com이 됩니다.
Zero Trust 대시보드에 진입했다면 왼쪽 메뉴에서 "Access" → "Applications"로 이동합니다. "Add an application" 버튼을 클릭하고 "Self-hosted" 옵션을 선택합니다. Self-hosted는 Cloudflare Tunnel을 통해 접근하는 자체 호스팅 애플리케이션을 의미합니다.
Application 생성 및 설정
Application 설정 화면에서 다음 항목들을 입력합니다. Application name은 관리 목적으로 사용되는 이름이므로 'My n8n', 'Development Server' 같이 알아보기 쉽게 작성합니다. Session Duration은 인증 후 재인증 없이 접근할 수 있는 시간으로, 기본값은 24시간입니다. 보안이 중요한 서비스는 더 짧게, 편의성이 중요한 서비스는 더 길게 설정할 수 있습니다.
Application domain 섹션에서는 보호할 도메인을 지정합니다. Subdomain에 'n8n'을, Domain에 'yourdomain.com'을 입력하면 n8n.yourdomain.com이 보호 대상이 됩니다. 여러 서브도메인을 보호하려면 각각에 대해 별도의 Application을 생성해야 합니다. Path는 특정 경로만 보호하고 싶을 때 사용하며, 일반적으로는 비워둡니다.
Application 설정 예시:
- Name: My n8n Server
- Session Duration: 24 hours
- Application domain:
- Subdomain: n8n
- Domain: yourdomain.com
- Path: (비워둠)
Access Policy 구성하기
Application을 생성한 후에는 누가 접근할 수 있는지를 정의하는 Policy를 설정해야 합니다. Policy는 Allow(허용), Deny(거부), Bypass(인증 생략) 세 가지 액션으로 구성됩니다. 가장 기본적인 설정은 특정 이메일 주소만 허용하는 것입니다.
Policy name에는 'Allow my email' 같은 설명적인 이름을 입력합니다. Action은 'Allow'를 선택하고, Include 규칙에서 Selector를 'Emails'로 선택한 후 본인의 이메일 주소를 입력합니다. 여러 이메일을 추가하려면 'Add include' 버튼을 눌러 추가할 수 있습니다.
# Policy 설정 예시
Policy name: Allow my email
Action: Allow
Session duration: 24 hours
Include 규칙:
- Selector: Emails
Value: myemail@gmail.com
더 고급 설정으로는 이메일 도메인 기반 제어도 가능합니다. 예를 들어 회사 이메일을 사용하는 모든 직원에게 접근 권한을 주려면 'Emails ending in'을 선택하고 '@company.com'을 입력합니다. Exclude 규칙을 추가하면 특정 사용자나 국가를 차단할 수도 있습니다.
인증 방식 설정하기
Policy를 저장하면 인증 방식을 선택하는 화면이 나타납니다. Cloudflare Access는 여러 Identity Provider를 지원하며, 가장 간단한 방식은 이메일 OTP(One-Time PIN)입니다. 사용자가 이메일 주소를 입력하면 6자리 인증 코드가 발송되고, 이를 입력하면 인증이 완료됩니다.
Zero Trust 대시보드의 "Settings" → "Authentication" → "Login methods"로 이동하여 "One-time PIN"이 활성화되어 있는지 확인합니다. 기본적으로 활성화되어 있지만, 비활성화되어 있다면 토글 버튼을 켜줍니다.
Google OAuth를 사용하려면 Google Cloud Console에서 OAuth 2.0 클라이언트를 생성해야 합니다. "Add new" 버튼을 클릭하고 "Google"을 선택한 후, Google에서 발급받은 Client ID와 Client Secret을 입력합니다. Authorized redirect URI는 Cloudflare가 자동으로 제공하는 URL을 Google Cloud Console에 등록해야 합니다.
지원되는 인증 방식:
- One-time PIN (이메일 OTP) - 가장 간단
- Google OAuth - Google 계정 연동
- GitHub OAuth - GitHub 계정 연동
- Microsoft Azure AD - 기업용
- Okta, LinkedIn, Facebook 등
Tunnel 설정에 Access 연동하기
Access Application을 생성했다면 이제 터널 설정에 반영해야 합니다. CLI 방식으로 터널을 운영하는 경우 config.yml 파일을 수정합니다. Access를 적용하려면 Application의 AUD(Audience) Tag를 확인해야 합니다.
Zero Trust 대시보드 → Access → Applications에서 생성한 Application을 클릭하고, Overview 탭에서 "Application Audience (AUD) Tag"를 복사합니다. 이 값은 고유한 해시 문자열로, Access 인증을 위해 필요합니다.
# ~/.cloudflared/config.yml
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/사용자명/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
ingress:
- hostname: n8n.yourdomain.com
service: http://localhost:5678
originRequest:
access:
required: true
teamName: my-team
audTag: abc123defghijklmn456789opqrst
- hostname: public.yourdomain.com
service: http://localhost:8080
- service: http_status:404
위 설정에서 n8n.yourdomain.com은 Access 인증이 필요하고, public.yourdomain.com은 인증 없이 접근할 수 있습니다. 설정 파일을 수정한 후에는 cloudflared 서비스를 재시작해야 합니다.
# 서비스 재시작
sudo launchctl stop com.cloudflare.cloudflared
sudo launchctl start com.cloudflare.cloudflared
사용자 경험 및 접근 테스트
모든 설정이 완료되었다면 실제로 접근을 테스트해봅니다. 브라우저에서 https://n8n.yourdomain.com에 접속하면 Cloudflare Access 로그인 페이지로 자동 리다이렉트됩니다. 이메일 주소를 입력하고 "Send me a code" 버튼을 클릭하면 등록된 이메일로 6자리 인증 코드가 발송됩니다.
인증 코드를 입력하면 Cloudflare는 Policy를 확인하여 접근 권한이 있는지 검증합니다. 인증에 성공하면 세션 쿠키가 발급되어 설정한 Session Duration 동안 재인증 없이 접근할 수 있습니다. 인증 실패 시에는 접근이 거부되며, 이 모든 시도는 Access Logs에 기록됩니다.
Zero Trust 대시보드 → Logs → Access에서 모든 인증 시도를 확인할 수 있습니다. 시간, 사용자 이메일, Application 이름, 결과(Allow/Deny), IP 주소, 국가, 디바이스 정보 등이 상세히 기록되어 보안 감사에 활용할 수 있습니다.
13. 방화벽과 포트포워딩 설정이 필요 없는 이유
많은 사용자들이 원격 접근을 설정할 때 방화벽 규칙 추가나 공유기 포트포워딩이 필수라고 생각합니다. 하지만 Cloudflare Tunnel의 가장 큰 장점 중 하나는 이러한 설정이 전혀 필요 없다는 것입니다. 이는 Cloudflare Tunnel의 독특한 작동 방식 덕분이며, 보안과 편의성을 동시에 확보할 수 있는 핵심 이유입니다.
기존 포트포워딩 방식의 문제점
전통적인 원격 접근 방식에서는 외부에서 집 안의 Mac으로 직접 연결하기 위해 공유기에서 포트포워딩을 설정해야 합니다. 예를 들어 외부의 80번 포트 요청을 Mac의 8080번 포트로 전달하는 식입니다. 이 경우 Mac이 인터넷에 직접 노출되어 보안 위험이 증가하며, 공유기 관리자 페이지 접근 권한이 필요하고, 포트 충돌 문제도 발생할 수 있습니다.
[기존 방식]
인터넷 --> 공유기(80포트 포워딩) --> Mac(8080포트 오픈) --> 서비스
^^^^^^^^^^^^^^^^^^^^^^
보안 취약점 발생 지점
Cloudflare Tunnel의 역방향 연결 방식
Cloudflare Tunnel은 정반대의 접근 방식을 사용합니다. Mac에서 먼저 Cloudflare 서버로 아웃바운드 연결을 시도합니다. 이는 우리가 웹사이트를 방문하거나 이메일을 보낼 때와 같은 나가는 연결이므로, 대부분의 방화벽과 공유기에서 기본적으로 허용됩니다. Cloudflare는 이미 열려 있는 이 연결을 재사용하여 외부 요청을 Mac으로 전달합니다.
[Cloudflare Tunnel 방식]
인터넷 --> Cloudflare 서버 <-- (역방향 연결) <-- Mac의 cloudflared
|
localhost:8080
실제 연결 과정을 더 자세히 살펴보면, cloudflared는 QUIC방식의 프로토콜을 사용해 병렬로 연결되는 구조를 가지고 있고, Cloudflare의 엣지 서버에 WebSocket 연결을 생성합니다. 이 연결은 암호화되어 있으며 지속적으로 유지됩니다. 외부 사용자가 설정된 도메인으로 접근하면 Cloudflare는 이미 열려 있는 WebSocket 연결을 통해 요청을 Mac으로 전달하고, Mac의 응답을 다시 사용자에게 반환합니다.
# Cloudflare Tunnel 연결 상태 확인하기
# 1. cloudflared 프로세스 확인
ps aux | grep cloudflared | grep -v grep
# 2. QUIC(UDP) 연결 확인
sudo lsof -p $(pgrep cloudflared) | grep UDP
# 출력 예시:
# cloudflar 1062 root 10u IPv4 UDP *:50747
# cloudflar 1062 root 11u IPv4 UDP *:51799
# cloudflar 1062 root 12u IPv4 UDP *:63846
# cloudflar 1062 root 13u IPv4 UDP *:62534
# 3. 메트릭 포트 확인
sudo lsof -p $(pgrep cloudflared) | grep LISTEN
# 출력 예시:
# cloudflar 1062 root 9u IPv4 TCP localhost:20241 (LISTEN)
# 4. 메트릭 데이터 확인 (터널 상태)
curl http://localhost:20241/metrics | grep cloudflared_tunnel
# 5. 연결 수 확인
curl http://localhost:20241/metrics | grep quic_connection
# 6. Zero Trust UI에서 시각적 확인
# Networks → Tunnels → 터널 클릭
# Status: ● HEALTHY (초록색)
# Connections: 4/4 (정상)
위 명령을 실행하면 Mac에서 Cloudflare 서버로 나가는 ESTABLISHED 연결을 확인할 수 있습니다. 이는 외부에서 Mac으로 들어오는 연결이 아니라, Mac에서 외부로 나가는 연결이므로 방화벽 설정이 필요 없습니다.
Mac 방화벽 설정 확인
Mac의 내장 방화벽이 활성화되어 있더라도 문제없이 작동합니다. cloudflared는 아웃바운드 연결만 사용하므로 인바운드 규칙에 영향을 받지 않기 때문입니다. 혹시 매우 엄격한 보안 정책으로 아웃바운드 연결까지 제한하는 환경이라면 cloudflared를 허용 목록에 추가할 수 있습니다.
# 현재 방화벽 상태 확인
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
# (선택사항) cloudflared 명시적 허용
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/local/bin/cloudflared
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /usr/local/bin/cloudflared
대부분의 일반 사용자 환경에서는 위 명령도 필요 없으며, 별도의 방화벽 설정 없이 바로 사용할 수 있습니다. 회사 네트워크처럼 프록시 서버를 거치는 환경에서도 HTTPS 트래픽이 허용된다면 정상적으로 작동합니다.
공유기 포트포워딩이 불필요한 이유
공유기 설정을 전혀 변경할 필요가 없습니다. Mac이 공유기를 통해 인터넷에 연결되어 있고, 일반적인 웹 브라우징이 가능하다면 그것만으로 충분합니다. cloudflared가 사용하는 7844번 포트는 아웃바운드 연결이므로 공유기가 자동으로 허용하며, NAT(Network Address Translation) 환경에서도 문제없이 작동합니다.
Mac의 사설 IP (192.168.x.x)
--> 공유기의 NAT
--> 인터넷
--> Cloudflare (공인 IP)
포트포워딩 설정 불필요!
이러한 방식 덕분에 다음과 같은 장점을 얻을 수 있습니다. 첫째, 공유기 관리자 비밀번호를 몰라도 설정할 수 있습니다. 둘째, 회사나 카페의 제한된 네트워크 환경에서도 사용 가능합니다. 셋째, 여러 서비스를 운영할 때 포트 충돌 걱정이 없습니다. 넷째, 동적 IP 환경에서도 DNS 업데이트 없이 항상 동일한 URL로 접근할 수 있습니다.
FAQ
Q: netstat으로 7844 포트가 안 보이는데 정상인가요?
A: 네, 정상입니다. 최신 cloudflared는 TCP 7844 포트 대신 QUIC(UDP) 프로토콜을 사용합니다. sudo lsof -p $(pgrep cloudflared) | grep UDP 명령으로 여러 개의 UDP 연결을 확인할 수 있습니다. 이는 더 빠르고 안정적인 HTTP/3 프로토콜의 일부입니다.
Q: UDP 포트가 4개나 있는데 정상인가요?
A: 네, 정상입니다. Cloudflare는 고가용성을 위해 여러 개의 병렬 연결을 유지합니다. 한 연결이 끊어져도 다른 연결이 즉시 트래픽을 처리하여 끊김 없는 서비스를 제공합니다.
Q: localhost:20241 포트는 무엇인가요?
A: 메트릭 및 상태 확인을 위한 로컬 포트입니다. curl http://localhost:20241/metrics 명령으로 Prometheus 형식의 터널 통계를 확인할 수 있습니다. 외부에서는 접근할 수 없으며, 로컬 모니터링 전용입니다.
마무리
이번 글에서는 Cloudflare Tunnel의 기본 개념부터 실제 설정, 커스텀 도메인 구성, 그리고 Zero Trust를 통한 보안 강화까지 모든 과정을 살펴보았습니다. 포트포워딩이나 복잡한 방화벽 설정 없이도 Mac을 외부에서 안전하게 접근할 수 있다는 것이 Cloudflare Tunnel의 가장 큰 매력입니다. 특히 DNS 서버 이전이 어려운 환경에서도 무료 cfargotunnel.com 도메인을 사용하여 즉시 시작할 수 있습니다.
커스텀 도메인을 설정하면 전문적인 서비스 운영이 가능하며, Cloudflare의 자동 SSL 인증서와 DDoS 보호 기능을 무료로 활용할 수 있습니다. Zero Trust Access를 추가하면 이메일 OTP나 Google OAuth 같은 다양한 인증 방식으로 접근을 제어할 수 있어, n8n이나 Portainer 같은 관리 도구를 안전하게 보호할 수 있습니다. 모든 트래픽이 Cloudflare의 보안 인프라를 거치기 때문에 악성 공격으로부터 자동으로 보호받을 수 있습니다.
다음 편에서는 실전 활용 사례를 다룰 예정입니다. Obsidian Local REST API 플러그인을 활용하여 개인 노트를 외부에서 접근하는 방법, 여러 Docker 컨테이너 서비스를 효율적으로 관리하는 방법, 그리고 Synology NAS에서 Cloudflare Tunnel을 운영하여 24시간 안정적인 홈 서버를 구축하는 방법을 소개하겠습니다. 각 시나리오에 맞는 최적의 설정과 문제 해결 팁도 함께 제공할 계획입니다.
참고 자료
- Cloudflare Tunnel 공식 문서
- Cloudflare Zero Trust 문서
- cloudflared GitHub 저장소
- Cloudflare Zero Trust 대시보드
- Homebrew 공식 사이트
부록 | Zero Trust로 터널 구성된 경우 Tunnel 서비스 상태를 확인하는 방법
Zero Trust UI로 터널을 생성한 경우, 로컬에서 터널 상태를 확인하는 명령어입니다.
기본 상태 확인 명령어
실행 중인 cloudflared 프로세스 확인
# Mac/Linux
ps aux | grep cloudflared
# 출력 예시:
# root 1234 cloudflared tunnel run --token eyJ...
터널 연결 상태 확인
# 로그 실시간 확인 (Mac)
sudo tail -f /Library/Logs/com.cloudflare.cloudflared.err.log
# 또는 launchd 로그
sudo log stream --predicate 'process == "cloudflared"' --level debug
서비스 상태 확인 (launchd)
# Mac에서 서비스 상태 확인
sudo launchctl list | grep cloudflared
# 출력 예시:
# - 0 com.cloudflare.cloudflared
# ↑ PID (실행 중이면 숫자 표시)
# 상세 정보
sudo launchctl list com.cloudflare.cloudflared
Zero Trust UI 방식의 제약
중요: Zero Trust UI로 생성한 터널은 로컬에 터널 정보가 없습니다!
# cloudflared tunnel list 명령어 실행 시
$ cloudflared tunnel list
# 출력:
# (빈 결과 또는 오류)
# 이유: 터널 정보가 Cloudflare 서버에만 저장됨
# 로컬에는 토큰만 있고 터널 메타데이터 없음
```
### 왜 터널 목록이 안 보일까?
```
터미널 방식 (config.yml):
- 로컬에 터널 생성: cloudflared tunnel create
- ~/.cloudflared/에 credentials.json 저장
- cloudflared tunnel list로 조회 가능
Zero Trust UI 방식 (토큰):
- 클라우드에서 터널 생성
- 로컬에는 토큰만 저장 (launchd plist)
- cloudflared tunnel list로 조회 불가
사용 가능한 확인 방법
방법 1 | 메트릭 엔드포인트 확인
Zero Trust UI 방식도 메트릭 포트는 열려있을 수 있습니다.
# Mac의 메트릭 포트 확인 (기본: 20241)
curl http://localhost:20241/metrics
# 정상 출력 예시:
# cloudflared_tunnel_total_requests 0
# cloudflared_tunnel_ha_connections 4
메트릭이 안 나오면 토큰 방식에서는 메트릭 포트가 비활성화된 것입니다.
방법 2 | 네트워크 연결 확인
# Mac에서 cloudflared의 네트워크 연결 확인
sudo lsof -i -P | grep cloudflared
# 출력 예시:
# cloudflared 1234 root 10u IPv4 UDP *:50747
# cloudflared 1234 root 11u IPv4 UDP *:51799
# cloudflared 1234 root 12u IPv4 UDP *:63846
# cloudflared 1234 root 13u IPv4 UDP *:62534
# UDP 포트 4개 = QUIC 연결 정상
방법 3 | 로그에서 연결 상태 확인
# Mac 로그 확인
sudo tail -100 /Library/Logs/com.cloudflare.cloudflared.err.log | grep "Registered tunnel"
# 정상 출력 예시:
# INF Registered tunnel connection connIndex=0 location=ICN
# INF Registered tunnel connection connIndex=1 location=ICN
# INF Registered tunnel connection connIndex=2 location=ICN
# INF Registered tunnel connection connIndex=3 location=ICN
```
4개 연결이 모두 "Registered"면 정상입니다.
### 방법 4: Zero Trust 대시보드 확인 (가장 확실)
```
https://one.dash.cloudflare.com 접속
→ Networks → Tunnels
→ 터널 클릭
확인 사항:
- Status: ● HEALTHY (초록색)
- Connections: 4/4
- Last seen: Just now
- Traffic: 요청 수 통계
Zero Trust UI 방식은 대시보드가 가장 정확한 상태 확인 방법입니다.
Synology NAS (Docker)
컨테이너 상태 확인
# Docker 컨테이너 상태
sudo docker ps | grep cloudflared
# 상세 정보
sudo docker inspect cloudflared | grep Status
# 로그 확인
sudo docker logs cloudflared | tail -50
sudo docker logs cloudflared | grep "Registered tunnel"
네트워크 연결 확인
# 컨테이너의 네트워크 연결
sudo docker exec cloudflared sh -c "netstat -an | grep ESTABLISHED"
# 또는
sudo lsof -i -P | grep cloudflared
비교표
| 확인 방법 | 터미널 방식 | Zero Trust UI 방식 |
| cloudflared tunnel list | 가능 | 불가능 (빈 결과) |
| cloudflared tunnel info | 가능 | 불가능 |
| 프로세스 확인 (ps aux) | 가능 | 가능 |
| 네트워크 확인 (lsof) | 가능 | 가능 |
| 로그 확인 | 가능 | 가능 |
| 메트릭 엔드포인트 | 가능 (설정 시) | 제한적 |
| Zero Trust 대시보드 | 가능 | 가장 정확 |
실전 체크리스트
# 1. 프로세스 실행 중?
ps aux | grep cloudflared
# → 프로세스 있으면 정상
# 2. 네트워크 연결 있음?
sudo lsof -i -P | grep cloudflared
# → UDP 포트 4개 있으면 정상
# 3. 로그에 "Registered" 4개?
sudo tail -100 /Library/Logs/com.cloudflare.cloudflared.err.log | grep "Registered"
# → 4개 연결 등록되면 정상
# 4. Zero Trust 대시보드 HEALTHY?
# → 웹에서 확인 정상
# 5. 실제 접속 테스트
curl -I https://your-domain.com
# → 200 OK면 정상
정리
Zero Trust UI 방식의 상태 확인 순서:
프로세스 확인: ps aux | grep cloudflared
네트워크 확인: sudo lsof -i -P | grep cloudflared
로그 확인: sudo tail -f /Library/Logs/com.cloudflare.cloudflared.err.log
대시보드 확인: https://one.dash.cloudflare.com
실제 접속: 브라우저에서 도메인 테스트
Cloudflare One
Cloudflare One replaces legacy security perimeters with our global edge, making the Internet faster and safer for teams around the world.
one.dash.cloudflare.com
cloudflared tunnel list는 Zero Trust UI 방식에서 작동하지 않습니다!
이것은 정상이며, 대신 위의 방법들을 사용하면 됩니다.
'AI 코딩' 카테고리의 다른 글
| Cloudflare Tunnel을 활용한 HTTPS 연결하기(3) - Obsidian (0) | 2026.01.23 |
|---|---|
| Cloudflare Tunnel을 활용한 HTTPS 연결하기(2) - Synology NAS (0) | 2026.01.23 |
| Claude Code Workflow Studio로 만드는 AI 워크플로우 (0) | 2026.01.01 |
| Mac Mini를 라우터 외부에서 SSH로 로그인하는 방법 (0) | 2025.12.18 |
| Synology NAS Docker Compose 설치에서 운영까지 (1) | 2025.12.03 |