Chống DDoS VPS hiệu quả: Chiến lược bảo vệ máy chủ 2026

SSH vào VPS và thấy CPU đứng yên ở rất cao, `ss -tlnp` hiện hàng trăm kết nối SYN từ các IP lạ, và website thì không một ai truy cập được. Đó là lúc bạn hiểu giá trị thật của việc chuẩn bị chống DDoS từ trước. Bài viết này dành cho sysadmin đang vận hành VPS Linux và muốn có một chiến lược bảo vệ thực chiến, không phải lý thuyết suông. Chúng ta sẽ đi qua 3 lớp phòng thủ: chặn ở tầng mạng bằng nftables, giới hạn ở tầng ứng dụng bằng Nginx, và tự động phản hồi bằng CrowdSec, tất cả đều có lệnh cấu hình cụ thể cho Ubuntu 24.04 và Debian 12.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 LTS hoặc Debian 12 với quyền
roothoặc user cósudo. - Nginx đã cài đặt nếu bạn muốn làm theo phần bảo vệ tầng ứng dụng.
- Hiểu cơ bản về TCP/IP, khái niệm handshake 3 bước (SYN, SYN-ACK, ACK) và cách đọc output của
sshoặcnetstat. - Một domain trỏ về VPS nếu bạn muốn kiểm tra cấu hình Nginx ở bước cuối.
Vì sao chống DDoS bắt đầu từ việc hiểu đúng bài toán
Đa số quan niệm sai về DDoS là nghĩ nó chỉ xảy ra với các tập đoàn lớn. Thực tế từ góc nhìn sysadmin vận hành VPS nhỏ lẻ, các cuộc tấn công DDoS lớp 7 (HTTP flood, slowloris) trở nên phổ biến vì kẻ tấn công dùng chính botnet hoặc công cụ có sẵn để tìm các máy chủ có cấu hình yếu. Một VPS nhỏ với Nginx mặc định rất dễ bị hạ gục bởi vài trăm request giả mỗi giây, trong khi đó tấn công lớp 3/4 (SYN flood, UDP flood) thường cần băng thông lớn hơn và thường nhắm vào hạ tầng mạng hơn là một máy chủ đơn lẻ.
Vì vậy, chiến lược đúng không phải là tìm một "viên đạn bạc" chặn mọi thứ, mà là xây dựng nhiều lớp phòng thủ, mỗi lớp xử lý một loại tấn công khác nhau. Lớp ngoài cùng chặn những thứ dễ nhận diện, lớp trong xử lý những thứ tinh vi hơn, và lớp tự động phản hồi giúp bạn không phải thức dậy lúc 3 giờ sáng để xem log.
Tóm tắt nhanh chiến lược 3 lớp
- Lớp 1 - Tầng mạng: dùng nftables để giới hạn tốc độ kết nối SYN, chặn IP đã biết là nguồn tấn công, giới hạn số kết nối đồng thời từ một IP.
- Lớp 2 - Tầng ứng dụng: cấu hình Nginx giới hạn số request mỗi giây từ một IP (
limit_req) và giới hạn kết nối (limit_conn). - Lớp 3 - Tự động phản hồi: dùng CrowdSec để phân tích log, tự động chặn IP tấn công và chia sẻ danh sách IP xấu với cộng đồng.
Lưu ý quan trọng: các lớp này không thay thế giải pháp chống DDoS của nhà cung cấp hạ tầng. Nếu bạn bị tấn công SYN flood với băng thông vài Gbps, không có cấu hình nào trên VPS cứu được bạn vì đường truyền đã nghẽn trước khi gói tin tới máy chủ. Lúc đó bạn cần liên hệ nhà cung cấp để chặn từ phía mạng. Các lớp bên dưới giúp bạn sống sót với các cuộc tấn công ở mức độ phổ biến mà một VPS nhỏ thường gặp.
Bước 1 - Bảo vệ tầng mạng bằng nftables
nftables là firewall mặc định trên Ubuntu 24.04 và Debian 12, thay thế cho iptables. Nó nhanh hơn và cú pháp sạch hơn. Chúng ta sẽ cài đặt và cấu hình để chặn các dạng tấn công tầng mạng phổ biến.
Đầu tiên, cài đặt nftables:
sudo apt update
sudo apt install -y nftables
sudo systemctl enable nftables
sudo systemctl start nftables
Kiểm tra dịch vụ đã chạy:
sudo systemctl status nftables
Output mong đợi có dòng Active: active (running).
Bây giờ tạo file cấu hình chính. Mở file /etc/nftables.conf bằng trình soạn thảo:
sudo nano /etc/nftables.conf
Dán nội dung sau vào file (đây là cấu hình hoàn chỉnh cho VPS Ubuntu 24.04):
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
# Cho phép các kết nối đã thiết lập
ct state established,related accept
# Cho phép loopback
iif lo accept
# Cho phép SSH (port 22), HTTP (80), HTTPS (443)
tcp dport { 22, 80, 443 } accept
# Cho phép ICMP echo request (ping) nhưng giới hạn
icmp type echo-request limit rate 5/second accept
# Chống SYN flood: giới hạn 10 gói SYN mới mỗi giây từ một IP
tcp flags syn tcp dport { 22, 80, 443 } limit rate 10/second burst 20 accept
# Giới hạn số kết nối đồng thời từ một IP (SSH: 3, web: 30)
tcp dport 22 ct count 3 accept
tcp dport { 80, 443 } ct count 30 accept
# Chặn mọi thứ khác
counter drop
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
Kiểm tra cú pháp trước khi áp dụng:
sudo nft -c -f /etc/nftables.conf
Nếu không có output, cú pháp đúng. Áp dụng cấu hình:
sudo systemctl reload nftables
Giải thích ngắn: quy tắc ct state established,related accept cho phép các gói tin thuộc kết nối đã được duyệt (như response từ web server). Quy tắc ct count giới hạn số kết nối đồng thời từ một IP, rất hiệu quả để chặn connection flood. Lưu ý quy tắc giới hạn SYN dùng limit rate, đây là cách chặn SYN flood nhẹ nhưng không ảnh hưởng user thật.
VERIFY: Kiểm tra lại xem quy tắc đã được nạp:
sudo nft list ruleset
Bạn sẽ thấy toàn bộ các chain và quy tắc vừa cấu hình. Thử SSH vào lại từ máy khác để chắc chắn bạn không tự khóa mình ngoài. Nếu bạn đang dùng port SSH khác 22, sửa lại dòng tcp dport { 22, 80, 443 } cho khớp.
Bước 2 - Bảo vệ tầng ứng dụng bằng Nginx
Tấn công HTTP flood gửi rất nhiều request hợp lệ đến web server, khiến Nginx và PHP-FPM cháy CPU. Lớp mạng không thể chặn loại này vì mỗi request đều là một kết nối TCP hợp lệ. Đây là lúc cấu hình Nginx phát huy tác dụng.
Giả sử bạn đã cài Nginx. Mở file cấu hình chính:
sudo nano /etc/nginx/nginx.conf
Thêm vào trong khối http { } các dòng sau để khai báo vùng giới hạn:
# Giới hạn 10 request mỗi giây từ một IP, burst tối đa 20
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
# Giới hạn tối đa 20 kết nối đồng thời từ một IP
limit_conn_zone $binary_remote_addr zone=myconn:10m;
Lưu và đóng file. Tiếp theo, mở file cấu hình của site bạn (ví dụ /etc/nginx/sites-available/example.com):
sudo nano /etc/nginx/sites-available/example.com
Thêm các dòng sau vào trong khối server { } hoặc khối location / { }:
location / {
# Áp dụng giới hạn request
limit_req zone=mylimit burst=20 nodelay;
# Áp dụng giới hạn kết nối
limit_conn myconn 20;
# Các cấu hình khác của location
proxy_pass http://your_backend;
include proxy_params;
}
Kiểm tra cú pháp và reload Nginx:
sudo nginx -t
sudo systemctl reload nginx
nginx -t phải trả về syntax is ok và test is successful.
VERIFY: Giả lập một chút bằng ab (ApacheBench) hoặc wrk để xem server trả về HTTP 503 khi vượt quá giới hạn. Cài apache2-utils để dùng ab:
sudo apt install -y apache2-utils
ab -n 100 -c 30 http://your-domain.com/
Nếu cấu hình đúng, bạn sẽ thấy một số request trả về mã lỗi 503 Service Unavailable, đó là Nginx đã chặn request vượt giới hạn. Con số 10r/s và burst=20 khá hợp lý cho một website thông thường, nhưng nếu site của bạn có traffic tự nhiên cao hơn, hãy tăng lên cho phù hợp.
Bước 3 - Tự động phản hồi bằng CrowdSec
Hai bước trên là phòng thủ tĩnh. Vấn đề là chúng không tự học. Một IP gửi 9 request mỗi giây, gần chạm ngưỡng 10, sẽ không bị chặn dù nó có gửi liên tục trong 3 ngày. CrowdSec giải quyết bài toán này: nó phân tích log (Nginx, SSH, nftables), phát hiện hành vi bất thường, và tự động chặn IP qua nftables. Điểm mạnh của nó là dùng chung danh sách IP xấu với cộng đồng toàn cầu, nên một IP vừa tấn công server ở châu Âu có thể đã bị chặn sẵn trên VPS của bạn ở Việt Nam.
Cài đặt CrowdSec trên Ubuntu 24.04:
sudo apt install -y curl
curl -s https://install.crowdsec.net | sudo sh
sudo apt install -y crowdsec
Sau khi cài, kiểm tra dịch vụ:
sudo systemctl status crowdsec
Cài thêm bộ thu thập log (collector) cho Nginx và bouncer để tự động chặn qua nftables:
sudo cscli collections install crowdsecurity/nginx
sudo cscli parsers install crowdsecurity/nginx-logs
sudo apt install -y crowdsec-firewall-bouncer-nftables
Kích hoạt bouncer:
sudo cscli bouncers add nftables-bouncer
Lệnh trên sẽ in ra một chuỗi API key. Bạn cần cấu hình nó vào file /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml. Mở file và tìm dòng api_key:, thay bằng key vừa nhận được:
sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
Tìm dòng api_key: và thay giá trị. Sau đó khởi động lại bouncer:
sudo systemctl restart crowdsec-firewall-bouncer-nftables
sudo systemctl enable crowdsec-firewall-bouncer-nftables
VERIFY: Xem danh sách quyết định chặn hiện tại:
sudo cscli decisions list
Ban đầu có thể trống. Để kiểm tra nhanh, giả lập một cuộc tấn công SSH brute-force bằng cách đăng nhập sai mật khẩu nhiều lần từ một máy khác, hoặc dùng lệnh sau từ máy đó (thay your-ip bằng IP VPS):
for i in {1..20}; do ssh wrong@your-ip; done
Sau khoảng 30 giây đến 1 phút, chạy lại sudo cscli decisions list trên VPS, bạn sẽ thấy IP của máy vừa tấn công xuất hiện trong danh sách bị chặn. CrowdSec cũng ghi log chi tiết, xem bằng:
sudo journalctl -u crowdsec -f
Xử lý lỗi thường gặp
Lỗi 1: Tự khóa mình ngoài SSH khi cấu hình nftables. Nguyên nhân thường do quy tắc giới hạn kết nối SSH quá thấp (ct count 3) hoặc chặn nhầm port. Cách xử lý: nếu bạn vẫn còn phiên SSH đang mở, sửa lại file cấu hình ngay. Nếu không, dùng tính năng VNC console hoặc tính năng cài lại OS từ trang quản trị của nhà cung cấp VPS. Khi thuê VPS Linux tại thueVPS, bạn có thể dùng tính năng VNC console trong panel để vào máy sửa lại firewall khi bị khóa.
Lỗi 2: Nginx trả về 503 cho cả user thật. Ngưỡng limit_req quá thấp so với traffic thực tế. Xem log lỗi Nginx để xác nhận:
sudo tail -f /var/log/nginx/error.log
Nếu thấy nhiều dòng limiting requests, excess: ... từ nhiều IP khác nhau, hãy tăng rate lên (ví dụ 20r/s) hoặc tăng burst.
Lỗi 3: CrowdSec chặn nhầm IP của chính bạn hoặc proxy. Kiểm tra danh sách chặn và xóa quyết định nếu cần:
sudo cscli decisions delete --ip your-ip
sudo cscli decisions list
Để tránh lặp lại, bạn có thể thêm IP của mình vào danh sách trắng (allowlist) trong cấu hình CrowdSec.
Câu hỏi thường gặp
Chống DDoS trên VPS có thực sự hiệu quả không?
Hiệu quả tùy thuộc vào quy mô tấn công. Với các cuộc tấn công lớp 7 (HTTP flood) và lớp 3/4 ở mức độ vừa phải (dưới vài trăm Mbps), chiến lược 3 lớp nêu trên giúp VPS sống sót tốt. Với tấn công băng thông lớn (nhiều Gbps), bạn cần sự can thiệp từ nhà cung cấp hạ tầng vì đường truyền đã bị nghẽn trước khi gói tin đến máy chủ.
Nên chọn giải pháp nào: nftables, Nginx limit_req hay CrowdSec?
Không nên chọn một, nên dùng cả ba vì chúng xử lý các lớp khác nhau. nftables chặn ở tầng mạng, Nginx xử lý ở tầng ứng dụng, còn CrowdSec tự động hóa việc phát hiện và phản hồi. Kết hợp cả ba tạo thành một hệ thống phòng thủ hoàn chỉnh.
chi phí cho giải pháp tự chống DDoS này là bao nhiêu?
Tất cả các công cụ đều miễn phí và mã nguồn mở: nftables có sẵn trong hệ điều hành, Nginx là phần mềm miễn phí, CrowdSec có bản Community miễn phí cho phép dùng tối đa 2 bouncer. Bạn chỉ tốn thời gian cấu hình ban đầu, khoảng 1-2 giờ cho toàn bộ quy trình trên.
Bị tấn công DDoS lớn khiến VPS sập, xử lý thế nào?
Cách xử lý nhanh nhất là liên hệ nhà cung cấp VPS, nhờ họ chặn từ phía mạng hoặc thay đổi IP. Nếu dịch vụ của bạn có gói VPS trả theo tháng giá rẻ, hãy cân nhắc dùng thêm dịch vụ DNS trung gian như Cloudflare để che IP gốc, giảm nguy cơ bị tấn công trực diện.
Cloudflare có thay thế hoàn toàn được các bước trên không?
Cloudflare xử lý rất tốt tấn công HTTP flood và che IP gốc, nhưng nó không thể bảo vệ các dịch vụ không qua proxy như SSH, và nếu IP gốc bị lộ, mọi lớp bảo vệ của Cloudflare trở nên vô nghĩa. Vì vậy, vẫn nên có các lớp phòng thủ trên VPS.
Bài viết liên quan
- Triển khai tường lửa và chống DDoS hiệu quả cho VPS
- Cấu hình iptables cơ bản cho VPS Ubuntu 24.04
- Cài đặt CrowdSec chống tấn công tự động cho VPS
- 10 cách tăng cường bảo mật VPS Linux chống tấn công 2026


