Vercel deploy via Cloudflare, DNS 오류 (DNS_PROBE_FINISHED_NXDOMAIN)
😉

Vercel deploy via Cloudflare, DNS 오류 (DNS_PROBE_FINISHED_NXDOMAIN)

Date
Sep 29, 2022
Text
Tags
Network
트러블슈팅
Cloudflare
SSL
MITM

 

Vercel 배포에 커스텀 도메인을 사용할 때 Cloudflare를 경유하면 DNS 오류 발생

Cloudflare에서 관리중인 도메인을 Vercel 프로덕션으로 라우팅 하였으나 DNS 질의가 실패하는 현상 발생
 
DNS_PROBE_FINISHED_NXDOMAIN
DNS_PROBE_FINISHED_NXDOMAIN
 

Cloudflare DNS 레코드 설정정보

Vercel 커스텀 도메인 적용 가이드를 따라 내 도메인 주소의 네임서버(Cloudflare)에서 DNS 레코드를 설정하였다.
📌 next.over.ist : 'next'에 대한 CNAME을 프로덕션으로 라우팅하기위해 cname.vercel-dns.com(Vercel dns서버)를 가리키는 레코드 등록
📌 over.ist : 루트 도메인은 아직 사용할 곳이 없었으므로, 혹시 모를 오류 대응을 위해 A레코드도 등록하였음. Vercel 76.76.21.21(Vercel DNS서버)로 레코드 등록
notion image
 
설정에 따른 라우터 방문 순서 예상
1️⃣ 클라이언트 브라우저에 next.over.ist 입력
2️⃣ Windows OS에서 next.over.ist 네임 서버 질의
3️⃣ DNS 체인이 클라우드 플레어에 next.over.ist의 IP 질의
4️⃣ 캐시 만료시간이 남은 것은 Cloudflare CDN에서 응답, 남지 않은 것은 Vercel DNS에 질의
5️⃣ Vercel DNS는 프로덕션을 라우팅하고 프로덕션에서는 요청을 확인한 뒤 응답
 

문제 분석

Vercel 설정 확인

프로덕션 앱이 정상적으로 빌드되어 서비스를 라우팅하는가?
notion image
배포 후 프로덕션의 또다른 주소인 overist-blog.vercel.app으로 접속 시 정상적으로 프로덕션이 실행중인게 확인 된다.
 

nslookup

nslookup이 cname.vercel-dns.com의 IP 76.76.21.x 를 반환하는가?
$ nslookup next.over.ist 서버: UnKnown Address: 111.118.0.1 *** UnKnown이(가) next.over.ist을(를) 찾을 수 없습니다.
DNS 질의 체이닝이 CDN, Vercel까지 이어져야 하는데 111.118.0.1(HCN, KT자회사)에서 더 이어지지 않는다.
 

문제 자가진단

😢… 오픈소스 가이드를 읽어보며 세팅을 해도 안되는 환경 문제는 정말 골치아프다.
DNS 질의가 안되니까 traceroute도 nmap도 아무것도 할 수가 없었다.
 
Cloudflare는 라우팅 장비만 있는게 아니다.
방화벽 룰셋, Flexible SSL, CDN 캐싱 등의 기능을 켜놓았는데, 이 기능들이 동작하는 서버를 거친다.
출처 : 해시넷위키
출처 : 해시넷위키
클라우드플레어 시스템이 정확히 어떤 네트워크 장비로 구성되어있는지는 잘 모르겠지만, L4 이하의 방화벽이나 라우터만 있는게 아니다. CDN 캐싱, Cloudflare 전용 앱 등은 네트워크 장비로 할 수 있는 기능이 아니다.
클라우드플레어는 기존에 쓰던 도메인 관리콘솔(hosting.kr, dothome)에 비해 기능도 설정 값도 훨씬 많으며, 작은 설정 하나하나가 민감하게 작용할 것 같았다. 따라서 Cloudflare 대쉬보드에서 어딘가 설정 미스가 있어서 문제가 발생하는 것 같다. 또, hosting.kr에서 관리할 때와 달리 Cloudflare는 클플에서 발급한 SSL 인증서를 등록할 수 있었던 것이 생각났다.
다행히 Vercel 가이드에 Cloudflare에서 관리중인 도메인을 Vercel Project에 연결하는 것에 관련된 문서가 있었다.
 

Cloudeflare 연동 시 Vercel 공식 가이드

https://vercel.com/guides/using-cloudflare-with-vercel
✏️
해결방법은 간단했다. 기존 CF 인증서만 적용하던 Flexible SSL 모드에서 서버사이드(Vercel) SSL 인증서도 적용하도록 FULL SSL 모드로 적용해주면 된다.
 
기존 설정은 Cloudflare에서 Client to CDN HTTPS, CDN to Server HTTP 를 통해 서버의 SSL 인증서 발급 절차 없이 CF에서 자체적으로 지원하는 인증서를 통해 암호화 통신이 되도록(Flexible SSL 모드) 설정하였었다.
이를 Full SSL mode로 변경해주고, 기다려주면 된다.
내 경우에는 별다른 설정 없이 CF와 Vercel이 챌린지를 수행하고, 인증서가 자동으로 등록되었다.
 
notion image
notion image
끝! 경우에 따라선 챌린지를 수행하기 위해 well-known/acme-challenge에 대한 페이지 룰셋 설정이 필요할 수도 있다.
 

Enhancement

다른 해결방법 : SSL Off

Cloudflare SSL 옵션 → SSL OFF
notion image
notion image
SSL 옵션을 꺼도 Vercel 인증서로 SSL 통신이 안전하게 잘 수행 되는 것을 볼 수 있다.
어차피 Verccel에서 HSTS(강제 HTTPS 307 Redirect)를 지원하므로, 클라이언트와 내 Vercel App 서버간 SSL 통신은 안전하게 수행될 것이다.
 

더 좋은 옵션 : Full strict mode

notion image
Vercel 가이드에선 Full SSL을 사용하라고 하지만, Vercel의 SSL 인증서는 Let’s Encrypt를 통해 인증서를 자동 발급/등록하고, DNS 레코드에 CAA 레코드를 명세하여 인증서 제공 기관까지 정확히 명시한다 (”letsencrypt”). CAA 레코드에 대한 명세(RFC6844).
 
Strict Full(엄격) 모드 사용시 인증 기관에서 발급한 인증서만 사용하므로, 엄격 모드를 적용하는 것이 좋다. 인증서가 조작된다면, 데이터를 스니핑하거나 조작할 수 있는 중간자 공격이 일어날 것이다.
 

HTTPS 인증서 중간자 공격 수행

클라이언트에서 Fiddler 루트 인증서로 교체시
notion image
notion image
클라이언트측에서 인증서 강제 교체시 인증서 오류 화면이 나오는 것을 볼 수 있다. 사용자는 경고를 무시하고 진입할 수 있다.
 
경고를 무시하고 HTTP로 강제 접속시 위변조 공격 가능
notion image
notion image
SSL을 사용하지 않는 HTTP 통신은 중간에서 스니핑이나 위변조를 할 수 있다. 만약 공격자가 악성코드를 다운로드 시킨다면, 내 컴퓨터가 다칠것이다.
 

굳이 클플 써야하나…

DNS 레코드를 관리하는 네임서버를 따로두고 Vercel 라우팅 게이트웨이까지 두 번에 걸쳐 접속한다는 점에서 신경 쓸 게 두 배로 늘어 번거롭긴 하다.
 
💡
네임서버 설정을 Vercel 네임 서버로 설정하면 편하겠지만, 나는 클라우드 플레어에 다소 애용하는 기능들이 있고, 쓰면서 배우는 게 있기에 계속 클플에서 DNS를 관리하려 한다.
  • Workers, KV DB : 블로그, 사이드 프로젝트용 API 서버
  • Pages : 무제한 대역폭의 정적 페이지 스토리지
  • DDos 방어 기능
  • Flexible SSL : http 사이트에 Cloudflare 엣지 인증서로 가변 https 변환 가능 (이제 못쓴다 😢)
    • CDN ~ 서버사이드간에 암호화 안되어 네트워크 보안 취약 (서버망에서 수행되는 네트워크 공격에 취약함, 내 서버가 안 뚫려도 같은 망의 옆 사람 서버가 뚫리면 털릴 수 있음)
    • 80서비스가 열려있어도 강제로 HTTPS를 유지하는 HSTS 기능 적용 필요 (https strip 공격 방지, origin 주소에 http로 접근하는 경우 방지)
  • CDN : 캐싱된 데이터들의 트래픽 절감, FCP/TTI 최적화 (Free 플랜은 좋은 성능은 아니지만 내가 직접 관리할 수 있다는 데 의의를 둔다)
  • 이메일 라우팅 : 소유 도메인이 반영된 이메일 주소 라우팅 지원
  • 룰셋 적용 가능 : /well-known/*, SSL 부분 차단, 리다이렉트 등
  • 쓸만한 애널리틱스 : 총 조회수나 트래픽 정도는 Free 플랜에서도 제공