Cloudflare + NPM으로 개인 도메인 연결하기

TaekJun Jeong·2026년 3월 31일

Network

목록 보기
6/7

구매한 도메인(taekjun.cloud)으로 접속했을 때, 개인 서버에 Docker로 올라가 있는 nginx 웹 페이지로 연결되도록 설계하는 과정입니다.


1. Cloudflare DNS Records 설정

DNS Records를 설정하는 이유

도메인을 구매했다고 해서 자동으로 어딘가로 연결되는 것은 아닙니다.
DNS 레코드가 "이 도메인으로 오는 요청을 어느 IP로 보내라" 는 매핑 정보를 제공해야 연결이 됩니다.
쉽게 말하면, 도메인은 간판이고 DNS 레코드는 그 간판 뒤에 적힌 실제 주소입니다.


DNS Records의 역할

브라우저에 taekjun.cloud를 입력하면 아래 순서로 동작합니다.

  1. OS가 DNS 서버에 "이 도메인의 IP가 뭐야?" 라고 질의

  2. Cloudflare DNS가 레코드를 보고 IP 주소로 응답

  3. 브라우저가 해당 IP로 HTTP 요청을 전송


Type A를 사용하는 이유

개인 서버는 Daejeon LAN에 위치해 있고, 앞단에 wisoft-nginx-reverse-proxy가 있습니다.

(Nangman Infra 아키텍처 참고)


따라서 DNS A 레코드의 IPv4 address에는 wisoft NPM의 공인 IP를 입력합니다.

타입가리키는 대상비고
AIPv4 주소✅ 이번에 사용
AAAAIPv6 주소NPM 서버가 IPv4 기반
CNAME다른 도메인루트 도메인에 사용 불가, 서브도메인 별칭용
MX메일 서버메일 전용
TXT텍스트 정보도메인 소유 인증, SPF 등

Proxy Status를 OFF로 설정하는 이유

Proxy를 켜면 트래픽이 Cloudflare 서버를 경유합니다.
NPM에서 Let's Encrypt SSL 인증서를 발급할 때 HTTP Challenge 방식을 사용합니다.
이 방식은 Let's Encrypt가 도메인으로 직접 HTTP 요청을 날려서 소유권을 검증하는데,
Cloudflare가 중간에 끼면 검증 요청이 막히거나 꼬일 수 있습니다.
따라서 인증서 발급 시에는 Proxy를 OFF 로 설정해야 합니다.

설정 후 nslookup으로 A 레코드가 정상적으로 조회되는 것을 확인합니다.


2. Cloudflare API Token 생성

API Token이 필요한 이유

Let's Encrypt 인증서 발급 방식은 두 가지입니다.

방식동작조건
HTTP ChallengeLet's Encrypt가 http://도메인/.well-known/... 으로 직접 접근해서 확인80포트가 외부에 열려있어야 함
DNS ChallengeLet's Encrypt가 DNS TXT 레코드를 확인해서 검증DNS 편집 권한 필요

NPM에서 Cloudflare DNS Challenge 방식을 사용하려면, NPM이 Cloudflare에 TXT 레코드를 자동으로 추가/삭제해야 합니다.
이때 NPM이 Cloudflare API에 접근할 수 있도록 인증하는 열쇠가 바로 API Token입니다.

Cloudflare 대시보드 → My Profile → API Tokens에서 Zone.DNS 편집 권한으로 토큰을 생성합니다.


3. NPM에서 Certificates 발급

Certificates의 역할

현재 상태는 HTTP만 가능한 상태입니다. HTTPS를 사용하려면 SSL/TLS 인증서가 필요합니다.

  • ① 암호화: 브라우저와 서버 사이 통신을 암호화합니다. 인증서가 없으면 주고받는 데이터가 평문으로 노출됩니다.
  • ② 신원 증명: "이 서버가 진짜 taekjun.cloud가 맞다"는 것을 인증기관(CA)이 보증합니다. 없으면 브라우저가 "연결이 안전하지 않음" 경고를 표시합니다.

무료 CA인 Let's Encrypt가 인증서를 발급해 주며, NPM이 이 과정을 자동으로 처리하고 90일마다 자동 갱신합니다.

NPM GUI → SSL Certificates → Add Let's Encrypt Certificate에서 아래 항목을 입력합니다.

  • Domain: test.taekjun.cloud
  • DNS Challenge 체크
  • Cloudflare API Token 입력

발급 로그에서 성공 메시지를 확인할 수 있습니다.


4. NPM에서 Proxy Hosts 설정

NPM GUI → Proxy Hosts → Add Proxy Host에서 아래와 같이 설정합니다.

항목
Domain Namestest.taekjun.cloud
Schemehttp
Forward Hostname / IP개인 Ubuntu 서버 사설 IP
Forward Port80
SSL Certificate방금 발급한 Let's Encrypt 인증서 선택

개인 서버는 외부에 직접 노출되어 있지 않으므로 사설 IP를 입력합니다.
WireGuard를 사용하고 있다면 WireGuard 대역 IP를 입력해도 됩니다.

설정 후 Proxy Host 상태가 Online으로 표시되면 정상입니다.


5. 트러블슈팅

502 Bad Gateway

Proxy Host가 Online임에도 불구하고 https://test.taekjun.cloud 접속 시 502 Bad Gateway가 발생했습니다.

NPM에서 Proxy Host 설정을 확인해보니 Forward 주소가 아래와 같이 잡혀 있었습니다.

https://192.168.x.x:80

원인: Scheme이 https로 설정되어 있어, NPM이 개인 서버 nginx에 HTTPS 요청을 보내고 있었습니다.

그러나 개인 서버의 nginx는 HTTP(80포트)만 리스닝하고 있어 HTTPS 핸드셰이크 자체가 실패한 것입니다.

해결: Scheme을 httpshttp로 변경

http://192.168.x.x:80

브라우저 → NPM 구간은 HTTPS여도 무관하지만, NPM → 개인 서버 구간은 실제 서버가 리스닝하는 프로토콜과 일치시켜야 합니다.

변경 후 정상적으로 접속되는 것을 확인했습니다.


DNS에 대해 더 심도있게 공부하고 포스트할 예정입니다.





정택준
Email: taekjunnnn@gmail.com
Team: https://nangman.cloud/

0개의 댓글