[태그:] Cloudflare

  • 보이지 않는 다리 — Cloudflare Tunnel로 우리집 블로그 외부 노출하기

    보이지 않는 다리 — Cloudflare Tunnel로 우리집 블로그 외부 노출하기

    보이지 않는 다리 — Cloudflare Tunnel로 우리집 블로그 외부 노출하기

    셀프호스팅 구축기 9편. 도메인 산 다음, 우리집 컴퓨터까지 트래픽을 어떻게 끌어오나.

    ← 이전 편: 8편 — 24시간 안에 봇이 온다 (보안 P0)
    → 다음 편: 10편 — 블로그에 뭘 쓰면 안 되나 (개인정보 검열)

    TL;DR (한 화면 요약)

    • 문제: 우리집 미니PC에 WordPress를 띄웠는데, 산 도메인(sticknstone.org)을 외부에서 어떻게 연결하나
    • 옛 방식: 공유기 포트 열기 → 공인 IP DNS 등록 → SSL 갱신. 5가지 골치
    • 새 방식: Cloudflare Tunnel — 미니PC가 Cloudflare에 outbound로 다리를 미리 놓는다. 공유기 구멍 X, IP 노출 X
    • 도구: cloudflared 데몬을 Docker로 가동. 5분
    • 공짜 보너스: WAF·DDoS·CDN·SSL·트래픽 통계 전부 무료
    • 비용: 0원 (도메인 갱신비 연 $10 별도)

    1. 풀고 싶은 문제

    블로그(WordPress)는 우리집 미니PC에 띄워뒀다. 도메인(sticknstone.org)도 샀다. 그런데 이 둘이 어떻게 만나야 하나?

    평범한 길 (포트포워딩) 5가지 골치

    골치
    공유기 구멍 443번 포트 외부에 열면 평생 봇 공격
    공유 IP 통신사가 매번 바꿈. 자동 갱신 스크립트 필요
    우리집 위치 노출 IP만 알면 대략적 동네 추정 가능
    SSL 갱신 매 90일마다 Let’s Encrypt 직접
    트래픽 폭주 DDoS 맞으면 우리집 인터넷 마비

    2. 다른 길: 다리를 놓는다

    발상의 전환: 외부에서 우리집으로 들어오는 연결을 받지 말자. 대신 우리집에서 외부 어딘가로 나가는 연결을 미리 만들어두자.

    flowchart LR
        subgraph oldway["옛 방식 — 포트포워딩"]
            A1[방문자] --> A2[공유기 포트 443 오픈]
            A2 --> A3[미니PC 공개 IP]
            A3 --> A4[WordPress]
            A5[해커] -.공격.-> A2
        end
        subgraph newway["새 방식 — Cloudflare Tunnel"]
            B1[방문자] --> B2[Cloudflare 서울 DC]
            B2 -. 미리 열린 outbound 채널 .-> B3[미니PC cloudflared]
            B3 --> B4[WordPress]
            B5[해커] -.차단.-> B2
        end
        style A5 fill:#fdd,stroke:#a00
        style B5 fill:#dfd,stroke:#0a0
        style A3 fill:#fdd
        style B3 fill:#dfd

    핵심: 미니PC가 먼저 손을 뻗는다. 외부 → 우리집 흐름이 아니라, 우리집 → Cloudflare로 outbound 연결을 늘 열어둔다. 방문자 요청은 Cloudflare가 이 채널로 미니PC에 던진다.

    호텔 비유

    호텔 손님(미니PC)이 친구를 만나고 싶을 때.

    • 평범한 길: 호텔 입구에 자기 방 번호를 크게 써붙임. 친구는 그 번호로 들어옴. 동시에 도둑도 옴.
    • 다리의 길: 호텔 프론트데스크(Cloudflare)에 미리 메모를 남긴다. 내 친구 찾는 사람 있으면 객실로 연결해달라고. 친구는 이름만 대고, 프론트데스크가 안내한다. 방 번호는 외부 노출 X. 의심스러운 사람은 1차로 거른다.

    3. 트래픽 흐름 — 방문자가 도메인 칠 때

    sequenceDiagram
        participant V as 방문자 브라우저
        participant CF as Cloudflare 서울 DC
        participant CD as cloudflared (미니PC)
        participant WP as WordPress 컨테이너
        V->>CF: GET https://sticknstone.org
        Note over CF: WAF·DDoS 1차 필터
        CF->>CD: 미리 열린 outbound 채널로 forward
        CD->>WP: http://localhost:8090
        WP-->>CD: HTML 응답
        CD-->>CF: outbound 채널 회신
        CF-->>V: SSL 종단·CDN 캐시 + 응답

    4단계: 방문자 → Cloudflare(필터) → 다리 → 미니PC → 역순. 미니PC IP는 어디에도 안 등장.


    4. 다리지기: cloudflared

    이 outbound 채널을 우리집에서 유지하는 작은 데몬이 cloudflared — Cloudflare 공식 오픈소스.

    왜 Docker로 띄우나

    미니PC에 이미 Docker가 돌고 있다. 다른 컨테이너들과 같은 호텔에 묵는 게 자연스럽다.

    flowchart TB
        subgraph minipc["미니PC (Ubuntu 24.04)"]
            subgraph docker["Docker 호스트"]
                CD[cloudflared / network_mode host]
                WP[wordpress-wordpress-1 :8090]
                DB[(wordpress-db-1 MariaDB)]
                RD[(wordpress-redis-1 Object Cache)]
                UM[umami_umami-1 :3001]
                UDB[(umami_db-1 Postgres)]
            end
            WP --> DB
            WP --> RD
            UM --> UDB
        end
        CF[Cloudflare 네트워크] -. outbound .-> CD
        CD --> WP
        CD --> UM
        style CD fill:#ffe4b5,stroke:#d97706
        style CF fill:#dbeafe,stroke:#1d4ed8

    cloudflarednetwork_mode: host로 띄워서 호스트의 localhost:8090(WP)와 localhost:3001(Umami)에 접근하게 한다.

    설치 5분 가이드

    폴더 + 설정 파일:

    /home/user/cloudflared/
    ├── .env                # TUNNEL_TOKEN=eyJh... (Cloudflare 대시보드에서 받은 토큰)
    └── docker-compose.yml

    docker-compose.yml:

    services:
      cloudflared:
        image: cloudflare/cloudflared:latest
        container_name: cloudflared
        restart: unless-stopped
        network_mode: host
        command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}
        env_file: .env

    가동 + 로그 검증:

    cd /home/user/cloudflared
    sudo docker compose up -d
    sudo docker logs cloudflared --tail 20

    성공 로그에 다음 4줄이 보인다 (Cloudflare 서울 데이터센터 4곳 동시 연결):

    Registered tunnel connection ... location=icn06 protocol=quic
    Registered tunnel connection ... location=icn01 protocol=quic
    Registered tunnel connection ... location=icn05 protocol=quic
    Registered tunnel connection ... location=icn06 protocol=quic

    미니PC는 4중 백업 채널로 Cloudflare에 연결된다. 한 채널이 죽어도 나머지 3개가 살아있다.


    5. 토큰은 위험하다 — 어디 두나

    cloudflared가 Cloudflare에 자기를 증명할 때 쓰는 토큰. 발급 시 한 번 보여주고 끝.

    토큰 다루기 원칙

    • .env 파일에 평문 저장. 권한 chmod 600 (소유자만 읽기·쓰기)
    • 채팅·노트·git 커밋에 절대 평문 X
    • 토큰 노출 의심 시 즉시 Cloudflare 대시보드에서 revoke + 재발급

    정확한 명령

    sudo chown user:user /home/user/cloudflared/.env
    sudo chmod 600 /home/user/cloudflared/.env

    6. 공짜로 따라오는 것

    Cloudflare 무료 플랜으로 이 다리만 놓아도 따라오는 보너스:

    보너스 설명 평소 가격대
    WAF (웹 방화벽) SQL injection·XSS 알려진 공격 자동 차단 월 $20~
    DDoS 보호 트래픽 폭주 자동 흡수, 무제한 월 $200~
    CDN 정적 파일 전 세계 캐싱. 외국 방문자도 빠르게 월 $10~
    SSL 자동 Let’s Encrypt 갱신 신경 0 월 $5~
    트래픽 통계 Cloudflare 대시보드에서 그래프로 (분석 도구)

    총합 비용: 0원. 도메인 갱신비 연 $10만.


    7. 함정 — 우리가 실제로 만난 것

    함정 1. Operating System 선택 헷갈림

    Cloudflare 대시보드의 cloudflared 설치 명령 화면에서 OS를 골라야 한다. 처음에는 자기 윈도우 PC가 OS인 줄 알고 Windows를 골랐다. 틀렸다. cloudflared가 설치되는 곳은 미니PC(Ubuntu)지 내 윈도우가 아니다. Docker를 골랐어야 한다.

    함정 2. 토큰을 LLM 채팅에 그대로 붙여넣음

    복사한 토큰을 LLM 채팅에 보내면 그 채팅 내용은 외부 서버에 저장된다. 토큰은 카드 비밀번호급 민감 정보. 작업 끝나면 즉시 Cloudflare 대시보드에서 토큰 회수 권장.

    함정 3. cloudflared가 어떻게 다른 서비스에 forward하나

    cloudflared 컨테이너만 띄우면 Cloudflare와 연결은 되지만, 들어온 요청을 어디로 보낼지는 별도 설정이다. Public Hostname 설정이라고 한다. 다음 편(10편)에서 다룬다.


    8. 검증

    가동 직후 Cloudflare 대시보드의 Tunnel 페이지 하단 Connection Status를 본다.

    Before:  No connection detected yet
    After:   Connected (체크)

    이 한 줄이 바뀌면 다리가 놓인 것이다.


    FAQ

    Q. Tailscale Funnel과 무엇이 다른가?
    둘 다 NAT 우회 + 미니PC IP 비공개라는 점은 같다. Cloudflare Tunnel은 WAF·DDoS·CDN·자기 도메인 사용까지 무료로 묶어준다. Tailscale Funnel은 전용 도메인 강제 + 보호막 없음. 블로그용은 Cloudflare가 우위.

    Q. 미니PC가 꺼지면 어떻게 되나?
    다리가 끊긴다. 방문자는 Cloudflare에서 521(Web server is down) 에러를 본다. 미니PC가 다시 켜지면 cloudflared가 자동으로 다리를 재연결한다 (Docker restart: unless-stopped).

    Q. Cloudflare가 트래픽을 보나? 개인정보 우려?
    Cloudflare는 SSL을 자기가 종단한다 = 평문 트래픽을 본다. 신뢰 모델은 Cloudflare는 내 편이라는 가정. 신뢰 못 하면 적합 X (대안: 자체 reverse proxy + Let’s Encrypt + dynamic DNS).

    Q. 무료 플랜 한계는?
    대역폭 무제한, 사이트 수 무제한, Tunnel 수 무제한. 단 Cloudflare Workers·R2 같은 부가 서비스에 별도 한도. 블로그 1개 운영엔 무료 플랜이 평생 충분.

    Q. 도메인이 .org가 아니어도 되나?
    무관. .com / .net / .io / .dev 모두 동일하게 작동. 단 도메인이 Cloudflare DNS를 쓰는 게 가장 쉬움 (자동 DNS 등록).


    다음 편 예고

    10편에서는 Public Hostname을 설정해 sticknstone.org → WordPress로 매핑하고, 글에 무엇을 쓰면 안 되는지(개인정보 검열)를 다룬다.


    한 줄 정리

    집에 있는 컴퓨터에 블로그를 띄우려면 공유기에 구멍 뚫고 IP 노출하는 옛 방식 대신, 컴퓨터에서 Cloudflare로 outbound 채널을 미리 열어두는 Cloudflare Tunnel 방식이 깔끔하다. 그 채널을 유지하는 작은 데몬이 cloudflared. Docker로 띄우면 5분.


    참고

  • 도메인 사기 — Cloudflare Registrar

    도메인 사기 — Cloudflare Registrar

    도메인 사기 — Cloudflare Registrar

    셀프호스팅 구축기 6편. 30분이지만 평생 가는 결정.


    TL;DR

    • 도메인 등록 업체 5곳 비교: 가비아·후이즈·GoDaddy·Namecheap·Cloudflare
    • 별고래는 Cloudflare Registrar 선택. 이유: 원가 + DNS + Tunnel + Email 한 계정 통합
    • .org 연 $10. 한국 등록 업체보다 30~50% 저렴
    • 함정: 등록 후 60일 transfer lock, WHOIS 개인정보 보호는 무료

    1. 도메인 이름 정하기 — 별고래 vs Star Whale

    이름 결정에 사흘 걸렸다. 후보 비교 표.

    후보 의미 한국어 SEO 영문 SEO 트레이드마크
    byeolgorae.com 별고래 직역 약함 byeolgorae 발음 어려움 없음
    starwhale.com 영문 직역 약함 starwhale.ai 이미 ML 회사 ⚠ 충돌
    firewhale.com 불 + 고래 (소방 본업 모티프) 약함 firewhale.io 앱사·코인 점유 ⚠ 충돌
    sticknstone.org Stick & Stone (옛 항해사 별점 기구) 깨끗함 깨끗함 없음

    메타포 우선: 브랜드명(별고래)과 도메인(sticknstone)을 분리. About 페이지에서 “Stick & Stone은 작은 돌·막대로 별을 가리키던 옛 항해사 도구. 별고래는 그 별을 향한 깊은 항해” 풀어주면 자연스러움.


    2. 등록 업체 5곳 비교

    

    .org 도메인 1년 가격 비교 (2026-05 기준):

    업체 가격 갱신 특이사항
    가비아 22,000원 22,000원 UI 한국어 친화
    후이즈 19,000원 19,000원 카드 충전식
    GoDaddy $20 → $35 갱신 매년 ↑ 마케팅 푸시 ↑
    Namecheap $13 $15 WHOIS 보호 무료
    Porkbun $9 $11 신생, 안정성 미상
    Cloudflare $10.44 $10.44 원가 (재판매 마진 0)

    Cloudflare는 도메인을 원가로 판매한다. 자기 수익원은 다른 곳 (Workers·Stream·Enterprise). 사장님 같은 1인 운영자에겐 가장 저렴 + 갱신비도 변동 X.


    3. 왜 Cloudflare인가 — 통합 가치

    기능 다른 업체 Cloudflare
    DNS 관리 별도 서비스 (Route 53 등) 통합 무료
    WHOIS 보호 보통 유료 ($10/년) 무료 자동
    Cloudflare Tunnel 외부 라우팅 별도 같은 계정 1클릭
    Email Routing (받기) 별도 G Suite ($6/월) 무료 무제한
    SSL 인증서 자동 (Let’s Encrypt 직접) 자동 (Cloudflare wildcard)
    WAF·DDoS·CDN 별도 ($20+) 같은 도메인에 자동 적용

    별고래는 결국 Cloudflare Tunnel + DNS + WAF + (나중에) Email Routing 다 쓸 거였다. 도메인을 다른 곳에서 사면 nameserver를 Cloudflare로 옮기는 작업이 추가. 같은 곳에서 사면 그 단계 자동.


    4. 구매 과정 — 5분

    1. dash.cloudflare.com → Domains → Buy domain
    2. sticknstone 검색 → .org 선택
    3. 등록자 정보 (이름·이메일·주소)
      – WHOIS는 자동 마스킹됨 (Contact Privacy Inc. 같은 익명)
    4. 카드 결제 ($10.44)
    5. 즉시 활성화. nameserver 자동으로 Cloudflare 가리킴

    다른 업체에서 사면 nameserver를 Cloudflare로 바꾸는 단계 (24~48시간 전파)가 추가. Cloudflare에서 사면 그 시간 0.


    5. 함정

    함정 1. 60일 transfer lock

    도메인 등록 직후 60일은 다른 업체로 이전 불가 (ICANN 규칙). 즉시 Cloudflare 외 다른 곳으로 옮길 일 없으면 무관.

    함정 2. WHOIS 개인정보

    도메인 등록자 정보는 공개가 원칙. 이름·이메일·주소·전화가 WHOIS DB에 등록됨. Cloudflare는 자동 마스킹 (다른 업체는 별도 옵션 $5~10/년). 이메일은 [email protected] 같은 익명 주소가 외부에 보임.

    함정 3. 결제 카드 변경

    카드 만료/변경 시 자동 갱신 실패 → 도메인 expire → 30일 grace period → 회수. 누가 채갈 수 있음. 카드 변경 시 Cloudflare 결제 정보 갱신 필수.

    함정 4. 도메인 가격 변동

    Cloudflare는 원가라 변동 거의 없지만, 신규 TLD(.io·.dev·.app)는 매년 약간씩 인상. .org·.com·.net은 안정적.

    함정 5. 사이트 죽으면 도메인은?

    미니PC 죽거나 cloudflared 종료해도 도메인 자체는 사장님 소유. Cloudflare 대시보드에서 DNS 레코드만 살아있음. 미니PC 복구하면 다시 작동.


    FAQ

    Q. .org가 좋은가? .com은?
    .com이 가장 일반적이지만 좋은 이름이 대부분 점유. .org는 비영리·개인 노트에 자연스러움. SEO 차이 거의 없음 (Google 공식 답변).

    Q. 한글 도메인(별고래.한국)은?
    가능. 단 외국인이 입력 어려움 + 일부 도구 호환성 문제 + 신뢰감 약함. 영문 도메인 + 한국어 콘텐츠 조합이 표준.

    Q. 도메인 + 호스팅 묶음 상품 (가비아 HostingNW 등)은?
    1인 셀프호스팅 미니PC 있으면 무관. 묶음 상품의 호스팅은 공유 호스팅 (다른 사람과 서버 공유). 제어권 적음.

    Q. Cloudflare Email Routing은 어떻게 작동?
    [email protected] → Cloudflare 받음 → 사장님 개인 이메일 ([email protected])로 forward. 무료 무제한. 보낼 때는 별도 SMTP 필요 (Resend·Mailgun 무료티어).

    Q. 도메인 평가 사이트(Estibot 등) 신뢰?
    1인 운영자에겐 무관. 도메인은 사용 가치(내가 쓰기에 좋은가)가 시장 가치(누가 사줄 거)보다 중요.


    다음 편 예고

    7편 — 이름이 어렵다: 사이트명 정하기. “잼잼의 항해일기” → “별고래”로 바꾼 사흘의 고민과 영문 부제 결정.


    한 줄 정리

    도메인은 평생 가는 결정. Cloudflare Registrar = 원가 + DNS + Tunnel + Email + WHOIS 보호 통합 한 계정. .org 연 $10.44. 가비아 대비 절반.