OffshoreVps
Bảo mật13 thg 10 20268 phút đọcBởi đội ngũ OffshoreVps

Chống DDoS tầng 7 cho VPS với Nginx

Chống DDoS ở cấp máy chủ chặn được lũ lưu lượng thô, không chặn được các yêu cầu tinh vi. Thêm giới hạn tốc độ, bộ nhớ đệm và quy tắc chống bot với Nginx và fail2ban để vượt qua các cuộc tấn công tầng ứng dụng.

Hầu hết các gói lưu trữ đều hứa hẹn chống DDoS. Điều đó thường có nghĩa là lọc các đợt tràn gói tin rác lớn (tầng 3 và 4) trước khi chúng đến máy chủ của bạn. Nó không ngăn được một nghìn trình duyệt "thật" cùng lúc tải trang chậm nhất của bạn. Các cuộc tấn công tầng ứng dụng (tầng 7) này trông giống khách truy cập bình thường và bạn phải tự xử lý. Xem chống DDoS là gì để biết thêm bối cảnh.

Cửa sổ terminal trên VPS hiển thị các lệnh dùng để phòng thủ DDoS tầng 7 bằng Nginx
Loại lệnh bạn sẽ chạy trên máy chủ của mình trong hướng dẫn này.

Hiểu sự khác biệt

  • Tràn lưu lượng (volumetric): làm đầy đường truyền mạng. Nhà cung cấp lưu trữ hoặc tuyến thượng nguồn sẽ lọc chúng.
  • Tấn công giao thức: làm cạn bảng kết nối. Chủ yếu do mạng xử lý.
  • Tấn công tầng 7: các yêu cầu HTTP trông hợp lệ nhưng ngốn CPU, cơ sở dữ liệu hoặc worker. Chúng đến thẳng ứng dụng của bạn.

Bước 1: giới hạn tốc độ trong Nginx

Giới hạn tốc độ một địa chỉ có thể gửi yêu cầu. Định nghĩa một zone trong khối http và áp dụng nó cho trang web của bạn.

limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=connip:10m;

server {
    location / {
        limit_req zone=perip burst=20 nodelay;
        limit_conn connip 20;
    }
    location = /login {
        limit_req zone=perip burst=3 nodelay;
    }
}

Hãy dùng giới hạn chặt hơn nhiều cho đăng nhập và tìm kiếm, vì chúng tốn nhiều tài nguyên.

Bước 2: lưu đệm những gì có thể

Một trang được lưu đệm gần như không tốn gì để phục vụ. Hãy bật bộ đệm FastCGI hoặc proxy cho lưu lượng ẩn danh, dù chỉ 30 đến 60 giây. Nó biến một đợt tràn các yêu cầu giống hệt nhau thành chỉ một số ít yêu cầu thật.

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=site:50m inactive=10m;
fastcgi_cache site;
fastcgi_cache_valid 200 60s;
fastcgi_cache_use_stale updating error timeout;
Các bước của hướng dẫn này theo thứ tự: 1. Hiểu sự khác biệt; 2. giới hạn tốc độ trong Nginx; 3. cache những gì có thể; 4. chặn các đối tượng tái phạm bằng fail2ban; 5. đặt proxy phía trước khi tình hình nghiêm trọng; 6. Sẵn sàng trước khi sự cố xảy ra
Các bước trong hướng dẫn này, theo thứ tự.

Bước 3: đặt thời gian chờ hợp lý

Các cuộc tấn công kết nối chậm giữ các worker mở mãi. Hãy rút ngắn các giới hạn.

client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 15s;
keepalive_timeout 15s;
client_max_body_size 5m;

Bước 4: chặn những kẻ tái phạm bằng fail2ban

Chặn các địa chỉ vượt qua bộ giới hạn tốc độ. Nginx ghi các yêu cầu bị từ chối vào nhật ký lỗi, và một bộ lọc có thể khớp chúng.

[nginx-limit-req]
enabled  = true
filter   = nginx-limit-req
logpath  = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime  = 1h

Bước 5: đặt một proxy phía trước khi tình hình nghiêm trọng

Một reverse proxy hoặc CDN có thử thách bot có thể hấp thụ các cuộc tấn công mà một VPS đơn lẻ không chịu nổi. Hãy nhớ bảo vệ máy chủ gốc như mô tả trong giữ bí mật IP máy chủ gốc, nếu không kẻ tấn công sẽ đi vòng qua nó.

Chuẩn bị sẵn trước khi sự cố xảy ra

  • Biết những trang chậm nhất của bạn và sửa hoặc lưu đệm chúng.
  • Duy trì giám sát để nhanh chóng nhận ra đột biến.
  • Có kế hoạch: giới hạn chặt hơn, một trang bảo trì, một máy chủ lớn hơn.

Các kiến thức cơ bản trong hướng dẫn UFW và fail2ban đi kèm với bài này.