App nhỏ ít khi bị DDoS thật, nhưng một script gửi vài trăm request mỗi giây là đủ làm sập VPS 1 GB hay đẩy bill serverless lên. Bốn lớp chặn rẻ: Cloudflare phía trước, giới hạn ở reverse proxy, trang tĩnh khi API quá tải, và trần chi tiêu trên serverless.
Câu trả lời ngắn: app nhỏ hiếm khi là mục tiêu của một đợt DDoS hàng trăm Gbps. Nhưng bạn không cần bị tấn công cỡ đó mới sập. Một VPS 1 GB RAM chạy Node.js và Postgres có thể đứng hình chỉ vì vài trăm request mỗi giây vào trang tìm kiếm, từ một con bot cào dữ liệu, một đối thủ khó chịu, hay chính một vòng lặp lỗi trong app di động của bạn.
Với app chạy serverless thì chuyện ngược lại: app không sập, nó tự mở rộng và phục vụ hết, rồi gửi bill.
Nên câu hỏi đúng hơn là: lớp nào rẻ và đáng làm ngay. Có bốn lớp.
1. Đặt Cloudflare (hoặc CDN) phía trước
Theo tài liệu của Cloudflare, chống DDoS được cung cấp không tính theo lưu lượng và không giới hạn cho mọi khách hàng ở mọi gói, cả tầng mạng (L3/L4) lẫn tầng HTTP (L7). Gói miễn phí cũng có. Đây là lớp rẻ nhất bạn có.
Hai chỗ hay làm sai:
IP gốc vẫn lộ. Nếu trước đây tên miền trỏ thẳng về VPS, IP đó nằm trong lịch sử DNS công khai, và hacker gọi thẳng vào IP là đi vòng qua Cloudflare. Sau khi đưa qua Cloudflare, cấu hình tường lửa của VPS chỉ nhận cổng 80, 443 từ dải IP của Cloudflare (danh sách ở cloudflare.com/ips). Một số bản ghi phụ như mail., ftp. trỏ thẳng về cùng IP cũng làm lộ.
Chỉ bật proxy cho tên miền chính. Subdomain api. để “DNS only” (đám mây xám) thì không được bảo vệ.
Cùng lúc, thêm vài rule miễn phí: rate limit cho /api/login và /api/search, bật chế độ thử thách khi đang bị dồn request.
2. Giới hạn ở reverse proxy
Cloudflare chặn được lũ lớn, nhưng một con bot gửi 50 request mỗi giây trông vẫn như người dùng bình thường. Lớp tiếp theo là Nginx (hoặc Caddy, Traefik) trước app:
# /etc/nginx/conf.d/limit.conflimit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;limit_conn_zone $binary_remote_addr zone=conn:10m;server { # khi đứng sau Cloudflare, lấy IP thật của người dùng thay vì IP của Cloudflare # set_real_ip_from <các dải IP của Cloudflare>; real_ip_header CF-Connecting-IP; client_max_body_size 5m; client_body_timeout 10s; location /api/ { limit_req zone=api burst=20 nodelay; limit_conn conn 20; limit_req_status 429; proxy_pass http://127.0.0.1:3000; }}
Mỗi IP được 10 request mỗi giây, dồn tối đa 20, quá thì nhận 429. Nhớ dòng set_real_ip_from khi đứng sau Cloudflare, nếu không mọi người dùng chung vài IP của Cloudflare và bị chặn lẫn nhau.
Ở tầng app, các route tốn kém (tìm kiếm, xuất file, gọi AI) cần giới hạn riêng chặt hơn, theo tài khoản chứ không chỉ theo IP.
3. Trang tĩnh khi API quá tải
Khi API đang ngộp, trang chủ, trang giá, trang giới thiệu vẫn nên mở được. Cách làm:
Trang marketing build tĩnh (Next.js output: 'export', Astro) và để CDN cache. Dù server app chết, khách vẫn thấy trang và số điện thoại liên hệ.
Đặt Cache-Control: public, s-maxage=60 cho các API công khai đọc nhiều (danh sách sản phẩm), để CDN gánh thay database.
Chuẩn bị sẵn một trang “đang bảo trì” tĩnh và cách bật nó trong một phút (Cloudflare có Custom Error Pages, Nginx thì error_page 502 503 504 /maintenance.html;).
4. Trần chi tiêu trên serverless
Vercel, Netlify, AWS Lambda, Cloudflare Workers đều tự mở rộng theo lưu lượng, kể cả lưu lượng rác. Lớp chặn cuối là tiền:
Vercel (Pro): Settings, Billing, Spend Management. Đặt mức chi, và quan trọng là bật Pause Production Deployments. Tài liệu của Vercel nói rõ đặt mức chi thôi thì không dừng được việc tiêu tiền, phải bật tạm dừng. Vercel kiểm mức chi vài phút một lần, nên tiền có thể vượt mức một chút trước khi dừng. Khi dừng, mọi project production trả lỗi 503 tới khi bạn bật lại bằng tay.
AWS Lambda: đặt reserved concurrency cho từng hàm để giới hạn số bản chạy cùng lúc, cộng với AWS Budgets để báo động.
Hàm gọi AI hay gửi email/SMS là chỗ đốt tiền nhanh nhất, cần trần riêng theo người dùng mỗi ngày ngay trong code.
Kiểm tra app của bạn trong vài phút
dig +short app-cua-ban.com. Ra IP của Cloudflare (thường bắt đầu bằng 104. hoặc 172.6x.) là đã qua proxy; ra IP VPS của bạn là chưa.
Từ máy ngoài, curl -I http://<IP VPS>. Trả về trang của app là IP gốc đang mở cho mọi người, cần chặn bằng tường lửa.
Gửi thử 50 request liên tục vào API của chính bạn: for i in $(seq 50); do curl -s -o /dev/null -w "%{http_code}\n" https://app-cua-ban.com/api/search?q=a; done | sort | uniq -c. Không thấy 429 nào là chưa có giới hạn.
Mở trang billing của nền tảng serverless, xem đã có mức chi kèm hành động dừng chưa, hay chỉ có email.
App của bạn đã từng bị một đợt request dồn dập chưa, và bạn phát hiện bằng cách nào? Vào cộng đồng Vibe Code & Bảo Mật kể cho mọi người nghe nhé.
máy chủDDoSCloudflarevibe code/anh/web/app-nho-co-can-chong-ddos-480.webpmáy chủ · DDoS · Cloudflare · vibe code
App nho co can chong DDoS khong App nho it khi bi DDoS that, nhung mot script gui vai tram request moi giay la du lam sap VPS 1 GB hay day bill serverless len. Bon lop chan re: Cloudflare phia truoc, gioi han o reverse proxy, trang tinh khi API qua tai, va tran chi tieu tren serverless. may chu DDoS Cloudflare vibe code Cau tra loi ngan: app nho hiem khi la muc tieu cua mot dot DDoS hang tram Gbps. Nhung ban khong can bi tan cong co do moi sap. Mot VPS 1 GB RAM chay Node.js va Postgres co the dung hinh chi vi vai tram request moi giay vao trang tim kiem, tu mot con bot cao du lieu, mot doi thu kho chiu, hay chinh mot vong lap loi trong app di dong cua ban.
Voi app chay serverless thi chuyen nguoc lai: app khong sap, no tu mo rong va phuc vu het, roi gui bill.
Nen cau hoi dung hon la: lop nao re va dang lam ngay. Co bon lop.

## 1. Dat Cloudflare (hoac CDN) phia truoc
Theo tai lieu cua Cloudflare, chong DDoS duoc cung cap khong tinh theo luu luong va khong gioi han cho moi khach hang o moi goi, ca tang mang (L3/L4) lan tang HTTP (L7). Goi mien phi cung co. Day la lop re nhat ban co.
Hai cho hay lam sai:
- **IP goc van lo.** Neu truoc day ten mien tro thang ve VPS, IP do nam trong lich su DNS cong khai, va hacker goi thang vao IP la di vong qua Cloudflare. Sau khi dua qua Cloudflare, cau hinh tuong lua cua VPS **chi nhan cong 80, 443 tu dai IP cua Cloudflare** (danh sach o `cloudflare.com/ips`). Mot so ban ghi phu nhu `mail.`, `ftp.` tro thang ve cung IP cung lam lo.
- **Chi bat proxy cho ten mien chinh.** Subdomain `api.` de "DNS only" (dam may xam) thi khong duoc bao ve.
Cung luc, them vai rule mien phi: rate limit cho `/api/login` va `/api/search`, bat che do thu thach khi dang bi don request.
## 2. Gioi han o reverse proxy
Cloudflare chan duoc lu lon, nhung mot con bot gui 50 request moi giay trong van nhu nguoi dung binh thuong. Lop tiep theo la Nginx (hoac Caddy, Traefik) truoc app:
```nginx
# /etc/nginx/conf.d/limit.conf
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn:10m;
server {
# khi dung sau Cloudflare, lay IP that cua nguoi dung thay vi IP cua Cloudflare
# set_real_ip_from <cac dai IP cua Cloudflare>; real_ip_header CF-Connecting-IP;
client_max_body_size 5m;
client_body_timeout 10s;
location /api/ {
limit_req zone=api burst=20 nodelay;
limit_conn conn 20;
limit_req_status 429;
proxy_pass http://127.0.0.1:3000;
}
}
```
Moi IP duoc 10 request moi giay, don toi da 20, qua thi nhan 429. Nho dong `set_real_ip_from` khi dung sau Cloudflare, neu khong moi nguoi dung chung vai IP cua Cloudflare va bi chan lan nhau.
O tang app, cac route ton kem (tim kiem, xuat file, goi AI) can gioi han rieng chat hon, theo tai khoan chu khong chi theo IP.
## 3. Trang tinh khi API qua tai
Khi API dang ngop, trang chu, trang gia, trang gioi thieu van nen mo duoc. Cach lam:
- Trang marketing build tinh (Next.js `output: 'export'`, Astro) va de CDN cache. Du server app chet, khach van thay trang va so dien thoai lien he.
- Dat `Cache-Control: public, s-maxage=60` cho cac API cong khai doc nhieu (danh sach san pham), de CDN ganh thay database.
- Chuan bi san mot trang "dang bao tri" tinh va cach bat no trong mot phut (Cloudflare co Custom Error Pages, Nginx thi `error_page 502 503 504 /maintenance.html;`).
## 4. Tran chi tieu tren serverless
Vercel, Netlify, AWS Lambda, Cloudflare Workers deu tu mo rong theo luu luong, ke ca luu luong rac. Lop chan cuoi la tien:
- **Vercel (Pro):** Settings, Billing, Spend Management. Dat muc chi, va quan trong la bat **Pause Production Deployments**. Tai lieu cua Vercel noi ro dat muc chi thoi thi khong dung duoc viec tieu tien, phai bat tam dung. Vercel kiem muc chi vai phut mot lan, nen tien co the vuot muc mot chut truoc khi dung. Khi dung, moi project production tra loi 503 toi khi ban bat lai bang tay.
- **AWS Lambda:** dat reserved concurrency cho tung ham de gioi han so ban chay cung luc, cong voi AWS Budgets de bao dong.
- Ham goi AI hay gui email/SMS la cho dot tien nhanh nhat, can tran rieng theo nguoi dung moi ngay ngay trong code.
## Kiem tra app cua ban trong vai phut
1. `dig +short app-cua-ban.com`. Ra IP cua Cloudflare (thuong bat dau bang `104.` hoac `172.6x.`) la da qua proxy; ra IP VPS cua ban la chua.
2. Tu may ngoai, `curl -I http://<IP VPS>`. Tra ve trang cua app la IP goc dang mo cho moi nguoi, can chan bang tuong lua.
3. Gui thu 50 request lien tuc vao API cua chinh ban: `for i in $(seq 50); do curl -s -o /dev/null -w "%{http_code}\n" https://app-cua-ban.com/api/search?q=a; done | sort | uniq -c`. Khong thay 429 nao la chua co gioi han.
4. Mo trang billing cua nen tang serverless, xem da co muc chi kem hanh dong dung chua, hay chi co email.
---
App cua ban da tung bi mot dot request don dap chua, va ban phat hien bang cach nao? Vao [cong dong Vibe Code & Bao Mat](https://www.facebook.com/groups/1867387324580254) ke cho moi nguoi nghe nhe.
## Nguon
- [About Cloudflare DDoS protection](https://developers.cloudflare.com/ddos-protection/about/), Cloudflare
- [Spend Management](https://vercel.com/docs/spend-management), Vercel
- [Module ngx_http_limit_req_module](https://nginx.org/en/docs/http/ngx_http_limit_req_module.html), nginx
- [Cloudflare IP ranges](https://www.cloudflare.com/ips/), Cloudflare