테마 전환

Cloudflare Tunnel 입문: 공인 IP 없이도 내부망 서비스를 안전하게 접속하기

Easton editorial illustration: edge-node constellation

집에 있는 NAS 파일에 접속하려는데 연결이 안 되거나, 친구에게 로컬 프로젝트를 보여주고 싶은데 공유 링크를 만들 수 없는 상황이 있습니다. 원인은 대개 같습니다. 공인 IP가 없기 때문입니다. 통신사는 공인 IP를 주지 않거나 추가 비용을 요구하고, 동적 IP를 쓰면 DDNS 설정까지 필요해 안정성도 떨어집니다. frp, ngrok 같은 내부망 터널링 도구도 써 봤지만, 클라우드 서버가 필요해 비용이 늘거나 무료판 제한이 너무 많았습니다.

Cloudflare Tunnel은 완전히 무료이고 공인 IP나 클라우드 서버가 필요 없습니다. 라우터 포트 포워딩도 설정하지 않아도 됩니다. HTTPS 암호화와 Cloudflare의 DDoS 보호도 기본으로 붙습니다. 이 글에서는 Cloudflare Tunnel로 내부망 터널링을 구현하는 방법을 다룹니다. NAS 원격 접속, 로컬 프로젝트 공개, 집 서버로 SSH 접속까지 30분이면 설정할 수 있습니다.

1. Cloudflare Tunnel은 무엇이고 왜 선택할 만한가요?

내부망 터널링은 어떤 문제를 해결하나요?

먼저 왜 내부망 터널링이 필요한지부터 보겠습니다.

일반적으로 집 안의 장비는 모두 내부망에 있고, 192.168.1.100 같은 사설 IP 주소를 가집니다. 이 장비들은 서로 접속할 수 있지만, 외부 인터넷에서는 직접 들어올 수 없습니다. 회사나 카페에서 집 NAS에 접속하려면 내부망과 외부망을 이어 주는 “다리”가 필요합니다.

전통적인 방식은 포트 포워딩입니다. 라우터에서 포트를 열고 외부 요청을 내부망 장비로 전달합니다. 하지만 전제가 있습니다. 공인 IP가 있어야 합니다. 문제는 요즘 많은 가정용 인터넷 회선이 공인 IP를 주지 않거나 CGNAT 뒤에 있어, 외부에서 아예 접속할 수 없다는 점입니다.

내부망 터널링이 해결하는 문제가 바로 이것입니다. 공인 IP가 없어도 외부에서 내부망 서비스에 접속할 수 있게 해 줍니다.

Cloudflare Tunnel의 동작 원리

Cloudflare Tunnel의 접근 방식은 꽤 영리합니다. 전통적인 방식처럼 “외부에서 안쪽으로 구멍을 뚫는” 대신, 내부에서 먼저 바깥으로 연결합니다.

구체적인 동작 흐름은 다음과 같습니다.

  1. 내부망 장비에서 cloudflared라는 작은 프로그램(데몬)을 실행합니다
  2. 이 프로그램이 Cloudflare의 글로벌 네트워크에 먼저 연결해 암호화 터널을 만듭니다
  3. 누군가 설정한 도메인(예: nas.yourdomain.com)에 접속하면 요청이 먼저 Cloudflare CDN으로 들어갑니다
  4. Cloudflare가 이 암호화 터널을 통해 요청을 내부망 서비스로 전달합니다
  5. 내부망 서비스가 처리한 데이터도 다시 터널을 통해 돌아갑니다

이렇게 하면 내부망 서비스는 외부에서 완전히 “보이지” 않습니다. 어떤 포트도 열지 않고, 공인 IP도 필요 없으며, 내부에서 외부로 나가는 암호화 연결 하나만 존재합니다. 보안 관점에서는 Zero Trust(제로 트러스트) 아키텍처의 사고방식입니다. 기본적으로 어떤 연결도 신뢰하지 않고, 모든 트래픽은 인증과 암호화를 거쳐야 합니다.

엄밀한 비유는 아니지만, 집과 Cloudflare 사이에 전용선을 하나 깔아 둔 것과 비슷합니다. 그 선은 당신만 쓸 수 있고, 외부인은 서버가 어디 있는지도 볼 수 없습니다.

왜 Cloudflare Tunnel을 선택했나요?

내부망 터널링 방식은 꽤 많습니다. 저도 몇 가지를 써 봤고, 결국 Cloudflare Tunnel을 선택했습니다. 이유는 주로 다음과 같습니다.

frp와 비교하면(가장 흔한 방식):

frp는 확실히 좋고 설정도 복잡하지 않습니다. 하지만 클라우드 서버가 필요하고, 그 서버에는 공인 IP가 있어야 합니다. 즉 매달 서버 비용이 들고 설정과 유지보수도 해야 합니다. 생각보다 번거롭습니다. Cloudflare Tunnel은 이 비용을 바로 없앱니다. Cloudflare의 CDN과 DDoS 보호도 무료로 쓸 수 있습니다.

ngrok과 비교하면(해외에서 많이 쓰는 방식):

ngrok 무료판은 랜덤 도메인을 배정하고, 재시작할 때마다 도메인이 바뀌며 트래픽 제한도 있습니다. 자체 도메인을 쓰려면 유료 플랜이 필요합니다. Cloudflare Tunnel은 완전히 무료이고 사용자 지정 도메인을 자유롭게 쓸 수 있으며 트래픽 제한도 없습니다.

Tailscale/ZeroTier와 비교하면(P2P 네트워킹):

이 둘은 가상 LAN 방식이라 접근 방식이 조금 다릅니다. 휴대폰, 컴퓨터, 서버끼리 서로 접속하는 점대점 네트워크에 더 적합합니다. 하지만 웹사이트를 외부에 공개해 누구나 접속하게 만들고 싶다면 Tailscale은 그다지 맞지 않습니다. Cloudflare Tunnel은 “외부에 서비스를 공개”하는 상황에 더 적합합니다.

간단히 말해 Cloudflare Tunnel의 장점은 세 가지입니다. 무료, 안전, 간단함입니다.

물론 완벽한 도구는 아닙니다. 가장 큰 문제는 중국 내 접속 속도가 평범하다는 점입니다. Cloudflare의 CDN 노드가 주로 해외에 있어 지연이 높고, 가끔 끊김도 있습니다. 주 사용자가 중국 내에 있거나 실시간성이 특히 중요하다면 다른 방식을 고려해야 할 수 있습니다. 하지만 개인 사용이나 실시간 요구가 높지 않은 상황에서는 충분합니다.

2. 준비물: 무엇이 필요한가요?

설정을 시작하기 전에 필요한 것을 먼저 확인해 보겠습니다. 걱정할 만큼 복잡하지 않고, 대부분 무료입니다.

1. Cloudflare 계정(무료)

특별히 설명할 것은 많지 않습니다. cloudflare.com에서 계정을 만들면 됩니다. 완전히 무료입니다. 이미 Cloudflare DNS나 CDN 서비스를 쓰고 있다면 기존 계정을 그대로 쓰면 됩니다.

2. 자체 도메인 하나

이 부분만 약간의 비용이 듭니다. 도메인이 하나 필요하고, 이 도메인을 Cloudflare에 호스팅해야 합니다.

왜 도메인이 꼭 필요할까요? Cloudflare Tunnel은 도메인으로 트래픽을 라우팅합니다. nas.yourdomain.com에 접속하면 Cloudflare가 이 요청을 어떤 터널로 보내야 하는지 알 수 있습니다.

도메인은 생각보다 비싸지 않습니다. 중국에서는 Alibaba Cloud나 Tencent Cloud에서 .com 또는 .top 도메인을 연 수십 위안 정도에 살 수 있습니다. 구매 후 DNS 서버를 Cloudflare로 바꾸면 됩니다. Cloudflare에 자세한 안내가 있고 절차도 간단합니다.

덤으로 좋은 점도 있습니다. 도메인을 Cloudflare에 맡기면 CDN과 방화벽 기능도 함께 쓸 수 있으니, 사실상 무료로 한 가지를 더 얻는 셈입니다.

3. Cloudflare Zero Trust 무료 플랜

이 부분은 조금 주의해야 합니다. Cloudflare Tunnel은 Cloudflare Zero Trust 서비스의 일부라서 먼저 Zero Trust를 활성화해야 합니다.

긴장할 필요는 없습니다. 무료 플랜이면 충분합니다. 최대 50명 사용자를 지원하므로 개인 용도로는 다 쓰기도 어렵습니다.

활성화 단계는 다음과 같습니다.

  1. Cloudflare 콘솔에 로그인합니다
  2. 왼쪽 메뉴에서 Zero Trust를 찾습니다
  3. 무료 플랜(Free Plan)을 선택합니다
  4. 결제 수단(신용카드 또는 PayPal)을 등록합니다

여기서 잠깐 망설일 수 있습니다. 무료 플랜인데 왜 카드를 묶어야 할까요?

솔직히 저도 처음에는 조금 걱정했습니다. 하지만 실제로는 과금되지 않습니다. Cloudflare가 이렇게 하는 이유는 악용을 막기 위해서입니다. 예를 들어 누군가 계정을 대량으로 만들어 문제를 일으키는 상황을 줄이려는 것입니다. 중국 내 복수 통화 신용카드도 사용할 수 있었고, 저는 China Merchants Bank 카드를 등록했는데 이후 과금된 적은 없습니다.

4. 내부망 장비 한 대

이 장비는 두 가지 조건을 만족해야 합니다.

  1. 인터넷에 연결될 수 있어야 합니다. 당연한 이야기지만, 인터넷이 안 되면 터널을 만들 수 없습니다.
  2. 계속 켜져 있어야 합니다. 또는 최소한 접속이 필요할 때는 켜져 있어야 합니다.

구체적으로는 다음 장비가 가능합니다.

  • 집 컴퓨터(Windows/Mac/Linux 모두 가능)
  • NAS(Synology, QNAP 등. Docker를 지원하면 더 편합니다)
  • Raspberry Pi나 다른 개발 보드
  • 소프트 라우터

저는 NAS에서 Docker로 실행하고 있습니다. 관리가 특히 편합니다.

5. 외부에 노출할 내부망 서비스

마지막으로 외부에 공개하고 싶은 서비스가 있어야 합니다. 예를 들면 다음과 같습니다.

  • NAS의 웹 관리 화면(일반적으로 5000, 5001 포트)
  • Home Assistant 스마트홈 콘솔(8123 포트)
  • 직접 띄운 블로그나 웹사이트(80, 8080 등)
  • SSH 서비스(22 포트)

이 서비스의 내부망 IP 주소와 포트 번호를 알아야 합니다. 예를 들어 제 NAS는 192.168.1.100:5000입니다.

준비물은 여기까지입니다. 항목은 많아 보이지만 실제로 추가 비용이 드는 것은 도메인뿐이고, 나머지는 무료로 해결할 수 있습니다.

3. 실전 설정: 단계별로 Tunnel 만들기

이제 실제 설정으로 들어가겠습니다. 전체 과정은 세 단계입니다. Tunnel 만들기, cloudflared 설치, 도메인 설정입니다. 말로는 조금 길어 보이지만 실제 작업은 빠릅니다. 한 번 따라 해 보면 감이 옵니다.

단계 1: Cloudflare 콘솔에서 Tunnel 만들기

  1. Cloudflare 계정에 로그인하고 Zero Trust 콘솔로 들어갑니다
  2. 왼쪽 메뉴에서 Networks → Connectors → Cloudflare Tunnels를 클릭합니다
  3. 오른쪽 위의 Create a tunnel 버튼을 누릅니다
  4. 커넥터 타입은 Cloudflared를 선택합니다(기본값입니다)
  5. Tunnel 이름을 정합니다

이름은 의미 있게 짓는 것이 좋습니다. 예를 들어 home-nas, dev-server처럼 나중에 관리하기 쉬운 이름이 좋습니다. Tunnel이 하나뿐이라면 아무 이름이나 괜찮지만, 앞으로 여러 개가 생길 수 있다면 어떤 서비스인지 바로 보이게 만드는 편이 낫습니다.

Save tunnel을 누르면 Cloudflare가 Token을 생성합니다.

중요한 점: 이 Token은 정말 중요합니다. Tunnel의 키와 같습니다. 뒤에서 cloudflared를 설치할 때 필요합니다. 화면에 아주 긴 문자열이 나오니 먼저 복사해 안전한 곳에 저장하거나, 페이지를 닫지 말고 그대로 두세요.

단계 2: cloudflared 데몬 설치

이제 내부망 장비에 cloudflared를 설치해야 합니다. 운영체제에 따라 방법이 조금 다릅니다. 여기서는 가장 간단한 Docker 방식을 중심으로 설명하고, 다른 방식은 간단히 덧붙이겠습니다.

방법 1: Docker 배포(추천)

장비가 Docker를 지원한다면(NAS, Linux 서버 등) 이 방법이 가장 편합니다. 명령 한 줄이면 됩니다.

docker run -d --restart=always \
  --name cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate run --token <YOUR_TOKEN>

<YOUR_TOKEN>을 방금 복사한 긴 문자열로 바꾸고 Enter를 누르면 됩니다.

몇 초 뒤 컨테이너가 실행됩니다. --restart=always 옵션은 컨테이너가 자동으로 재시작되도록 합니다. 장비가 재부팅되어도 Tunnel이 자동으로 복구됩니다.

방법 2: Linux 시스템에 직접 설치

Docker를 쓰지 않는다면 시스템에 직접 설치할 수도 있습니다. Ubuntu/Debian 기준 예시는 다음과 같습니다.

# 설치 패키지 다운로드
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
# 설치
sudo dpkg -i cloudflared-linux-amd64.deb
# Tunnel 실행
sudo cloudflared service install <YOUR_TOKEN>

CentOS/RHEL 사용자는 .deb 대신 .rpm을 사용하면 됩니다.

방법 3: Windows 설치

Windows 사용자는 MSI 설치 파일을 내려받습니다.

https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.msi

더블 클릭해 설치한 뒤, 관리자 권한으로 명령 프롬프트(CMD)를 열고 다음을 실행합니다.

cloudflared.exe service install <YOUR_TOKEN>

방법 4: macOS 설치

Mac 사용자는 Homebrew가 가장 간단합니다.

brew install cloudflared
cloudflared service install <YOUR_TOKEN>

어떤 방식이든 설치가 끝나면 Cloudflare 콘솔로 돌아가 상태를 확인합니다. Tunnel 상태가 HEALTHY로 바뀌었다면 연결에 성공한 것입니다. 이 시점에 cloudflared와 Cloudflare 사이에 암호화 터널이 만들어진 상태입니다.

단계 3: Public Hostname 설정

터널은 만들어졌지만, Cloudflare는 아직 트래픽을 어디로 보내야 하는지 모릅니다. 이제 다음 내용을 알려줘야 합니다. “nas.yourdomain.com에 접속하는 요청은 내부망의 192.168.1.100:5000으로 전달해 주세요.”

방금 만든 Tunnel 페이지에서 계속 진행합니다.

  1. Public Hostname 탭을 클릭합니다
  2. Add a public hostname을 누릅니다
  3. 설정을 입력합니다
    • Subdomain(서브도메인): 예를 들어 nas를 입력하면 전체 도메인은 nas.yourdomain.com이 됩니다
    • Domain(도메인): 드롭다운에서 자신의 도메인을 선택합니다. 이미 Cloudflare에 호스팅되어 있어야 합니다
    • Path(경로): 보통 비워 둡니다. /api 같은 경로로 구분하고 싶을 때만 입력합니다
    • Type(타입): HTTP를 선택합니다
    • URL: 내부망 서비스 주소를 입력합니다. 형식은 http://내부망IP:포트입니다. 예: http://192.168.1.100:5000

여기서 이런 의문이 들 수 있습니다. 왜 Type을 HTTP로 고를까요? HTTPS가 더 안전한 것 아닌가요?

걱정하지 않아도 됩니다. Cloudflare가 자동으로 HTTPS를 제공합니다. 흐름은 이렇습니다.

  • 방문자 → Cloudflare: HTTPS 암호화(Cloudflare가 인증서를 자동 발급)
  • Cloudflare → 내부망 서비스: 암호화 터널을 통해 전송

즉 내부 서비스에 HTTPS를 직접 설정하지 않아도 사용자가 접속할 때는 전체 구간이 암호화됩니다. 인증서 설정의 번거로움도 줄어듭니다.

Save hostname을 누르면 설정이 적용됩니다.

단계 4: 접속 확인

이제 테스트할 차례입니다.

브라우저를 열고 방금 설정한 도메인, 예를 들어 https://nas.yourdomain.com에 접속합니다.

모든 것이 정상이라면 내부망 서비스 화면이 보일 것입니다. 브라우저 주소창에 자물쇠 아이콘도 보일 텐데, HTTPS 인증서가 정상이라는 뜻입니다.

처음 접속할 때는 몇 분 정도 기다려야 할 수 있습니다. DNS 레코드가 적용되는 데 시간이 걸리기 때문입니다. 접속이 안 된다면 다음을 확인해 보세요.

  1. 5-10분 기다린 뒤 다시 시도합니다
  2. Tunnel 상태가 HEALTHY인지 확인합니다
  3. 내부망 서비스가 정상 실행 중인지 확인합니다. 내부망에서 http://192.168.1.100:5000에 접속해 봅니다

하나의 Tunnel로 여러 서브도메인을 설정할 수 있습니다

여기서 실용적인 팁이 하나 있습니다. 하나의 Tunnel에 여러 Public Hostname을 추가해 서로 다른 내부망 서비스로 연결할 수 있습니다.

예를 들어 제 설정은 다음과 같습니다.

  • nas.mydomain.com → http://192.168.1.100:5000(NAS 관리 화면)
  • blog.mydomain.com → http://192.168.1.100:8080(개인 블로그)
  • ha.mydomain.com → http://192.168.1.101:8123(Home Assistant)

서비스마다 Tunnel을 따로 만들 필요가 없어서 관리가 훨씬 편합니다.

4. 고급 설정과 모범 사례

기본 설정은 여기까지면 끝입니다. 하지만 조금 더 제대로 쓰고 싶다면 알아 둘 만한 고급 설정이 몇 가지 있습니다.

설정 파일로 여러 서비스 관리하기

앞에서는 Dashboard에서 클릭으로 설정했습니다. 서비스가 적을 때는 편합니다. 하지만 노출할 서비스가 많거나 설정을 코드처럼 관리하고 싶다면, 예를 들어 버전 관리에 넣고 싶다면 설정 파일 방식을 쓸 수 있습니다.

cloudflared가 실행되는 장비에 config.yml 파일을 만듭니다.

tunnel: <YOUR_TUNNEL_UUID>
credentials-file: /path/to/<UUID>.json
ingress:
  - hostname: nas.yourdomain.com
    service: http://192.168.1.100:5000
  - hostname: blog.yourdomain.com
    service: http://192.168.1.100:8080
  - hostname: ha.yourdomain.com
    service: http://192.168.1.101:8123
  - service: http_status:404

마지막 service: http_status:404는 fallback 규칙입니다. 어떤 규칙에도 매칭되지 않은 요청은 모두 404를 반환합니다. 이 규칙은 반드시 있어야 하고, 반드시 마지막에 와야 합니다.

그런 다음 이 설정 파일로 cloudflared를 시작합니다.

cloudflared tunnel --config /path/to/config.yml run

이 방식의 장점은 설정이 더 명확하고 Git 저장소에 넣어 버전 관리할 수 있다는 점입니다. 단, Token은 절대 커밋하지 마세요.

SSH와 RDP 지원

Cloudflare Tunnel은 HTTP만 전달하는 도구가 아닙니다. SSH, RDP 같은 프로토콜도 지원합니다. 서버 원격 관리에 특히 유용합니다.

SSH 설정 예시:

config.yml에 다음을 추가합니다.

- hostname: ssh.yourdomain.com
  service: ssh://localhost:22

그런 다음 로컬 컴퓨터에서 cloudflared를 통해 SSH로 접속합니다.

# 먼저 SSH config 설정
cat >> ~/.ssh/config << EOF
Host ssh.yourdomain.com
  ProxyCommand cloudflared access ssh --hostname %h
EOF
# 이제 바로 SSH 접속 가능
ssh [email protected]

RDP 설정(Windows 원격 데스크톱)도 비슷합니다. 프로토콜만 rdp://로 바꾸면 됩니다.

이 방식의 장점은 SSH/RDP 포트를 공인 인터넷에 전혀 노출하지 않아도 된다는 점입니다. 보안성이 크게 올라갑니다.

Cloudflare Access로 보안 강화하기

앞에서 설정한 방식은 도메인을 아는 사람이라면 누구나 서비스에 접속할 수 있습니다. 공개 웹사이트라면 괜찮지만, NAS 관리 화면 같은 민감한 서비스라면 인증을 한 겹 더 추가하는 것이 좋습니다.

여기서 Cloudflare Access를 씁니다. Tunnel 앞에 로그인 관문을 추가할 수 있습니다.

설정도 복잡하지 않습니다.

  1. Zero Trust 콘솔에서 Access → Applications로 들어갑니다
  2. Add an application을 누르고 Self-hosted를 선택합니다
  3. 애플리케이션 정보를 입력합니다
    • Application name: 예를 들어 “My NAS”
    • Application domain: nas.yourdomain.com 같은 도메인을 선택합니다
  4. 인증 정책을 설정합니다
    • 이메일 허용 목록을 선택할 수 있습니다. 지정한 이메일만 로그인할 수 있습니다
    • 또는 Google/GitHub OAuth 로그인을 쓸 수 있습니다
    • MFA(다중 인증)도 켤 수 있습니다

설정이 끝나면 nas.yourdomain.com에 접속할 때 먼저 Cloudflare 로그인 페이지로 이동하고, 인증을 통과해야 서비스에 들어갈 수 있습니다.

이 기능도 개인 사용자에게는 완전히 무료입니다. 민감한 서비스에는 강력히 권장합니다.

성능 최적화와 모니터링

마지막으로 일상적으로 쓸 때 도움이 되는 팁입니다.

Tunnel 실행 상태 확인:

Zero Trust 콘솔의 Tunnels 페이지에서 다음을 볼 수 있습니다.

  • Tunnel 온라인 여부(HEALTHY 또는 DOWN)
  • 트래픽 통계
  • 연결된 클라이언트 수

Tunnel이 갑자기 DOWN이 됐다면, 대개 내부망 장비가 인터넷에서 끊겼거나 꺼진 경우입니다. cloudflared 프로세스가 아직 실행 중인지 확인하세요.

로그로 문제 확인:

Docker 방식이라면 docker logs cloudflared로 로그를 볼 수 있습니다.

자주 보는 오류는 다음과 같습니다.

  • Token이 유효하지 않음: 복사 과정에서 틀리지 않았는지 확인합니다
  • 연결 실패: 내부망 서비스가 정상 실행 중인지 확인합니다
  • 인증서 오류: 보통 몇 분 기다리면 자동으로 해결됩니다

cloudflared 정기 업데이트:

Cloudflare는 cloudflared를 주기적으로 업데이트해 새 기능을 추가하거나 버그를 수정합니다. Docker를 쓴다면 최신 이미지를 당겨와 컨테이너를 재시작하면 됩니다.

docker pull cloudflare/cloudflared:latest
docker restart cloudflared

Cloudflare 공식적으로는 최근 1년 버전에 대해서만 호환성을 보장합니다. 너무 오래된 버전은 강제로 내려갈 수 있으니 정기적으로 업데이트하는 것이 좋습니다.

5. 자주 묻는 문제와 주의할 점

Cloudflare Tunnel을 한동안 써 보면서 자주 겪는 문제와 주의할 점을 정리했습니다.

속도와 안정성

가장 많이 궁금해하는 부분입니다. 솔직히 말하면 중국 내 접속 속도는 빠른 편이 아닙니다.

제 실측 기준은 다음과 같습니다.

  • 지연: 300-800ms(중국 내 접속)
  • 대역폭: 다운로드 속도는 보통 1-5MB/s이며 시간대와 지역에 따라 다릅니다
  • 안정성: 가끔 짧은 끊김이 있지만 대부분의 시간에는 괜찮습니다

왜 느릴까요? Cloudflare의 CDN 노드가 주로 해외에 있어 중국 내 트래픽이 우회하기 때문입니다. 무료 사용자는 우선순위가 상대적으로 낮아 피크 시간대에 속도 제한이 걸릴 수도 있습니다.

적합한 상황:

  • 가끔 NAS에 원격 접속해 파일을 내려받기
  • 친구에게 개인 프로젝트 보여주기
  • 서버를 원격 SSH로 관리하기(지연의 영향이 크지 않음)

맞지 않는 상황:

  • 스트리밍 재생(버퍼링이 생길 수 있음)
  • 게임 서버(지연이 너무 큼)
  • 대용량 파일을 자주 전송
  • 중국 사용자 대상 프로덕션 환경

속도가 중요하다면 frp와 중국 내 클라우드 서버 조합, 또는 Tailscale 같은 P2P 방식을 고려할 수 있습니다.

보안

Cloudflare Tunnel 자체는 안전합니다. 주된 이유는 다음과 같습니다.

  • 전체 HTTPS 암호화
  • 인바운드 포트를 열 필요 없음
  • Zero Trust 아키텍처, 기본적으로 모든 접근 거부
  • Cloudflare의 DDoS 보호 기본 제공

하지만 이것이 아무 서비스나 노출해도 된다는 뜻은 아닙니다. 다음을 강력히 권장합니다.

  1. 데이터베이스를 노출하지 마세요: MySQL, Redis 같은 서비스는 Tunnel로 직접 노출하면 위험이 너무 큽니다
  2. 민감한 서비스에는 Access 인증을 추가하세요: NAS, SSH, 관리자 페이지에는 Cloudflare Access를 꼭 붙이는 것이 좋습니다
  3. 로그를 정기적으로 확인하세요: 이상한 접근이 있는지 봅니다
  4. 시스템과 소프트웨어를 업데이트하세요: 내부망 서비스도 필요한 패치는 적용해야 합니다. “어차피 내부망이니까”라는 생각으로 보안을 방치하면 안 됩니다

그래도 공인 인터넷에 포트를 직접 여는 것과 비교하면 Tunnel은 훨씬 안전합니다.

사용 제한

Cloudflare 무료 플랜의 제한은 다음과 같습니다.

  • 최대 50명 사용자(개인 용도로는 충분합니다)
  • 트래픽 제한 없음(이 부분은 꽤 좋습니다)
  • UDP 프로토콜은 아직 지원하지 않음(TCP는 문제없음)
  • 중국 내에서는 HTTP/3 QUIC을 아직 지원하지 않음

또 하나의 필수 조건이 있습니다. 도메인이 있어야 하고 반드시 Cloudflare에 호스팅되어야 합니다. 도메인을 Cloudflare에 맡기고 싶지 않다면 Tunnel을 쓸 수 없습니다.

대안 비교

Cloudflare Tunnel이 맞지 않는다면 다음 선택지도 있습니다.

방식장점단점적합한 상황
frp빠르고 안정적클라우드 서버가 필요하고 비용이 듦프로덕션 환경, 중국 내 사용자
TailscaleP2P 직접 연결, 빠름개인 용도 중심, 공개 서비스에는 부적합개인 장비 간 연결
ngrok설정이 간단함무료판 제한이 많고 사용자 지정 도메인은 유료임시 데모
DDNSTO중국 팀이 운영해 속도가 좋음무료판은 장비 수 제한중국 내 사용자

자신의 요구에 맞춰 고르면 됩니다. 절대적으로 가장 좋은 방식은 없습니다.

실용적인 팁

마지막으로 작은 팁 몇 가지를 공유합니다.

1. 짧은 도메인 사용하기

예를 들어 mynas.yourdomain.com보다 nas.yourdomain.com이 기억하기 쉽습니다. 도메인 자체가 짧다면, 예를 들어 abc.com이라면 nas.abc.com은 더 편합니다.

2. 서비스별 서브도메인 계획하기

의미 있는 서브도메인을 쓰는 것이 좋습니다.

  • nas. - NAS 관리
  • blog. - 블로그
  • dev. - 개발 환경
  • ssh. - SSH 접속

URL만 봐도 어떤 서비스인지 알 수 있고 관리도 명확해집니다.

3. Token 백업하기

Tunnel의 Token은 꼭 잘 보관하세요. 1Password, Bitwarden 같은 비밀번호 관리자에 저장하는 것이 좋습니다. 잃어버리면 Tunnel을 삭제하고 다시 만들어야 합니다.

4. Tunnel 상태 모니터링하기

Cloudflare의 Webhook이나 이메일 알림 기능을 쓰면 Tunnel이 오프라인이 됐을 때 바로 알림을 받을 수 있습니다. Zero Trust 콘솔의 Settings에서 설정할 수 있습니다.

결론

정리하면 이렇습니다.

Cloudflare Tunnel은 무료이고 안전하며 쓰기 쉬운 내부망 터널링 방식입니다. 특히 개인 개발자와 홈 서버 사용자에게 잘 맞습니다. 공인 IP가 필요 없고, 클라우드 서버를 살 필요도 없으며, 라우터 포트 포워딩을 건드릴 필요도 없습니다. 30분이면 설정을 끝낼 수 있습니다.

핵심 장점은 다음과 같습니다.

  • 완전히 무료이며 트래픽 제한 없음
  • Zero Trust 보안 아키텍처
  • HTTPS와 DDoS 보호 기본 제공
  • HTTP/SSH/RDP 등 여러 프로토콜 지원
  • 하나의 Tunnel로 여러 서비스 노출 가능

물론 단점도 있습니다.

  • 중국 내 접속 속도는 평범하고 지연이 비교적 높음
  • 가끔 끊김이 있음
  • 도메인이 필요하고 Cloudflare에 호스팅해야 함
  • UDP 프로토콜을 지원하지 않음

주로 본인이 가끔 원격으로 접속하거나 해외 사용자를 대상으로 한다면 Cloudflare Tunnel만으로 충분합니다. 중국 내 프로덕션 환경이거나 속도 요구가 높다면 다른 방식을 고려하는 편이 낫습니다.

그래도 개인 사용자 입장에서는 Cloudflare 인프라를 무료로 활용할 수 있다는 점만으로도 꽤 좋은 선택입니다. 예전에 저는 frp와 클라우드 서버를 반나절 넘게 만지작거리다가, 결국 Tunnel은 10분 만에 끝나는 걸 보고 “처음부터 이걸 쓸걸”이라는 생각을 했습니다. 직접 써 보면 무슨 말인지 알게 됩니다.

이제 한 번 시도해 보세요. 문제가 생기면 댓글에 남겨 주세요. 확인하는 대로 답하겠습니다.

Cloudflare Tunnel로 내부망 터널링을 구성하는 전체 절차

Tunnel 생성부터 Public Hostname 설정까지 30분 안에 무료 내부망 터널링을 구현하는 전체 단계입니다. HTTP/SSH/RDP 등 여러 프로토콜을 지원합니다

Estimated time: PT30M

  1. 1

    Step 1: 준비 작업: Cloudflare 계정과 도메인 등록

    Cloudflare 계정 등록:
  2. 2

    Step 2: Cloudflare 콘솔에서 Tunnel 만들기

    작업 단계:
  3. 3

    Step 3: cloudflared 데몬 설치

    Docker 배포(추천):
  4. 4

    Step 4: Public Hostname 설정

    작업 단계:
  5. 5

    Step 5: 접속 확인과 고급 설정

    접속 확인:

FAQ

Cloudflare Tunnel은 frp, ngrok과 무엇이 다르며 왜 선택할 만한가요?
frp와 비교하면(가장 흔한 방식):
• frp는 확실히 쓰기 좋고 설정도 복잡하지 않지만, 클라우드 서버와 공인 IP가 필요하다는 조건이 있습니다
• 즉 매달 서버 비용이 들고 설정과 유지보수도 꽤 번거롭습니다
• Cloudflare Tunnel은 이 비용을 바로 없애고, Cloudflare의 CDN과 DDoS 보호까지 무료로 활용할 수 있습니다

ngrok과 비교하면(해외에서 많이 쓰는 방식):
• ngrok 무료판은 랜덤 도메인을 배정하고 재시작할 때마다 바뀌며 트래픽 제한도 있습니다
• 자체 도메인을 쓰려면 유료 플랜이 필요합니다
• Cloudflare Tunnel은 완전히 무료이고 사용자 지정 도메인을 자유롭게 쓸 수 있으며 트래픽 제한도 없습니다

Tailscale/ZeroTier와 비교하면(P2P 네트워킹):
• 이 둘은 가상 LAN 방식이라 접근 방식이 조금 다릅니다
• 휴대폰, 컴퓨터, 서버끼리 서로 접속하는 점대점 네트워크에 더 적합합니다
• 하지만 웹사이트를 외부에 공개해 누구나 접속하게 만들고 싶다면 Tailscale은 그다지 맞지 않습니다
• Cloudflare Tunnel은 '외부에 서비스를 공개'하는 상황에 더 잘 맞습니다

간단히 말해 Cloudflare Tunnel의 장점은 무료, 안전, 간단함입니다.
Cloudflare Tunnel은 어떻게 동작하며 왜 더 안전한가요?
Cloudflare Tunnel의 아이디어는 꽤 영리합니다. 전통적인 방식처럼 '외부에서 안쪽으로 구멍을 뚫는' 것이 아니라 내부에서 먼저 바깥으로 연결합니다.

구체적인 흐름은 다음과 같습니다.
1) 내부망 장비에서 cloudflared라는 작은 프로그램(데몬)을 실행합니다
2) 이 프로그램이 Cloudflare 글로벌 네트워크에 먼저 연결해 암호화 터널을 만듭니다
3) 누군가 설정한 도메인(예: nas.yourdomain.com)에 접속하면 요청이 먼저 Cloudflare CDN으로 들어갑니다
4) Cloudflare가 이 암호화 터널을 통해 요청을 내부망 서비스로 전달합니다
5) 내부망 서비스가 처리한 데이터도 다시 터널을 통해 돌아갑니다

이렇게 하면 내부망 서비스는 외부에서 완전히 '보이지' 않습니다. 포트를 열 필요도 없고 공인 IP도 필요 없으며, 내부에서 외부로 나가는 암호화 연결 하나만 유지됩니다.

보안 관점에서는 Zero Trust(제로 트러스트) 아키텍처에 가깝습니다. 기본적으로 어떤 연결도 신뢰하지 않고, 모든 트래픽은 인증과 암호화를 거쳐야 합니다.

엄밀한 비유는 아니지만, 집과 Cloudflare 사이에 전용선을 하나 깔아 둔 것과 비슷합니다. 그 선은 당신만 쓸 수 있고, 외부인은 서버가 어디 있는지도 볼 수 없습니다.
Cloudflare Tunnel의 중국 내 접속 속도는 어떤가요? 어떤 상황에 적합한가요?
중국 내 접속 속도는 사실 빠른 편은 아닙니다.

실측 기준:
• 지연: 300-800ms(중국 내 접속)
• 대역폭: 다운로드 속도는 보통 1-5MB/s이며 시간대와 지역에 따라 다릅니다
• 안정성: 가끔 짧은 끊김이 있지만 대부분의 시간에는 괜찮습니다

왜 느릴까요?
• Cloudflare의 CDN 노드가 주로 해외에 있어 중국 내 트래픽이 우회하기 때문입니다
• 무료 사용자는 우선순위가 상대적으로 낮아 피크 시간대에 속도 제한이 걸릴 수도 있습니다

적합한 상황:
• 가끔 NAS에 원격 접속해 파일을 내려받기
• 친구에게 개인 프로젝트 보여주기
• 서버를 원격 SSH로 관리하기(지연의 영향이 크지 않음)

맞지 않는 상황:
• 스트리밍 재생(버퍼링이 생길 수 있음)
• 게임 서버(지연이 너무 큼)
• 대용량 파일을 자주 전송
• 중국 사용자 대상 프로덕션 환경

속도가 중요하다면 frp와 중국 내 클라우드 서버 조합, 또는 Tailscale 같은 P2P 방식을 고려할 수 있습니다. 주로 본인이 가끔 원격으로 접속하거나 해외 사용자를 대상으로 한다면 Cloudflare Tunnel만으로 충분합니다. 중국 내 프로덕션 환경이거나 속도 요구가 높다면 다른 방식을 검토하는 편이 낫습니다.
Cloudflare Tunnel을 설정하려면 무엇을 준비해야 하나요?
준비물:

1) Cloudflare 계정(무료, cloudflare.com에서 가입)
2) 자체 도메인 하나(약간의 비용 필요. 중국에서는 Alibaba Cloud나 Tencent Cloud에서 .com 또는 .top 도메인을 연 수십 위안 정도에 살 수 있고, 구매 후 DNS 서버를 Cloudflare로 바꾸면 됩니다)
3) Cloudflare Zero Trust 무료 플랜(Cloudflare 콘솔에 로그인한 뒤 왼쪽 메뉴에서 Zero Trust를 찾아 무료 플랜을 선택합니다. 결제 수단 등록은 필요하지만 과금되지는 않습니다)
4) 내부망 장비 한 대(인터넷에 연결되고 계속 켜둘 수 있는 장비. 집 컴퓨터, NAS, Raspberry Pi 등이 가능합니다)
5) 외부에 노출할 내부망 서비스(내부 IP 주소와 포트 번호를 알아야 합니다. 예: 192.168.1.100:5000)

설정 단계:

1) Cloudflare 콘솔에서 Tunnel 만들기:
• Zero Trust 콘솔 → Networks → Connectors → Cloudflare Tunnels → Create a tunnel
• Token 받기

2) cloudflared 데몬 설치(Docker 방식이 가장 간단합니다):
docker run -d --restart=always --name cloudflared cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <YOUR_TOKEN>

3) Public Hostname 설정:
• Public Hostname 탭 → Add a public hostname
• Subdomain, Domain, URL 등을 입력

전체 설정은 30분이면 충분히 끝낼 수 있습니다.
Cloudflare Tunnel은 어떤 프로토콜을 지원하나요? SSH와 RDP는 어떻게 설정하나요?
Cloudflare Tunnel은 HTTP, SSH, RDP 등 여러 프로토콜을 지원합니다.

HTTP 설정:
• Public Hostname에서 Type을 HTTP로 선택하고 URL에는 http://내부망IP:포트를 입력합니다
• 내부 서비스에 HTTPS를 직접 설정하지 않아도 Cloudflare가 자동으로 HTTPS를 제공합니다. 사용자가 접속할 때도 전체 구간이 암호화됩니다

SSH 설정:
• config.yml에 다음을 추가합니다:
hostname: ssh.yourdomain.com
service: ssh://localhost:22
• 그런 다음 로컬 컴퓨터의 SSH config를 설정합니다:
cat >> ~/.ssh/config << EOF
Host ssh.yourdomain.com
ProxyCommand cloudflared access ssh --hostname %h
EOF
• 이후 바로 SSH로 접속할 수 있습니다: ssh [email protected]

RDP 설정(Windows 원격 데스크톱)도 비슷하며, 프로토콜만 rdp://로 바꾸면 됩니다.

이 방식의 장점은 SSH/RDP 포트를 공인 인터넷에 전혀 노출하지 않아도 된다는 점입니다. 보안성이 크게 올라갑니다. 하나의 Tunnel에 여러 서브도메인을 연결해 서로 다른 내부망 서비스로 보낼 수도 있습니다. 예를 들면:
• nas.mydomain.com→http://192.168.1.100:5000
• blog.mydomain.com→http://192.168.1.100:8080
• ssh.mydomain.com→ssh://localhost:22
Cloudflare Access로 보안을 강화하려면 어떻게 해야 하나요? 사용 제한은 무엇인가요?
Cloudflare Access로 보안을 강화하는 방법:
• Zero Trust 콘솔에서 Access → Applications로 이동합니다
• Add an application을 클릭하고 Self-hosted를 선택합니다
• 애플리케이션 정보를 입력합니다(Application name은 My NAS처럼, Application domain은 nas.yourdomain.com처럼 설정)
• 인증 정책을 설정합니다(이메일 허용 목록, Google/GitHub OAuth 로그인, MFA 다중 인증까지 선택 가능)

설정이 끝나면 접속할 때 먼저 Cloudflare 로그인 페이지로 이동하고, 인증을 통과해야 서비스에 들어갈 수 있습니다. 이 기능도 개인 사용자에게는 완전히 무료이므로 민감한 서비스에는 강력히 권장합니다.

사용 제한:
• Cloudflare 무료 플랜 제한:
- 최대 50명 사용자(개인 용도로는 충분합니다)
- 트래픽 제한 없음(이 부분은 꽤 좋습니다)
- UDP 프로토콜은 아직 지원하지 않음(TCP는 문제없음)
- 중국 내에서는 HTTP/3 QUIC을 아직 지원하지 않음
• 또 하나의 필수 조건: 도메인이 있어야 하고 반드시 Cloudflare에 호스팅되어야 합니다. 도메인을 Cloudflare에 맡기고 싶지 않다면 Tunnel을 쓸 수 없습니다

보안 관련:
• Cloudflare Tunnel 자체는 안전합니다(전체 HTTPS 암호화, 인바운드 포트 개방 불필요, Zero Trust 아키텍처의 기본 거부 정책, Cloudflare의 DDoS 보호)
• 다만 다음을 강력히 권장합니다:
- 데이터베이스를 노출하지 마세요(MySQL, Redis 같은 서비스는 Tunnel로 직접 노출하면 안 됩니다)
- 민감한 서비스에는 Access 인증을 추가하세요(NAS, SSH, 관리자 페이지 등)
- 로그를 정기적으로 확인하고 시스템과 소프트웨어를 업데이트하세요

3분 읽기 · 게시일: 2025년 11월 30일 · 수정일: 2026년 10월 21일

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog