Hướng dẫn phòng thủ và chống tấn công từ chối dịch vụ DoS / DDoS toàn diện cho Server & Web
Tấn công từ chối dịch vụ (DoS - Denial of Service) và tấn công từ chối dịch vụ phân tán (DDoS - Distributed Denial of Service) luôn là mối đe dọa hàng đầu đối với các hệ thống máy chủ và website. Với sự bùng nổ của các mạng lưới Botnet toàn cầu, các cuộc tấn công DDoS ngày nay không chỉ gia tăng khổng lồ về lưu lượng băng thông (Gbps/Tbps) mà còn ngày càng tinh vi ở tầng ứng dụng.
Bài viết này sẽ trang bị cho bạn kiến thức phòng thủ DoS/DDoS chuyên sâu nhất từ nguyên lý đến thực hành triển khai thực tế trên máy chủ Linux, Web Server (Nginx) và tường lửa WAF/CDN (Cloudflare).
1. Phân biệt DoS và DDoS & Các hình thức tấn công phổ biến

Phân biệt DoS và DDoS:
- DoS (Denial of Service): Xuất phát từ một nguồn duy nhất (1 địa chỉ IP). Mục tiêu là làm quá tải CPU, RAM hoặc cạn kiệt băng thông của máy chủ nạn nhân.
- DDoS (Distributed Denial of Service): Xuất phát từ hàng nghìn đến hàng triệu thiết bị bị chiếm quyền kiểm soát (Botnet) rải rác khắp thế giới. Việc lọc và chặn lưu lượng trở nên vô cùng phức tạp do truy cập đến từ vô số IP hợp lệ.
Phân loại các tầng tấn công (Mô hình OSI):
Tấn công Tầng Mạng & Vận Chuyển (Layer 3 / Layer 4 Volume & Protocol Attacks):
- SYN Flood: Gửi hàng loạt gói tin TCP SYN tạo ra các kết nối nửa mở (half-open connections), làm tràn bộ đệm backlog queue của Linux Kernel.
- UDP / ICMP Flood: Gửi dồn dập gói tin UDP/ICMP làm ngập tràn băng thông (Bandwidth Exhaustion) của đường truyền mạng.
- NTP / DNS Amplification: Khai thác các máy chủ DNS/NTP cấu hình mở để khuếch đại dung lượng gói tin phản hồi gấp hàng chục đến hàng trăm lần hướng về IP nạn nhân.
Tấn công Tầng Ứng Dụng (Layer 7 Application Attacks):
- HTTP / HTTPS Flood: Giả lập hàng loạt yêu cầu
GEThoặcPOSTvào các tài nguyên tốn nhiều CPU/Database (như tính năng tìm kiếm, đăng nhập, xuất báo cáo) để đánh gục cơ sở dữ liệu và Web Server. - Slowloris Attack: Mở hàng nghìn kết nối HTTP và gửi dữ liệu cực kỳ chậm rãi để giữ cho các worker pool của Web Server luôn ở trạng thái bận rộn và không tiếp nhận được truy cập mới.
- HTTP / HTTPS Flood: Giả lập hàng loạt yêu cầu
2. Lớp phòng thủ ngoài cùng: Cloudflare WAF & Anti-DDoS
Sử dụng mạng phân phối nội dung (CDN) tích hợp tường lửa ứng dụng web (WAF) như Cloudflare là giải pháp hiệu quả nhất để đánh chặn cuộc tấn công trước khi lưu lượng độc hại kịp chạm vào máy chủ gốc (Origin Server).

Các bước cấu hình tối ưu trên Cloudflare:
Kích hoạt trạng thái "Under Attack Mode":
- Khi phát hiện lượng Request tăng đột biến hoặc máy chủ có dấu hiệu quá tải, vào bảng điều khiển Cloudflare -> Quick Actions -> Bật Under Attack Mode.
- Cloudflare sẽ buộc mọi truy cập mới phải vượt qua thử thách JavaScript (JS Challenge) hoặc Managed Challenge trước khi được phép gửi Request về máy chủ.
Bảo vệ IP gốc của Máy chủ (Origin IP Protection):
- Đảm bảo biểu tượng đám mây (Proxy Status) trong bản ghi DNS luôn ở trạng thái Proxied (Màu cam).
- Cấu hình tường lửa máy chủ (
ufwhoặciptables) chỉ cho phép nhận kết nối cổng 80/443 từ các dải IP chính thức của Cloudflare.
Cấu hình Rate Limiting & Custom Rules:
- Tạo quy tắc WAF Custom Rules để chặn hoặc Thử thách (Challenge) với các quốc gia không nằm trong tệp người dùng mục tiêu.
- Thiết lập Rate Limiting Rule: Giới hạn tối đa (ví dụ
30 requests / 10 seconds) trên mỗi địa chỉ IP đối với các đường dẫn nhạy cảm như/api/*hoặc/login.
3. Tối ưu Kernel Linux Sysctl chống SYN Flood & Overflow Connection
Khi bị tấn công Layer 3/4 như SYN Flood, Kernel Linux mặc định có thể bị nghẽn do cạn kiệt bảng theo dõi kết nối (conntrack). Hãy tinh chỉnh các thông số trong /etc/sysctl.conf:

Mở file cấu hình Kernel:
sudo nano /etc/sysctl.conf
Thêm hoặc điều chỉnh các tham số tối ưu sau:
# Bật TCP SYN Cookies chống SYN Flood
net.ipv4.tcp_syncookies = 1
# Tăng dung lượng hàng đợi kết nối chưa hoàn tất (SYN Backlog Queue)
net.ipv4.tcp_max_syn_backlog = 20480
# Tăng số lượng kết nối tối đa đang chờ xử lý trong hệ thống
net.core.somaxconn = 65535
# Giảm thời gian FIN TIMEOUT để giải phóng socket nhanh hơn
net.ipv4.tcp_fin_timeout = 15
# Giảm số lần thử lại gói TCP SYN/ACK
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
# Tăng số lượng theo dõi kết nối netfilter conntrack
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 300
Áp dụng cấu hình Kernel ngay lập tức:
sudo sysctl -p
4. Tinh chỉnh Nginx Web Server phòng chống HTTP Flood & Slowloris
Nginx là Web Server có hiệu năng xử lý bất đồng bộ rất cao, nhưng cần được cấu hình giới hạn tần suất truy cập (Rate Limiting) và số lượng kết nối đồng thời để không bị đánh gục bởi HTTP Flood.

4.1 Cấu hình Giới hạn Tần suất (Rate Limiting) trong nginx.conf
Mở file /etc/nginx/nginx.conf:
http {
# Định nghĩa vùng lưu trữ bộ nhớ 10MB để theo dõi IP
# Giới hạn tối đa 10 requests / giây cho mỗi địa chỉ IP
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
# Giới hạn tối đa 20 kết nối đồng thời trên mỗi địa chỉ IP
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
# Tối ưu Timeout chống tấn công Slowloris
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 15s;
send_timeout 10s;
# Giới hạn dung lượng Body Request (Ngăn chặn HTTP Post Flood)
client_max_body_size 10M;
}
4.2 Áp dụng vào Server Block (/etc/nginx/sites-available/default)
server {
listen 80;
server_name keoquy.com;
location / {
# Áp dụng Rate limit với độ hoãn burst=20 và nodelay
limit_req zone=req_limit_per_ip burst=20 nodelay;
limit_conn conn_limit_per_ip 20;
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# Bảo vệ nghiêm ngặt cho trang Đăng nhập / API
location /api/login {
limit_req zone=req_limit_per_ip burst=5 nodelay;
proxy_pass http://localhost:9000;
}
}
Kiểm tra và tải lại cấu hình Nginx:
sudo nginx -t
sudo systemctl reload nginx
5. Tự động Block IP độc hại với Fail2ban & IPTables
Fail2ban tự động giám sát các file Log (Nginx Access Log, Auth Log) và thêm các quy tắc cấm IP vào tường lửa iptables khi phát hiện địa chỉ IP vi phạm ngưỡng truy cập hoặc liên tục nhận mã lỗi HTTP 404, 403, 500.
Cài đặt và cấu hình Fail2ban:
sudo apt update && sudo apt install fail2ban -y
Tạo file cấu hình /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h # Thời gian cấm IP (1 giờ)
findtime = 10m # Khoảng thời gian theo dõi (10 phút)
maxretry = 5 # Số lần vi phạm tối đa
[nginx-req-limit]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
action = iptables-multiport[name=ReqLimit, port="http,https"]
maxretry = 3
findtime = 1m
bantime = 2h
Xem danh sách IP đang bị cấm:
sudo fail2ban-client status nginx-req-limit
6. Tổng kết Checklist Phòng thủ DoS/DDoS Đa Lớp (Defense in Depth)
| Lớp Phòng Thủ | Công Cụ & Giải Pháp | Tác Dụng |
|---|---|---|
| Tầng Edge / WAF | Cloudflare / AWS Shield | Đánh chặn băng thông DDoS lớn (Gbps/Tbps) ở dải mạng toàn cầu trước khi đến Server. |
| Tầng Hệ Điều Hành | Linux Sysctl (tcp_syncookies, somaxconn) |
Ngăn chặn cạn kiệt tài nguyên CPU/RAM do SYN Flood & kết nối nửa mở. |
| Tầng Web Server | Nginx limit_req & limit_conn |
Khống chế tần suất HTTP Flood Layer 7 vào ứng dụng và cơ sở dữ liệu. |
| Tầng Tường Lửa Tự Động | Fail2ban + IPTables / UFW | Quét Log tự động và khóa IP tấn công hoặc vi phạm quy định truy cập. |
Chiến lược phòng thủ DoS/DDoS hiệu quả nhất chính là kết hợp nhiều lớp bảo vệ song song (Defense in Depth). Việc kết hợp Cloudflare WAF phía ngoài, Nginx & Sysctl Kernel ở giữa và Fail2ban chặn IP linh hoạt bên trong sẽ giúp hạ tầng máy chủ của bạn đứng vững trước 99% các cuộc tấn công trên Internet hiện nay.