---
id: case-cloudflare
title: "Cloudflare đứng trước app"
shortTitle: "Cloudflare"
track: cases
trackTitle: "Tình huống vận hành"
order: 17
level: important
status: published
estimatedMinutes: 35
prerequisites:
  - case-ddos
  - serverless-edge
next: case-permissions
reviewedAgainst: 2026-10-12
sources:
  - title: "Cloudflare SSL/TLS encryption modes"
    url: https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/
  - title: "Cloudflare IP addresses"
    url: https://developers.cloudflare.com/fundamentals/concepts/cloudflare-ip-addresses/
  - title: "Cache-Control and Cloudflare"
    url: https://developers.cloudflare.com/cache/concepts/cache-control/
---

# Cloudflare đứng trước app

Cloudflare là proxy và CDN đứng trước origin. User nói chuyện với Cloudflare, và origin chỉ nên nhận traffic đã đi qua lớp đó. Bài Workers trước đã nói về runtime ở biên. Bài này nói về cách đặt cả site sau Cloudflare mà không cache nhầm dữ liệu của user đã đăng nhập.

## Để làm gì

Bạn sẽ bật proxy cho các hostname public, chọn đúng chế độ TLS, cache đúng loại response, và khóa origin để không ai đi vòng qua Cloudflare.

## Gồm những gì

- Bản ghi DNS có bật proxy.
- SSL mode Full (strict); không dùng Flexible cho app thật.
- Cache file tĩnh, bypass API có cookie.
- Firewall của origin chỉ nhận dải IP của Cloudflare.

Bài không viết Worker và không mua thêm sản phẩm. Đừng trỏ SSH hay database qua proxy HTTP.

## Dùng khi nào

Site public cần TLS, cần cache file tĩnh, và cần một chỗ để đặt WAF hoặc rate limit. Bài DDoS dùng chính lớp này khi đang bị tấn công.

App nội bộ chỉ dành cho nhân viên và đã đi qua VPN thì không cần đưa ra Cloudflare rồi lại tìm cách khóa lại. Thêm một proxy là thêm một chỗ có thể cấu hình sai.

## Kiến thức cốt lõi

Khi bản ghi A hoặc CNAME bật proxy, client nhận IP của Cloudflare chứ không nhận IP origin. Khi tắt proxy, client đi thẳng tới origin, và không rule WAF nào áp lên request đó.

TLS có nhiều mode. Docs SSL của Cloudflare mô tả mode Flexible là Cloudflare nói HTTPS với client nhưng nói HTTP với origin, nên ai đứng giữa đoạn Cloudflare tới origin cũng đọc được nội dung. App production cần dùng Full (strict): cả hai đoạn đều là HTTPS, và certificate của origin phải hợp lệ với hostname. Certificate tự ký sẽ không qua được strict, và đó là chủ ý.

Origin vẫn có IP riêng, và ai biết IP đó thì đi vòng qua được Cloudflare. Firewall của máy hoặc security group chỉ nên cho dải IP Cloudflare vào cổng 443, cùng với health check nội bộ nếu có. Danh sách IP trên trang IP addresses của Cloudflare có thể thay đổi, nên phải có người cập nhật, đừng chép một lần rồi để đó năm năm. Một cách khác là Authenticated Origin Pulls: origin kiểm tra client certificate do Cloudflare gửi. Dù chọn cơ chế nào, hãy thử gọi từ một IP không thuộc Cloudflare; request đó phải bị từ chối.

Cache:

| Response | Cách xử lý |
| --- | --- |
| CSS, JS, ảnh, có `Cache-Control: public` | Cache ở biên |
| HTML của user đã đăng nhập | `Cache-Control: private` hoặc bypass |
| API POST, và API GET theo cookie | Không cache |
| `/health` | Không dùng làm bằng chứng origin còn sống nếu edge tự trả lời |

Cache nhầm một response có `Set-Cookie` là phát session của người này cho người khác. Khi không chắc, hãy bypass. Đọc header `CF-Cache-Status` trên response: `HIT` nghĩa là edge đã trả từ cache, còn `DYNAMIC` hoặc `BYPASS` nghĩa là response không lấy từ cache đó.

Nếu app không đọc `CF-Connecting-IP`, log của app sẽ chỉ thấy IP của Cloudflare. Header này chỉ đáng tin khi request thật sự đi qua Cloudflare. Nếu origin còn mở cho cả Internet, client có thể tự giả header này. Vì vậy hãy khóa nguồn trước, rồi mới tin header.

Khi kiểm tra một site đã đặt sau Cloudflare, đi theo thứ tự: header của response trước, rồi chế độ TLS, rồi trạng thái cache của các URL nhạy cảm, cuối cùng là thử gọi thẳng origin từ IP lạ. Header cho biết request có thật sự đi qua Cloudflare không; nếu không qua, mọi cấu hình phía sau đều chưa có tác dụng. Bước gọi thẳng origin để cuối vì nó xác nhận lớp bảo vệ cuối cùng, và kết quả phải là bị từ chối.

## Lệnh và code mẫu

Kiểm tra xem edge có đứng trước `example.com` không:

```bash
curl -sSI https://example.com/ | awk 'BEGIN{IGNORECASE=1} /HTTP\/|server:|cf-cache-status:|cf-ray:/'
```

Có `server: cloudflare` và `cf-ray` nghĩa là response đã đi qua Cloudflare. Nếu không có hai dòng đó, proxy chưa được áp cho hostname này, hoặc bạn đang gọi thẳng vào origin.

Bài không có lệnh tạo zone mới, vì việc đó cần tài khoản và domain của bạn, không làm trong lab chung.

## Thực hành

1. Gọi `curl -sSI` tới một site bạn biết đang dùng Cloudflare. Nếu không có mạng, bỏ qua bước này.
2. Ghi mode TLS cho một app có đăng nhập: Full (strict). Viết một câu giải thích vì sao Flexible không đủ.
3. URL `/account` trả HTML theo cookie. Ghi header bạn muốn có: `Cache-Control: private, no-store`.
4. Viết cách kiểm tra origin: từ một IP lạ, cổng 443 bị từ chối; từ Cloudflare, request vào được.

## Kết quả mong đợi

Bạn chỉ ra được hostname nào đi qua proxy, đang dùng mode TLS nào, và URL nào không được cache. Origin không còn là cửa sau.

## Checklist

- [ ] Hostname public đã bật proxy. SSH và database không đi qua proxy HTTP.
- [ ] SSL Full (strict), và certificate của origin còn hạn.
- [ ] Response có cookie đăng nhập không nằm trong cache của edge.
- [ ] Firewall origin chỉ nhận Cloudflare, và danh sách IP có người chịu trách nhiệm cập nhật.
- [ ] App chỉ lấy IP client từ header sau khi nguồn đã bị khóa.

## Lỗi thường gặp

**Cache toàn bộ HTML cho nhanh.** Trang account của user A hiện ra cho user B. Hãy bypass HTML có cookie, và chỉ cache file tĩnh có hash trong tên.

**Trỏ origin về chính hostname đang bật proxy.** Cloudflare gọi hostname, hostname lại trỏ về Cloudflare, và request quay vòng mãi. Origin phải dùng địa chỉ nội bộ hoặc một hostname chỉ resolve ở phía server, theo đúng hướng dẫn DNS của Cloudflare.

**Sửa WAF trên Cloudflare trong khi monitor vẫn gọi thẳng IP cũ.** Bạn tưởng đã chặn, nhưng monitor vẫn trả 200 vì đi bằng cửa sau. Hãy khóa IP đó lại.

## Nguồn

1. [SSL/TLS encryption modes](https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/) — Flexible, Full, và Full (strict).
2. [Cloudflare IP addresses](https://developers.cloudflare.com/fundamentals/concepts/cloudflare-ip-addresses/) — dải IP để khóa origin.
3. [Cache-Control](https://developers.cloudflare.com/cache/concepts/cache-control/) — header nào được cache.

## Tiếp theo

[App lỗi vì quyền file](./18-permissions.md)
