Khi đưa website ra Internet, nhiều quản trị viên tin rằng chỉ cần bật chế độ Cloudflare Proxy là máy chủ gốc đã an toàn tuyệt đối. Mọi truy cập từ người dùng đều phải đi qua hệ thống lọc của Cloudflare trước khi được chuyển tiếp về VPS.
Thực tế vận hành thường không đơn giản như vậy. Một website dù đã bật Proxy vẫn có thể bị tấn công trực tiếp nếu kẻ xấu tìm ra địa chỉ IP public thật của máy chủ gốc (origin IP). Địa chỉ này có thể bị lộ qua nhiều nguồn: lịch sử phân giải DNS cũ, bản ghi mail server gửi đi để lộ IP máy chủ trong email header, hoặc đơn giản là các công cụ rà quét cổng mạng diện rộng như Censys hay Shodan.
Khi đã biết IP public của VPS, kẻ tấn công không cần gửi lưu lượng qua tên miền. Chúng chỉ cần gửi request HTTP/HTTPS thẳng vào địa chỉ IP của bạn kèm theo header Host: tenmien.com. Lúc này, toàn bộ các quy tắc bảo vệ của Cloudflare như WAF, Rate Limiting hay tính năng chặn bot đều bị vô hiệu hóa hoàn toàn vì lưu lượng không hề đi qua mạng biên của Cloudflare. Máy chủ VPS của bạn buộc phải trực tiếp hứng trọn cuộc tấn công.
Đối chiếu kết nối trực tiếp vào IP bị từ chối và kết nối qua Cloudflare có chứng chỉ hợp lệ.
Giới hạn của việc chỉ whitelist dải IP Cloudflare
Nhiều người quản trị chọn cách cài đặt tường lửa (ufw hoặc nftables) trên VPS để chỉ cho phép các dải IP chính thức của Cloudflare kết nối vào cổng 80 và 443 (như hướng dẫn trong bài về các cổng tường lửa cần mở trên VPS). Cách làm này loại bỏ được các kết nối gửi thẳng từ máy tính của kẻ tấn công, nhưng chưa giải quyết triệt để vấn đề.
Các dải IP của Cloudflare được chia sẻ chung cho toàn bộ khách hàng trên toàn cầu. Điều đó có nghĩa là một kẻ tấn công chỉ cần tạo một tài khoản Cloudflare miễn phí khác, thêm một tên miền phụ bất kỳ và trỏ bản ghi DNS về chính IP public của VPS bạn. Khi gửi yêu cầu qua tên miền rác đó, gói tin vẫn xuất phát từ các IP biên hợp lệ của Cloudflare và dễ dàng đi xuyên qua danh sách whitelist tường lửa trên máy chủ của bạn.
Để máy chủ gốc hoàn toàn miễn nhiễm với kiểu tấn công này, hệ thống cần một cơ chế xác thực danh tính ở mức bắt tay mã hóa: máy chủ chỉ chấp nhận dữ liệu nếu kết nối đó thực sự xuất phát từ chính phiên xử lý được ủy quyền của Cloudflare cho tên miền của bạn. Cơ chế này được gọi là Authenticated Origin Pulls (AOP). Đối với các dịch vụ quản trị khác trên VPS như cổng SSH, bạn có thể kết hợp thêm giải pháp cấu hình Fail2ban trên Linux với nftables để tự động chặn các đợt rà quét từ mạng ngoài.
Authenticated Origin Pulls hoạt động như thế nào?
Về bản chất kỹ thuật, Authenticated Origin Pulls là việc triển khai xác thực TLS hai chiều (Mutual TLS hay mTLS) giữa mạng biên Cloudflare và máy chủ web Nginx trên VPS.
Trong kết nối HTTPS thông thường:
- Chỉ có máy chủ xuất trình chứng chỉ SSL để trình duyệt (hoặc Cloudflare) kiểm tra xem máy chủ có đúng là tên miền đó hay không.
- Máy chủ không yêu cầu client phải chứng minh danh tính bằng chứng chỉ số.
Khi bật Authenticated Origin Pulls:
- Khi Cloudflare kéo dữ liệu từ VPS của bạn (origin pull), máy chủ Nginx sẽ yêu cầu Cloudflare xuất trình chứng chỉ khách hàng (Client Certificate).
- Cloudflare sẽ gửi kèm một chứng chỉ số do chính Certificate Authority (CA) của Cloudflare ký phát.
- Nginx đối chiếu chứng chỉ này với tệp CA gốc đã được lưu sẵn trên máy chủ.
- Nếu kết nối không có chứng chỉ này (trường hợp tấn công trực tiếp vào IP) hoặc chứng chỉ không hợp lệ, Nginx sẽ lập tức ngắt kết nối ngay trong giai đoạn bắt tay TLS và trả về mã lỗi
400 Bad Request. Kẻ tấn công không thể tiếp cận mã nguồn hoặc cơ sở dữ liệu của bạn.
Bước 1: Tải chứng chỉ CA của Cloudflare về VPS
Trước tiên, bạn cần lưu chứng chỉ CA chính thức của Cloudflare vào máy chủ để Nginx dùng làm thước đo đối chiếu.
Tạo một thư mục riêng để lưu trữ chứng chỉ:
sudo mkdir -p /etc/nginx/certs
cd /etc/nginx/certsTải tệp chứng chỉ Authenticated Origin Pull CA do Cloudflare cung cấp công khai:
sudo curl -sS -o /etc/nginx/certs/cloudflare-origin-pull-ca.pem https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pemKiểm tra nội dung tệp chứng chỉ để chắc chắn quá trình tải về không bị lỗi:
openssl x509 -in /etc/nginx/certs/cloudflare-origin-pull-ca.pem -text -noout | grep -E "Issuer:|Subject:"Đầu ra cần hiển thị thông tin phát hành từ Cloudflare:
Issuer: C = US, O = "CloudFlare, Inc.", OU = "CloudFlare Origin SSL Certificate Authority", L = San Francisco, ST = California
Subject: C = US, O = "CloudFlare, Inc.", OU = "CloudFlare Origin Pull CA", L = San Francisco, ST = CaliforniaĐặt quyền đọc an toàn cho tệp để chỉ tài khoản quản trị và Nginx có thể truy cập:
sudo chmod 644 /etc/nginx/certs/cloudflare-origin-pull-ca.pemBước 2: Cấu hình Nginx yêu cầu xác thực chứng chỉ Client
Mở tệp cấu hình virtual host Nginx của tên miền cần bảo vệ (thường nằm tại /etc/nginx/sites-available/tenmien.com hoặc /etc/nginx/conf.d/tenmien.conf):
sudo nano /etc/nginx/sites-available/tenmien.comTìm đến khối server lắng nghe cổng 443 (HTTPS) và bổ sung hai chỉ thị cấu hình mTLS:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# Chứng chỉ SSL của tên miền (Cloudflare Origin Cert hoặc Let's Encrypt)
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# --- KÍCH HOẠT AUTHENTICATED ORIGIN PULLS ---
# Chỉ định tệp chứng chỉ CA tin cậy dùng để đối chiếu
ssl_client_certificate /etc/nginx/certs/cloudflare-origin-pull-ca.pem;
# Bắt buộc client (Cloudflare) phải gửi chứng chỉ hợp lệ
ssl_verify_client on;
# Cấu hình website thông thường
root /var/www/example.com;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
}Kiểm tra tính chính xác của toàn bộ cú pháp Nginx:
sudo nginx -tNếu hệ thống báo syntax is ok và test is successful, nạp lại dịch vụ Nginx:
sudo systemctl reload nginxLưu ý: Ngay sau khi nạp lệnh này trên Nginx, nếu bạn chưa bật tính năng tương ứng trên trang quản trị Cloudflare, các lượt truy cập qua website sẽ tạm thời nhận mã lỗi 525 SSL Handshake Failed. Vì vậy, bạn cần thực hiện Bước 3 ngay sau đó.
Bước 3: Kích hoạt Authenticated Origin Pulls trên Cloudflare
Sau khi Nginx đã sẵn sàng yêu cầu chứng chỉ, bạn đăng nhập vào trang quản trị Cloudflare để kích hoạt chiều gửi chứng chỉ từ phía Cloudflare:
- Chọn tên miền bạn đang cấu hình.
- Tại thanh điều hướng bên trái, vào mục SSL/TLS -> chọn Origin Server.
- Cuộn xuống phần Authenticated Origin Pulls.
- Chuyển nút gạt sang trạng thái On.
Sau khi bật, Cloudflare sẽ ngay lập tức bắt đầu gửi kèm Client Certificate trong mọi yêu cầu kéo dữ liệu gửi về VPS của bạn.
Bước 4: Kiểm tra và xác nhận hiệu quả bảo vệ
Để kiểm tra xem hệ thống đã thực sự chặn được các truy cập lách qua Cloudflare hay chưa, bạn hãy mở một terminal trên máy tính cá nhân (hoặc một máy chủ khác ngoài Internet) và thực hiện hai phép thử đối chiếu:
Phép thử 1: Thử gửi request trực tiếp vào IP public của VPS
Giả lập hành vi của kẻ tấn công bằng cách kết nối thẳng vào địa chỉ IP public của VPS, nhưng gửi kèm header Host của tên miền:
curl -k -I -H "Host: example.com" https://<IP_PUBLIC_CUA_VPS>/Nếu cấu hình thành công, Nginx sẽ từ chối bắt tay TLS và trả về thông báo lỗi:
HTTP/1.1 400 Bad Request
Server: nginx
Date: Sun, 18 Oct 2026 15:15:00 GMT
Content-Type: text/html
Content-Length: 260
Connection: close
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx</center>
</body>
</html>Thông báo No required SSL certificate was sent xác nhận rằng máy chủ đã chặn đứng yêu cầu ngay tại tầng mã hóa TLS trước khi xử lý bất kỳ tài nguyên web nào.
Phép thử 2: Truy cập hợp lệ qua tên miền
Gửi yêu cầu thông thường qua tên miền đã kích hoạt Cloudflare Proxy:
curl -I https://example.com/Kết quả phản hồi bình thường với mã 200 OK:
HTTP/2 200
date: Sun, 18 Oct 2026 15:15:05 GMT
content-type: text/html; charset=UTF-8
server: cloudflare
cf-ray: 991234567890abcd-SGNPhép đối chiếu này chứng minh: người dùng truy cập qua Cloudflare được phục vụ đầy đủ, trong khi mọi nỗ lực quét IP hoặc tấn công trực diện vào máy chủ gốc đều bị chặn đứng hoàn toàn.
Xử lý các sự cố thường gặp
1. Website báo lỗi 525 SSL Handshake Failed sau khi cấu hình
Hiện tượng này thường xảy ra do một trong ba nguyên nhân:
- Bạn đã bật
ssl_verify_client on;trên Nginx nhưng chưa gạt nút Authenticated Origin Pulls sangOntrên Cloudflare Dashboard. - Tệp chứng chỉ
/etc/nginx/certs/cloudflare-origin-pull-ca.pembị trống nội dung do lệnh tải về thất bại. - Chế độ mã hóa SSL/TLS trên Cloudflare đang đặt ở mức
OffhoặcFlexiblethay vìFullhoặcFull (Strict). AOP yêu cầu kết nối giữa Cloudflare và VPS bắt buộc phải chạy qua giao thức HTTPS có mã hóa đầu cuối.
Khi quá trình bắt tay TLS giữa Cloudflare và Nginx thất bại, người dùng sẽ nhận mã lỗi 525 hoặc lỗi 502 Bad Gateway khi Cloudflare không nhận được phản hồi từ upstream Nginx. Bạn nên mở file /var/log/nginx/error.log trên VPS để đọc chính xác thông báo lỗi bắt tay TLS từ client certificate.
2. Sự cố gia hạn chứng chỉ Let's Encrypt qua Certbot
Nếu bạn đang dùng Certbot để cấp chứng chỉ SSL miễn phí cho máy chủ gốc theo cơ chế HTTP-01 challenge (như đã phân tích tại bài viết về Certbot gia hạn SSL thất bại khi bật Cloudflare Proxy):
- Quá trình xác thực HTTP-01 diễn ra trên cổng 80 (HTTP). Vì Authenticated Origin Pulls chỉ được áp dụng trên khối
listen 443 ssl, các yêu cầu xác thực cổng 80 không bị ảnh hưởng bởi chứng chỉ client. - Tuy nhiên, giải pháp tối ưu và bền vững nhất khi máy chủ đã đứng sau Cloudflare là sử dụng Cloudflare Origin CA Certificate (chứng chỉ có thời hạn lên tới 15 năm do Cloudflare cấp riêng cho máy chủ gốc). Khi dùng Origin CA, bạn không cần cài đặt Certbot, không phải lo gia hạn định kỳ 90 ngày và không bao giờ gặp lỗi xung đột với AOP.
Checklist kiểm tra an toàn sau khi hoàn tất
- Tệp chứng chỉ CA của Cloudflare đã được lưu đúng vị trí và có thông tin phát hành từ Cloudflare Origin Pull CA.
- Khối server cổng 443 của Nginx đã có hai dòng chỉ thị
ssl_client_certificatevàssl_verify_client on;. - Tùy chọn Authenticated Origin Pulls trên Cloudflare Dashboard đã chuyển sang trạng thái
On. - Chế độ SSL/TLS trên Cloudflare đang đặt tối thiểu ở mức
FullhoặcFull (Strict). - Đã kiểm tra lệnh
curlgửi thẳng vào IP public của VPS và nhận về phản hồi400 No required SSL certificate was sent.



