Chapter 08

Domain, DNS & Cloudflare

Cấu hình tên miền, DNS records, và sử dụng Cloudflare làm reverse proxy + CDN

Tên miền hoạt động như thế nào?

Khi người dùng truy cập app.example.com, trình duyệt cần tìm IP address của server. Quá trình này gọi là DNS resolution:

🌐
Browser
app.example.com
🔍
DNS Resolver
ISP / 8.8.8.8
Nameserver
Cloudflare / Registrar
💻
Server IP
123.45.67.89
Các bước chi tiết DNS +

1. Browser kiểm tra cache local (đã truy cập domain này chưa?).

2. Nếu không có cache, hỏi DNS Resolver (thường là ISP hoặc Google 8.8.8.8).

3. Resolver hỏi Root DNS Server → TLD Server (.com) → Authoritative Nameserver (Cloudflare hoặc registrar).

4. Nameserver trả về IP address (A record) hoặc hostname (CNAME record).

5. Browser kết nối đến IP, Nginx trên server xử lý request.

TTL (Time To Live): DNS record có TTL — thời gian cache kết quả. TTL thấp (300s) cho phép thay đổi IP nhanh. TTL cao (86400s) giảm DNS lookups nhưng chậm cập nhật.

Các loại DNS Records quan trọng

Khi cấu hình domain cho ứng dụng, bạn cần biết các record sau:

DNS Records
A Record — Trỏ domain đến IPv4 address
  app.example.com  →  123.45.67.89
  # Dùng cho: trỏ domain chính đến server IP

AAAA Record — Trỏ domain đến IPv6 address
  app.example.com  →  2001:db8::1
  # Dùng cho: hỗ trợ IPv6 (nếu server có)

CNAME Record — Alias, trỏ domain đến domain khác
  www.example.com  →  app.example.com
  # Dùng cho: www redirect, subdomain aliases
  # KHÔNG dùng cho root domain (@)!

MX Record — Mail server
  example.com  →  mail.example.com  (priority: 10)
  # Dùng cho: nhận email cho domain

TXT Record — Text data (verification, SPF, DKIM)
  example.com  →  "v=spf1 include:_spf.google.com ~all"
  # Dùng cho: email authentication, domain verification

CAA Record — Certificate Authority Authorization
  example.com  →  0 issue "letsencrypt.org"
  # Dùng cho: chỉ định CA nào được cấp SSL cho domain
Với deployment đơn giản (1 server), bạn chỉ cần: 1 A record trỏ domain đến server IP, và 1 CNAME trỏ www đến domain chính. Các record khác tùy nhu cầu (email, verification).

Cấu hình cơ bản (không Cloudflare)

Setup đơn giản nhất: domain trỏ thẳng đến server IP, SSL bằng Let's Encrypt:

Browser
HTTPS request
DNS
A record → IP
Server (Nginx)
SSL + Reverse Proxy
DNS Panel (Registrar)
# Ở trang quản lý domain của registrar (Namecheap, GoDaddy, v.v.)
# Thêm các record sau:

Type    Name    Value              TTL
──────────────────────────────────────────────────
A       @       123.45.67.89       300
CNAME   www     app.example.com    300
Bash
# Kiểm tra DNS đã propagate chưa
dig app.example.com +short
# Kết quả: 123.45.67.89

# Hoặc kiểm tra chi tiết
dig app.example.com A

# Kiểm tra từ DNS server cụ thể
dig @8.8.8.8 app.example.com A

# Sau khi DNS propagate, lấy SSL cert
sudo certbot certonly --standalone -d app.example.com
DNS Propagation có thể mất từ vài phút đến 48 giờ (tùy TTL cũ và ISP caching). Dùng công cụ online như dnschecker.org để kiểm tra DNS đã cập nhật toàn cầu chưa.

Cloudflare là gì?

Cloudflare là một reverse proxy + CDN + DDoS protection đặt giữa user và server của bạn. Khi bật Cloudflare, traffic đi qua network của Cloudflare trước khi đến server:

🌐
Browser
HTTPS request
Cloudflare Edge
CDN + WAF + DDoS
💻
Origin Server
Nginx + Docker

Lợi ích

Miễn phí cho plan Free
  • SSL certificate miễn phí, tự động
  • DDoS protection (layer 3, 4, 7)
  • CDN toàn cầu (cache static assets)
  • Ẩn IP thật của server (bảo mật)
  • Web Application Firewall (WAF)
  • Analytics, page rules, rate limiting

Lưu ý

Cần hiểu để tránh lỗi
  • Thêm một layer trung gian (latency nhỏ)
  • SSL config phức tạp hơn (2 hops)
  • Cần cấu hình đúng SSL mode
  • Websocket cần bật riêng
  • Upload file size limit (100MB free plan)
  • Real IP cần header X-Forwarded-For

Cấu hình Cloudflare

Các bước chuyển domain sang Cloudflare:

Bước thực hiện
Bước 1: Tạo tài khoản Cloudflare
  → Đăng ký tại cloudflare.com (miễn phí)
  → Add site: nhập domain (example.com)
  → Cloudflare tự scan DNS records hiện tại

Bước 2: Kiểm tra DNS records
  → Cloudflare hiện danh sách records đã scan
  → Kiểm tra A record trỏ đúng server IP
  → Đảm bảo proxy status là "Proxied" (đám mây cam)

Bước 3: Đổi Nameservers
  → Cloudflare cung cấp 2 nameservers, ví dụ:
    ada.ns.cloudflare.com
    bob.ns.cloudflare.com
  → Vào registrar (Namecheap, GoDaddy, v.v.)
  → Đổi nameservers thành nameservers của Cloudflare
  → Chờ propagate (thường 15 phút - 24 giờ)

Bước 4: Cấu hình SSL/TLS
  → Vào Cloudflare Dashboard → SSL/TLS
  → Chọn encryption mode phù hợp (xem bên dưới)

Proxy Status: Proxied vs DNS Only

Mỗi DNS record trong Cloudflare có thể ở chế độ Proxied (đám mây cam) hoặc DNS Only (đám mây xám):

Proxied (cam)

Traffic đi qua Cloudflare
  • IP thật của server bị ẩn
  • Được CDN, DDoS protection, WAF
  • Cloudflare SSL xử lý HTTPS
  • Dùng cho: web app, API (HTTP/HTTPS)
🖌

DNS Only (xám)

Chỉ resolve DNS, không proxy
  • IP thật của server bị lộ
  • Không có CDN, DDoS, WAF
  • Cần tự quản lý SSL
  • Dùng cho: SSH, mail, non-HTTP services
Không bao giờ bật Proxied cho record dùng cho SSH hoặc mail. Cloudflare chỉ proxy HTTP/HTTPS traffic. Tạo subdomain riêng cho SSH (ví dụ: ssh.example.com) và để ở DNS Only.

SSL/TLS Encryption Modes

Đây là phần quan trọng nhất khi dùng Cloudflare. Chọn sai mode sẽ gây lỗi redirect loop hoặc mất bảo mật:

🚫

Off

Không mã hóa. HTTP only. Không bao giờ dùng cho production.

🔴

Flexible

HTTPS giữa user ↔ Cloudflare. HTTP giữa Cloudflare ↔ server. Không an toàn — traffic từ CF đến server không mã hóa.

🟢

Full

HTTPS cả hai chiều. Server cần SSL cert (tự ký được). Không verify cert validity.

Full (Strict)

Khuyến nghị. HTTPS cả hai chiều. Server cần SSL cert hợp lệ (Let's Encrypt hoặc Cloudflare Origin CA).

Browser
HTTPS
Cloudflare
CF SSL cert
Origin Server
Origin SSL cert
Luôn dùng Full (Strict). Với Let's Encrypt cert đã cấu hình ở trang Security, bạn đã đủ điều kiện. Hoặc dùng Cloudflare Origin CA cert (15 năm, miễn phí) — chỉ hợp lệ khi traffic qua Cloudflare.

Cloudflare Origin CA Certificate

Thay vì Let's Encrypt (cần renew 90 ngày), Cloudflare Origin CA cert có hạn 15 năm và không cần renew:

Bước thực hiện
1. Tạo Origin CA cert trong Cloudflare Dashboard
   → SSL/TLS → Origin Server → Create Certificate
   → Chọn: Let Cloudflare generate a private key
   → Hostnames: *.example.com, example.com
   → Validity: 15 years
   → Create

2. Download certificate và private key
   → Copy "Origin Certificate" → lưu thành origin.pem
   → Copy "Private Key" → lưu thành origin-key.pem
   # LƯU Ý: Private key chỉ hiện MỘT LẦN!

3. Upload lên server
   scp origin.pem origin-key.pem user@server:~/my-app/nginx/ssl/
Nginx
# nginx/nginx.conf — Dùng Cloudflare Origin CA cert
server {
    listen 443 ssl;
    server_name app.example.com;

    # Cloudflare Origin CA certificate
    ssl_certificate     /etc/nginx/ssl/origin.pem;
    ssl_certificate_key /etc/nginx/ssl/origin-key.pem;

    # SSL settings
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # ... proxy config như trang Configuration ...
}
Cloudflare Origin CA cert chỉ hợp lệ khi traffic đi qua Cloudflare proxy (đám mây cam). Nếu bạn tắt proxy (chuyển sang DNS Only), browser sẽ báo lỗi SSL vì cert không được trust bởi public CA.

Lấy Real IP từ Cloudflare

Khi traffic qua Cloudflare, Nginx thấy IP của Cloudflare thay vì client thật. Cần cấu hình để lấy Real IP:

Nginx
# nginx/nginx.conf — Thêm vào block http {}

# Cloudflare IPv4 ranges
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

# Lấy real IP từ header CF-Connecting-IP
real_ip_header CF-Connecting-IP;
Cloudflare gửi IP thật của client qua header CF-Connecting-IP. Danh sách IP ranges của Cloudflare có thể thay đổi — kiểm tra cập nhật tại cloudflare.com/ips.

Cấu hình Cloudflare khuyến nghị

SSL/TLS Settings Security +

Encryption mode: Full (Strict)

Always Use HTTPS: ON — redirect tất cả HTTP sang HTTPS.

Minimum TLS Version: TLS 1.2

Automatic HTTPS Rewrites: ON — tự sửa mixed content (http:// trong trang HTTPS).

HSTS: Bật với max-age 6 tháng, includeSubDomains.

Speed Settings Performance +

Auto Minify: ON cho JS, CSS, HTML — giảm file size.

Brotli: ON — compression tốt hơn gzip.

Early Hints: ON — tăng tốc loading.

Caching Level: Standard.

Browser Cache TTL: Respect Existing Headers (để Nginx quyết định).

Security Settings Protection +

Security Level: Medium (tăng lên High nếu bị tấn công).

Bot Fight Mode: ON — chặn bad bots.

Browser Integrity Check: ON.

Hotlink Protection: ON — ngăn site khác embed hình ảnh của bạn.

Caching cho API Important +

Mặc định Cloudflare không cache API responses (non-static content). Nhưng nên set Page Rule để chắc chắn:

Cloudflare Page Rule
URL: app.example.com/api/*
Setting: Cache Level = Bypass
# Đảm bảo API responses KHÔNG bị cache

URL: app.example.com/static/*
Setting: Cache Level = Cache Everything
Setting: Edge Cache TTL = 1 month
# Cache static assets lâu dài

API responses chứa dữ liệu dynamic — nếu bị cache, users có thể nhận dữ liệu cũ hoặc dữ liệu của người khác.

So sánh: Let's Encrypt vs Cloudflare Origin CA

🔐

Let's Encrypt

Public CA, universal trust
  • Miễn phí, tự động renew
  • Hạn 90 ngày (cần cron renew)
  • Hoạt động có hoặc không có Cloudflare
  • Cần port 80 mở cho challenge
  • Phù hợp khi không dùng Cloudflare

Cloudflare Origin CA

Chỉ hoạt động với CF proxy
  • Miễn phí, hạn 15 năm
  • Không cần renew (set & forget)
  • CHỈ hợp lệ khi traffic qua Cloudflare
  • Không cần mở port 80 cho verification
  • Phù hợp khi luôn dùng Cloudflare
Khuyến nghị: Nếu bạn chắc chắn sẽ dùng Cloudflare lâu dài, dùng Origin CA (đơn giản, không cần cron). Nếu muốn linh hoạt (có thể bỏ Cloudflare), dùng Let's Encrypt.

Lỗi thường gặp với Cloudflare

Redirect loop (ERR_TOO_MANY_REDIRECTS) SSL +

Nguyên nhân: SSL mode đặt "Flexible" + Nginx redirect HTTP → HTTPS. Cloudflare gửi HTTP đến server, Nginx redirect sang HTTPS, Cloudflare nhận HTTPS rồi gửi HTTP lại → loop vô tận.

Fix: Đổi SSL mode sang Full (Strict) và đảm bảo server có SSL cert hợp lệ.

Error 521 (Web server is down) Connection +

Nguyên nhân: Cloudflare không kết nối được đến origin server.

Fix: Kiểm tra: (1) Server có đang chạy không, (2) Nginx listen đúng port, (3) Firewall cho phép IP ranges của Cloudflare, (4) SSL cert trên server hợp lệ.

Error 522 (Connection timed out) Timeout +

Nguyên nhân: Server phản hồi quá chậm (> 15 giây) hoặc firewall block Cloudflare IPs.

Fix: (1) Kiểm tra server load, (2) Whitelist Cloudflare IP ranges trong firewall, (3) Tăng timeout trong Nginx proxy config.

Mixed content warnings HTTPS +

Nguyên nhân: Trang HTTPS load resources qua HTTP (images, scripts, CSS).

Fix: (1) Bật "Automatic HTTPS Rewrites" trong Cloudflare, (2) Sửa code dùng relative URLs (/api/...) thay vì absolute (http://...), (3) Bật "Always Use HTTPS".