close

Cách chống DDoS cho VPS: phòng theo từng lớp và xử lý khi bị tấn công

Tác giả: TinoHost Ngày đăng: 24/06/2024 Chuyên mục: Bảo mật & SSL
Disclosure
Website Tino blog được cung cấp bởi Tino Group. Truy cập và sử dụng website đồng nghĩa với việc bạn đồng ý với các điều khoản và điều kiện trong chính sách bảo mật - điều khoản sử dụng nội dung. Tino Group có thể thay đổi điều khoản sử dụng bất cứ lúc nào. Việc bạn tiếp tục sử dụng Tino blog sau khi thay đổi có nghĩa là bạn chấp nhận những thay đổi đó.
Why Trust Us
Các bài viết với hàm lượng tri thức cao tại Tino blog được tạo ra bởi các chuyên viên Marketing vững chuyên môn và được kiểm duyệt nghiêm túc theo chính sách biên tập bởi đội ngũ biên tập viên dày dặn kinh nghiệm. Mọi nỗ lực của chúng tôi đều hướng đến mong muốn mang đến cho cộng đồng nguồn thông tin chất lượng, chính xác, khách quan, đồng thời tuân thủ các tiêu chuẩn cao nhất trong báo cáo và xuất bản.

Chống DDoS cho VPS là chặn lưu lượng tấn công trước khi nó làm nghẽn đường mạng hoặc làm cạn tài nguyên máy chủ. Một VPS tự cấu hình chỉ xử lý được tấn công nhỏ ở tầng ứng dụng và SYN flood. Tấn công làm đầy băng thông phải được lọc ở phía trước VPS: hệ thống của nhà cung cấp hoặc một dịch vụ proxy như Cloudflare.

Vì vậy một máy chủ ảo VPS cần được phòng theo ba lớp: nhà cung cấp, CDN hoặc reverse proxy, rồi mới đến cấu hình máy chủ. Lệnh mẫu dùng Ubuntu 24.04 và Nginx. Cơ chế tấn công: xem DDoS là gì; các rủi ro khác ngoài DDoS: bảo mật VPS.

VPS chống DDoS (VPS anti DDoS) là gì?

VPS chống DDoS là VPS mà nhà cung cấp lọc lưu lượng tấn công ở tầng mạng trước khi lưu lượng đó tới VPS, thường qua trung tâm lọc (scrubbing) hoặc thiết bị lọc ở biên mạng. Các nhà cung cấp khác nhau ở ngưỡng lọc, loại tấn công được xử lý và cách phản ứng khi vượt ngưỡng.

Cụm “có chống DDoS” không cho biết mức bảo vệ, nên hãy hỏi rõ bốn điều:

  • Lọc ở lớp nào: chỉ tầng mạng (L3/L4: UDP flood, SYN flood, amplification) hay cả tầng ứng dụng (L7: HTTP flood)?
  • Ngưỡng: lọc được bao nhiêu Gbps và bao nhiêu gói mỗi giây (pps), vượt có tính phí không? Tấn công gói nhỏ có thể làm nghẽn thiết bị mạng trước khi chạm ngưỡng Gbps.
  • Khi vượt ngưỡng: có “null-route” (chặn mọi lưu lượng tới IP bị tấn công) không? Khi đó VPS vẫn chạy nhưng không ai truy cập được.
  • Tự động hay thủ công: lọc luôn bật (always-on), chỉ bật khi phát hiện tấn công (on-demand) hay phải mở ticket? Với on-demand, VPS chịu trận trong lúc chờ phát hiện.

Trang VPS NVMe tại Tino ghi Tino áp dụng “hệ thống chống tấn công DDoS, tường lửa bảo mật” (kiểm tra ngày 21/10/2026) nhưng không nêu ngưỡng hay loại tấn công, nên hãy hỏi bộ phận hỗ trợ bốn điểm trên.

VPS thường bị DDoS theo những kiểu nào?

Các cuộc tấn công DDoS vào VPS thường do botnet (mạng thiết bị bị chiếm quyền) gửi từ hàng nghìn IP, và chia thành ba nhóm theo mục tiêu: làm đầy băng thông, làm cạn bảng kết nối của hệ điều hành, hoặc làm quá tải ứng dụng web. Mỗi nhóm cần một lớp phòng thủ khác nhau.

Nhóm tấn côngVí dụThứ bị cạn kiệt
Làm đầy băng thông (volumetric, L3/L4)UDP flood, tấn công khuếch đại qua DNS, NTP, MemcachedĐường truyền vào VPS
Tấn công giao thức (L4)SYN flood, ACK floodHàng đợi kết nối của kernel, CPU
Tầng ứng dụng (L7)HTTP flood vào trang tìm kiếm, wp-login.php, xmlrpc.php; SlowlorisPHP-FPM, database, số kết nối web server
Phân nhóm L3/L4 và L7 theo tài liệu DDoS Protection của Cloudflare. Biện pháp nào xử lý được nhóm nào: xem bảng giới hạn cuối bài.

Theo tài liệu DDoS Protection của Cloudflare, lớp bảo vệ DDoS tiêu chuẩn xử lý cả L3/4 và L7 trên mọi gói, kể cả gói Free, với điều kiện lưu lượng đi qua Cloudflare.

Làm sao biết VPS đang bị DDoS?

Dấu hiệu rõ nhất là website chậm hoặc không truy cập được trong khi CPU, RAM của ứng dụng không đổi. Đi kèm thường là băng thông vào tăng vọt không khớp lượng khách thật, ping mất gói, nhiều kết nối SYN-RECV, log web server đầy request lặp lại từ nhiều IP lạ, hoặc nhà cung cấp báo IP bị null-route.

Xác nhận nhanh bằng các lệnh dưới (log Nginx mặc định trên Ubuntu):

# Tổng quan kết nối TCP theo trạng thái
ss -s

# Số kết nối đang chờ bắt tay (SYN-RECV); hàng trăm, hàng nghìn là bất thường
ss -n state syn-recv | wc -l

# Kernel có cảnh báo SYN flood không
sudo journalctl -k --since "1 hour ago" | grep -i "syn flooding"

# 10 IP gửi nhiều request nhất trong log truy cập Nginx
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

# 10 URL bị gọi nhiều nhất
sudo awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

# Lưu lượng vào/ra của card mạng (chạy 2 lần cách nhau vài giây để so sánh)
ip -s link show

Đường truyền đã đầy thì SSH cũng chập chờn: vào máy bằng console của nhà cung cấp (ví dụ Web Console noVNC) và báo nhà cung cấp ngay.

Cách chống DDoS cho VPS theo từng lớp

Chống DDoS cho VPS hiệu quả khi kết hợp ba lớp: nhà cung cấp lọc tấn công lớn ở tầng mạng, CDN hoặc reverse proxy che IP thật và lọc tấn công HTTP, còn máy chủ tự giới hạn request và kết nối. Lọc càng sớm, VPS càng ít phải gánh.

Sơ đồ đường đi lưu lượng DDoS tới VPS: botnet và khách thật đi qua lớp 1 nhà cung cấp (lọc UDP flood, khuếch đại DNS/NTP, SYN flood lớn, vượt ngưỡng có thể null-route cả IP), lớp 2 Cloudflare đám mây cam (lọc HTTP flood L7 và L3/4 vào cổng web, chỉ cổng HTTP/HTTPS), lớp 3 UFW và SYN cookies (SYN flood nhỏ, IP ngoài dải Cloudflare; gói bị DROP vẫn chiếm băng thông), lớp 3 Nginx và Fail2ban (limit_req trả 429, Slowloris timeout 10s, cần IP thật qua CF-Connecting-IP) rồi mới tới PHP-FPM và database; đường tắt màu cam: IP gốc bị lộ qua lịch sử DNS, bản ghi MX hoặc đám mây xám thì tấn công đi thẳng vào VPS, bỏ qua lớp 2; băng thông đầy ở lớp 1 thì mọi lớp sau vô dụng

Lớp 1: Hạ tầng nhà cung cấp và mạng

Lớp nhà cung cấp là lớp duy nhất xử lý được tấn công làm đầy băng thông, vì lưu lượng bị lọc trước khi vào đường truyền của VPS. Lưu sẵn kênh hỗ trợ và thông tin VPS (IP, mã dịch vụ) để báo nhanh, và dùng tường lửa mạng của nhà cung cấp (nếu có) để đóng cổng không dùng.

Lớp 2: Đặt website sau Cloudflare hoặc CDN có lọc DDoS

Cloudflare là reverse proxy: khách kết nối tới Cloudflare, Cloudflare lọc rồi mới chuyển request hợp lệ về VPS. Khi bản ghi DNS bật proxy (đám mây màu cam), người tra cứu tên miền chỉ thấy IP của Cloudflare. Lớp này chỉ có tác dụng khi kẻ tấn công không biết IP gốc; IP lộ qua lịch sử DNS hoặc mail server thì tấn công gửi thẳng vào VPS (Cloudflare docs). Xem thêm Cloudflare là gì và CDN là gì.

  • Bật proxy cho mọi bản ghi web (A, AAAA, CNAME của tên miền chính và www); bản ghi đám mây xám trả về IP thật.
  • Không gửi mail từ IP của website, vì bản ghi MX dễ làm lộ IP gốc. IP cũ đã lộ thì đổi IP, vì lịch sử DNS vẫn lưu.
  • Chỉ nhận lưu lượng web từ IP Cloudflare ở VPS. Danh sách tại cloudflare.com/ips thay đổi theo thời gian, cần cập nhật định kỳ.
  • Chỉ cổng HTTP/HTTPS được proxy: Cloudflare proxy các cổng web như 80, 443, 8080, 8443… (danh sách cổng). SSH, game server, VPN hay mail không đi qua proxy; muốn bảo vệ các dịch vụ này cần Cloudflare Spectrum (có trên gói trả phí với một số giao thức; ứng dụng TCP/UDP tuỳ ý cần gói Enterprise) hoặc dịch vụ lọc của nhà cung cấp.

Lệnh UFW dưới chỉ cho dải IP Cloudflare vào cổng 80/443. Chạy sau khi đã mở SSH và website đã chạy qua Cloudflare. Chỉ xoá quy tắc mở 80/443 cho mọi nơi (“Nginx Full” hoặc 80/tcp, 443/tcp) khi đã thấy đủ quy tắc “cloudflare”, nếu không website bị chặn hoàn toàn.

Thứ tự an toàn khi khoá IP gốc chỉ cho Cloudflare, kèm kết quả kiểm tra: 1 mở SSH trong UFW, ufw status có OpenSSH; 2 bật đám mây cam cho mọi bản ghi web, tra DNS chỉ ra IP Cloudflare; 3 tải dải IP về /tmp/cf-ips, wc -l khoảng 20 dòng, ra 0 thì dừng; 4 thêm quy tắc cloudflare cho TCP 80, 443, ufw status numbered đủ quy tắc; 5 mới xoá Nginx Full, web vẫn mở được qua tên miền; 6 khôi phục IP thật bằng realip và CF-Connecting-IP trước khi bật rate limit, Fail2ban, access.log ghi IP khách
# 1. Tải danh sách dải IP Cloudflare về file và kiểm tra
{ curl -fsS https://www.cloudflare.com/ips-v4; echo; curl -fsS https://www.cloudflare.com/ips-v6; echo; } \
  | grep -E '^[0-9a-f:.]+/[0-9]+$' > /tmp/cf-ips
wc -l < /tmp/cf-ips      # phải có khoảng 20 dòng; nếu ra 0 thì DỪNG, không làm tiếp

# 2. Thêm quy tắc cho từng dải
for ip in $(cat /tmp/cf-ips); do
  sudo ufw allow proto tcp from "$ip" to any port 80,443 comment "cloudflare"
done

# 3. Thấy đủ quy tắc "cloudflare" rồi mới xoá quy tắc mở 80/443 cho mọi IP
sudo ufw status numbered
sudo ufw delete allow 'Nginx Full'

Nginx chạy trong Docker và publish cổng 80/443 thì quy tắc UFW không áp dụng cho các cổng đó (xem FAQ).

Sau Cloudflare, log Nginx ghi IP Cloudflare thay vì IP khách. Lấy lại IP thật bằng ngx_http_realip_module với header CF-Connecting-IP (Cloudflare docs) trước khi bật rate limit và Fail2ban, nếu không sẽ chặn nhầm Cloudflare.

# /etc/nginx/conf.d/cloudflare-realip.conf
# Mỗi dải IP Cloudflare một dòng set_real_ip_from (lấy từ cloudflare.com/ips)
set_real_ip_from 173.245.48.0/20;
# ... các dải còn lại ...
real_ip_header CF-Connecting-IP;

Lớp 3: Cấu hình máy chủ (Nginx, kernel, Fail2ban)

Cấu hình trên VPS giúp chống HTTP flood nhỏ, Slowloris và SYN flood mức thấp khi lớp phía trước để lọt; nó không cứu được VPS khi đường truyền đã đầy.

Giới hạn tốc độ request trong Nginx. limit_req giới hạn số request mỗi giây theo IP; limit_conn giới hạn số kết nối đồng thời (tài liệu nginx). Vai trò của Nginx: xem Nginx là gì. Đổi mã từ chối mặc định 503 sang 429 để dễ phân biệt trong log. Áp mức chặt cho URL tốn tài nguyên, không áp cho file tĩnh.

# Trong khối http { } (ví dụ /etc/nginx/conf.d/limit.conf)
limit_req_zone  $binary_remote_addr zone=dong:10m rate=5r/s;
limit_req_zone  $binary_remote_addr zone=dangnhap:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=ketnoi:10m;
limit_req_status 429;
limit_conn_status 429;

# Giảm thời gian chờ để chống Slowloris (mặc định 60s)
client_header_timeout 10s;
client_body_timeout   10s;

# Trong khối server { } của website
limit_conn ketnoi 20;

location = /wp-login.php {
    limit_req zone=dangnhap burst=3 nodelay;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

location ~ \.php$ {
    limit_req zone=dong burst=20 nodelay;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

# Kiểm tra rồi nạp lại
sudo nginx -t && sudo systemctl reload nginx

Các số rate, burst, limit_conn là điểm khởi đầu: quá chặt sẽ chặn nhầm người dùng chung IP (văn phòng, mạng di động), nên theo dõi log vài ngày rồi chỉnh. Timeout mặc định theo ngx_http_core_module; socket PHP-FPM tuỳ phiên bản PHP.

Bật SYN cookies trong kernel. SYN cookies giúp kernel tiếp tục nhận kết nối hợp lệ khi hàng đợi SYN bị đầy. Theo tài liệu kernel Linux, tcp_syncookies mặc định là 1. Kiểm tra lại vì một số image VPS đã chỉnh; có thể tăng hàng đợi và giảm số lần gửi lại SYN-ACK (mặc định 5).

# Xem giá trị hiện tại
sysctl net.ipv4.tcp_syncookies net.ipv4.tcp_max_syn_backlog net.ipv4.tcp_synack_retries

# Ghi cấu hình riêng rồi nạp
sudo tee /etc/sysctl.d/90-chong-syn-flood.conf > /dev/null <<'EOF'
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
EOF
sudo sysctl --system

Tự chặn IP vượt giới hạn bằng Fail2ban. Bộ lọc có sẵn nginx-limit-req đọc log lỗi của Nginx và khoá IP bị limit_req từ chối nhiều lần (Fail2ban GitHub). Cài Fail2ban và jail SSH: xem bảo mật VPS Ubuntu.

Ubuntu 24.04 đặt Fail2ban đọc journal mặc định (backend = systemd). Jail đọc file log như Nginx phải ghi backend = auto kèm logpath, nếu không jail báo đang chạy nhưng không bao giờ chặn.

sudo tee /etc/fail2ban/jail.d/nginx-limit-req.local > /dev/null <<'EOF'
[nginx-limit-req]
enabled  = true
# Ubuntu 24.04 đặt backend = systemd mặc định; Nginx ghi log ra file nên jail này phải đọc file
backend  = auto
port     = http,https
logpath  = /var/log/nginx/error.log
findtime = 10m
maxretry = 10
bantime  = 1h
EOF
sudo fail2ban-client -t && sudo systemctl restart fail2ban
# Dòng "File list" phải có /var/log/nginx/error.log
sudo fail2ban-client status nginx-limit-req

Website sau Cloudflare thì Fail2ban chặn ở tường lửa VPS không có tác dụng, vì kết nối tới từ IP Cloudflare; hãy chặn bằng quy tắc WAF hoặc rate limiting trên Cloudflare.

Giới hạn tần suất kết nối SSH. UFW là công cụ quản lý tường lửa trên Ubuntu; ufw limit từ chối IP mở từ 6 kết nối trở lên trong 30 giây (man ufw), giúp giảm dò mật khẩu chứ không chống DDoS băng thông. Đã đổi cổng SSH thì dùng sudo ufw limit 2222/tcp (thay bằng cổng của bạn).

sudo ufw limit OpenSSH
sudo ufw status

VPS đang bị DDoS: xử lý theo thứ tự nào?

Khi VPS đang bị DDoS, việc đầu tiên là xác nhận đúng là tấn công và báo nhà cung cấp, vì chỉ họ chặn được lưu lượng trước khi vào VPS. Sau đó mới bật phòng thủ trên Cloudflare, chặn tạm trên máy chủ và ghi lại bằng chứng.

Timeline 6 bước khi VPS đang bị DDoS, kèm kết quả cần thấy và việc cần tránh: 1 xác nhận tấn công, thấy SYN-RECV hàng nghìn, vài IP hoặc một URL chiếm phần lớn log, tránh nhầm với bot quét hay plugin lỗi; 2 báo nhà cung cấp, họ xác nhận đang lọc hoặc báo null-route, tránh khởi động lại liên tục và nâng CPU RAM; 3 bật Under Attack mode, khách thấy trang kiểm tra trình duyệt, tránh bật lâu cho mọi đường dẫn làm chặn API, webhook; 4 chặn tạm, thấy mã 429 và IP trong fail2ban-client status, tránh chặn IP ở UFW khi web sau Cloudflare; 5 đổi IP gốc nếu lộ, tra DNS chỉ ra IP Cloudflare, tránh gửi mail từ IP mới; 6 lưu log và rà lại, tránh xoá log và quên tắt Under Attack
  • Xác nhận: chạy các lệnh ở phần dấu hiệu; loại trừ bot, plugin lỗi, khách tăng thật.
  • Báo nhà cung cấp: gửi IP, thời điểm, loại lưu lượng (UDP, SYN, HTTP), ảnh biểu đồ băng thông; hỏi IP có bị null-route không.
  • Bật Under Attack mode nếu web đã sau Cloudflare; có thể chỉ áp cho đường dẫn bị nhắm. Chế độ này kiểm tra thêm trình duyệt để lọc L7 và hiện trang chờ, nên Cloudflare coi là biện pháp cuối (Cloudflare docs).
  • Chặn tạm trên VPS: siết limit_req cho URL bị nhắm, chặn IP nổi bật (sudo ufw insert 1 deny from IP_TAN_CONG), tắt tạm tìm kiếm, xmlrpc.php.
  • Đổi IP nếu IP gốc đã lộ: chỉ khai báo IP mới ở bản ghi có bật proxy, không gửi mail từ IP đó.
  • Rà soát sau sự cố: lưu log, tìm chỗ lộ IP gốc, đóng cổng thừa, chỉnh ngưỡng rate limit.

Đừng khởi động lại VPS liên tục hay nâng cấu hình khi bị tấn công băng thông: tài nguyên máy chủ không phải điểm nghẽn.

Mỗi biện pháp chống DDoS có giới hạn gì?

Không biện pháp đơn lẻ nào chặn được mọi kiểu DDoS. Mỗi biện pháp chỉ xử lý một nhóm tấn công và đa số phụ thuộc vào lớp phía trước: lọc trên VPS vô ích khi đường truyền đã đầy, Cloudflare vô ích khi IP gốc đã lộ.

Biện phápGiúp đượcKhông giúp được
Lọc DDoS của nhà cung cấpTấn công băng thông và giao thức ở tầng mạngHTTP flood giống khách thật (tuỳ hệ thống); vượt ngưỡng có thể bị null-route
Cloudflare (proxy bật)HTTP flood, tấn công L3/4 vào cổng web; ẩn IP gốcSSH, game, mail nếu không dùng Spectrum; tấn công vào IP gốc đã lộ
Rate limit Nginx (limit_req, limit_conn)HTTP flood nhỏ, dò mật khẩu, bot quétTấn công băng thông; tấn công phân tán rộng, mỗi IP gửi ít request
SYN cookies, tinh chỉnh sysctlSYN flood mức thấp làm đầy hàng đợi kết nốiSYN flood đủ lớn để lấp đường truyền
Fail2banIP lặp lại hành vi xấu trong logTấn công từ hàng chục nghìn IP; mạng đã nghẽn; khách sau Cloudflare
UFW, iptables, nftables trên VPSĐóng cổng không dùng, chặn IP cụ thểLưu lượng đã tới card mạng vẫn chiếm băng thông dù bị DROP
Nâng cấp CPU, RAM, băng thôngChịu tốt hơn khi lượng truy cập thật tăngKhông thay được lọc; kẻ tấn công tăng quy mô nhanh hơn chi phí bạn nâng
Tổng hợp từ tài liệu Cloudflare, nginx, kernel Linux và Fail2ban (truy cập 21/10/2026). Nhận định “không giúp được” là phân tích của Blog Tino.

DDoS làm gián đoạn dịch vụ, không trực tiếp đọc hay xoá dữ liệu. Thấy tiến trình hoặc tài khoản lạ là sự cố xâm nhập: xem dấu hiệu và cách xử lý VPS bị xâm nhập và khôi phục từ bản sao lưu VPS.

Khi nào cần dịch vụ chống DDoS trả phí, khi nào chưa cần?

Website nhỏ, blog, trang giới thiệu doanh nghiệp chịu được gián đoạn vài giờ thường chưa cần gói chống DDoS trả phí riêng: lớp lọc sẵn có của nhà cung cấp, Cloudflare gói Free và Nginx cơ bản đã đủ, ưu tiên ẩn IP gốc.

Nên cân nhắc gói trả phí cho game server, dịch vụ ngoài HTTP, thương mại điện tử mùa cao điểm, dịch vụ đã bị tấn công lặp lại hoặc bị tống tiền bằng DDoS. Hỏi rõ ngưỡng lọc, cam kết bằng văn bản và phí vượt ngưỡng.

Mới bắt đầu quản trị máy chủ: xem hướng dẫn sử dụng VPS. Khi chọn gói VPS tại Tino, hỏi bộ phận hỗ trợ 24/7 về phạm vi chống DDoS trước khi đặt mua.

Câu hỏi thường gặp về chống DDoS cho VPS

Phần mềm chống DDoS cho VPS nào nên dùng?

Trên VPS Linux thường dùng limit_req, limit_conn của Nginx, Fail2ban, UFW hoặc nftables và SYN cookies. Các công cụ này chỉ xử lý tấn công nhỏ; tấn công làm đầy băng thông phải do nhà cung cấp hoặc Cloudflare lọc.

VPS chạy Docker có bị UFW bỏ qua khi chống DDoS không?

Có. Docker tự ghi quy tắc iptables cho cổng publish bằng -p, nên lưu lượng vào container đi qua trước các quy tắc UFW (Docker docs; cơ chế container: Docker là gì). Muốn lọc, chỉ publish cổng vào 127.0.0.1 rồi để Nginx trên máy chủ làm reverse proxy, hoặc thêm quy tắc vào chain DOCKER-USER.

Có nên tự chặn cả dải IP quốc gia khi bị tấn công không?

Chỉ nên dùng tạm, khi tấn công tập trung ở vài quốc gia không có khách thật. Chặn theo quốc gia bằng quy tắc WAF của Cloudflare tốt hơn trên VPS, vì gói bị DROP trên VPS vẫn chiếm băng thông. Botnet thường phân tán nhiều nước, và khách dùng VPN hoặc đang ở nước ngoài sẽ bị chặn nhầm.

Chia sẻ một chút thông tin về bạn. Những thông tin này có thể được công khai.

Xem thêm bài viết

Bài viết liên quan