일반적인 도메인 연결은 서버의 포트포워딩 또는 공유기의 포트포워딩이 필요하다. 공유기는 ISP(인터넷 서비스 제공업체)에서 80/443 포트를 차단하는 경우가 많다. 인터넷 공유기 포트가 차단되어 있다면 인터넷 공유기 회사에 문의하여 열어달라고 해야한다.(공유기 설정에서 열어도 소용이 없었음) 그래서 방법을 찾다가 Cloudfare Tunnel을 사용하면 포트포워딩 없이도 도메인을 서버에 연결할 수 있다고 하여 선택하게 되었다.
그리고 우리는 보안에 대해서 무지하지만 보안을 신경을 조금이라도 쓰자는 차원이기도 하다. 공인 IP 노출없이 해주는 서비스니깐^^
왜 Cloudflare Tunnel인가?
일반적인 방법 (포트포워딩)
사용자 → 도메인 → 공인 IP → 공유기 → 서버
(포트포워딩 필요)
문제점:
- ISP가 80/443 포트 차단 (가정용 인터넷에서 흔함)
- 공인 IP가 변경될 수 있음
- 보안 취약점 노출
Cloudflare Tunnel 방식
사용자 → fi-fo.cloud → Cloudflare 네트워크
↕ (터널)
서버 → Cloudflare 연결 유지
장점:
- 포트포워딩 불필요 ✅
- 공인 IP 노출 없음 (보안 강화)
- ISP 포트 차단 우회
- DDoS 방어 자동 적용
- 무료
도메인 구매 및 DNS 설정
도메인 구매
호스팅케이알(hosting.kr)에서 도메인을 구매했다.(호스팅케이알이 한국어로 되어있기도 하고 제일 싸서 선택)
Cloudflare 연동
- https://cloudflare.com 가입
- Onboard a domain → 도메인 입력 → Free 플랜 선택
- Cloudflare 네임서버 확인:
magdalena.ns.cloudflare.com mitch.ns.cloudflare.com - 호스팅케이알에서 네임서버를 Cloudflare로 변경
왜 Cloudflare로 DNS를 옮기는가?
Cloudflare는 무료로 DDoS 방어, CDN, SSL을 제공한다. 또한 Tunnel 기능을 사용하려면 Cloudflare DNS가 필요하다.
DNS A 레코드 추가
TypeNameContentProxy
| A | @ | 서버 공인 IP | Proxied |
| A | * | 서버 공인 IP | Proxied |
와일드카드(*) 레코드를 사용하는 이유:
*.fi-fo.cloud로 설정하면 dev.fi-fo.cloud, api.fi-fo.cloud, frontend.fi-fo.cloud 등 모든 서브도메인이 자동으로 서버로 연결된다. 이것들을 쿠버네티스에 매핑만 해준다면 쿠버네티스에서 원하는 pod IP를 호출할 수 있다.
cert-manager SSL 인증서 설정
cert-manager 설치
SSL 인증서에 대한 고민을 버리자! 매번 적용하기도 귀찮다
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml
cert-manager란?
Let's Encrypt SSL 인증서를 자동으로 발급하고 갱신해주는 k3s 컴포넌트
Cloudflare API Token 생성
- https://dash.cloudflare.com/profile/api-tokens
- Edit zone DNS 템플릿 선택
- Zone Resources → 해당 도메인 선택
- 토큰 생성 및 저장
kubectl create secret generic cloudflare-api-token \
--from-literal=api-token='your_token' \
-n cert-manager
ClusterIssuer 생성 (DNS-01 방식)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your@email.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: cloudflare-api-token
key: api-token
왜 DNS-01 방식을 사용하는가?
SSL 인증서 발급 방식에는 HTTP-01과 DNS-01이 있다.
방식원리필요 조건
HTTP-01 도메인으로 HTTP 요청 보내 검증 80 포트 개방 필요 DNS-01 DNS 레코드로 검증 DNS API 접근만 필요 ISP가 80 포트를 차단하는 경우 HTTP-01 방식이 실패한다.(1시간 가량 씨름함) DNS-01 방식은 포트 개방 없이 Cloudflare API로 DNS 레코드를 수정해 검증
Cloudflare Tunnel 설정
cloudflared 설치
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb
Cloudflare 로그인
cloudflared tunnel login
브라우저에서 URL을 열어 인증하면 /home/user/.cloudflared/cert.pem이 생성된다.(당연히 서버를 SSH 연결해서 터미널에서 클릭해야한다.)
터널 생성
cloudflared tunnel create fi-fo-tunnel
자격증명 파일이 ~/.cloudflared/터널ID.json으로 저장
config.yml 설정
tunnel: fi-fo-tunnel
credentials-file: /home/susu/.cloudflared/터널ID.json
ingress:
- hostname: dev.example.cloud
service: http://ClusterIP:3000 # nestjs-dev ClusterIP
- hostname: api.example.cloud
service: http://ClusterIP:3000 # nestjs-prod ClusterIP
- service: http_status:404
ClusterIP를 직접 사용하는 이유:
Cloudflare Tunnel이 서버 내부에서 실행되므로 k3s 내부 네트워크에 직접 접근할 수 있다. Nginx 같은 리버스 프록시 없이 직접 서비스로 연결이 가능하다.
DNS 라우팅 등록
cloudflared tunnel route dns fi-fo-tunnel dev.example.cloud
cloudflared tunnel route dns fi-fo-tunnel api.example.cloud
systemd 서비스 등록
sudo cloudflared --config /home/susu/.cloudflared/config.yml service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
동작 원리 요약
1. 서버가 시작되면 cloudflared가 Cloudflare와 터널 연결 유지
2. 사용자가 dev.example.cloud 접속
3. Cloudflare가 터널을 통해 서버로 트래픽 전달
4. cloudflared가 config.yml 기준으로 nestjs-dev-service로 라우팅
5. Nest.js Pod이 응답
여러 도메인/서비스 추가
새로운 서비스를 추가할 때는 config.yml에 한 줄만 추가하면 된다.
ingress:
- hostname: dev.example.cloud
service: http://ClusterIP:3000
- hostname: api.example.cloud
service: http://ClusterIP:3000
- hostname: grafana.example.cloud # 새로운 서비스 추가
service: http://ClusterIP:3000
- service: http_status:404
cloudflared tunnel route dns fi-fo-tunnel grafana.example.cloud
sudo systemctl restart cloudflared
트래픽 확장 (Scale Out)
트래픽이 많아지면 Pod 수를 늘려 자동으로 분산된다.
kubectl scale deployment nestjs-dev --replicas=3 -n backend-dev
Cloudflare Tunnel → nestjs-dev-service
↓ (자동 로드밸런싱)
Pod 1
Pod 2
Pod 3'Linux' 카테고리의 다른 글
| SSD 마운트 - 데이터 전용 디스크 설정 (0) | 2026.04.25 |
|---|---|
| Tailscale로 외부에서 서버 접속하기 (0) | 2026.04.23 |
| Wake On LAN (WOL) 설정 (0) | 2026.04.23 |
| Ubuntu Server 고정 IP 설정 (netplan) (1) | 2026.04.23 |
| SSH 원격 접속 설정 (0) | 2026.04.23 |