12/08/2018, 17:11

Phòng chống DDoS với Nginx và Nginx Plus

Distributed Denial‑of‑Service (DDoS) attack là hành động cố gắng làm cho các dịch vụ thường là website. Website thường bị tấn công bởi rất nhiều yêu cầu được gửi từ nhiều máy tính khác nhau khiến cho trang web trờ nên quá tải và ko thể phản hồi lại yêu cầu từ các máy client. Sử dụng NGINX và ...

Distributed Denial‑of‑Service (DDoS) attack là hành động cố gắng làm cho các dịch vụ thường là website. Website thường bị tấn công bởi rất nhiều yêu cầu được gửi từ nhiều máy tính khác nhau khiến cho trang web trờ nên quá tải và ko thể phản hồi lại yêu cầu từ các máy client.

Sử dụng NGINX và NGINX Plus để chống DDoS

Nginx và Nginx Plus có nhiều tính năng giúp giảm nhẹ tác hại của cuộc tấn công DDoS dự trên việc điều chỉnh lưu lượng truy cập và các yêu cầu. Dưới đây là một số phương pháp bảo vệ website của bạn trước các cuộc tấn công DDoS

Giới hạn tuần suất các yêu cầu

Bạn có thể giới hạn tần suất gửi request tới server cho các người dùng. Ví dụ bạn tính toán một người dùng bình thường có thể gửi 2 yêu cầu login (request) mỗi giây là nhiều rồi. Vậy bạn có thể cấu hình Nginx và Nginx Plus cho phép một địa chỉ client IP có thể gửi request đến trang login 2 lần mỗi giây (tương đương với trung bình 30 yêu cầu / 1 phút)

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {
    # ...
    location /login.html {
        limit_req zone=one;
    # ...
    }
}

limit_req_zone cấu hình một vùng nhớ chia sẻ (zone) có tên là one để lưu trữ trạng thái (state) của yêu cầu theo kiểu key-value, trong trường hợp này key là địa chỉ IP của client. limit_request có hiệu lực trong block /login.html và tham chiếu điến cấu hình bộ nhớ chia sẻ one.

Giới hạn số lượng kết nối

Bạn có thể giới hạn số lượng kết nối được mở từ một địa chỉ IP. Ví dụ bạn có thể cấu hình cho phép tối đa 10 kết nối đến địa chỉ /store trên trang web của bạn

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    # ...
    location /store/ {
        limit_conn addr 10;
        # ...
    }
}

limit_conn_zone cấu hình một vùng nhớ chia sẻ là addr để lưu trữ thông tin các request theo từng địa chỉ client IP. Tương tự limit_conn có hiệu lực trong block /store và đọc dữ liệu từ vùng nhớ chia sẻ là addr và đặt giới hạn tối đa là 10 kết nối trên một địa chỉ client IP.

Chặn một số địa chỉ IP

Bạn có thể khai báo một số địa chỉ IP vào trong blacklist (danh sách đen) với chỉ thị deny làm cho Nginx và Nginx Plus từ chối mọi kết nối từ các địa chỉ IP trong danh sách này. Ví dụ bạn muốn chặn các địa chỉ IP trong dải 123.123.123.1 đến 123.123.123.28

location / {
    deny 123.123.123.0/28;
    # ...

Hoặc bạn có thẻ chỉ định từng địa chỉ IP một như sau

location / {
    deny 123.123.123.3;
    deny 123.123.123.5;
    deny 123.123.123.7;
    # ...
}
Chỉ cho phép một số IP truy cập

Trong trường hợp này bạn sẽ chỉ định một số địa chỉ IP có thể truy cập đến trang web của bạn, còn lại sẽ từ chối hết các kết nối từ địa chỉ IP khác Ví dụ chỉ cho phép kết nối từ các địa chỉ IP ở trong dải 192.168.1.0 đến 192.168.1.24;

location / {
    allow 192.168.1.0/24;
    deny all;
    # ...
}
Giới hạn số lượng kết nối đến server

Với Nginx bạn có thế giới hạn số lượng kết nối tối đa đến server, nếu quá số lượng này server sẽ tự động từ chối yêu cầu. Ví dụ bạn muốn cấu hình cho server chỉ nhận tối đa 200 kết nối bạn có thể làm như sau

upstream website {
    server 192.168.100.1:80 max_conns=200;
    server 192.168.100.2:80 max_conns=200;
    queue 10 timeout=30s;
}

Trong ví dụ trên max_conns để khai báo số lượng kết nối tối đa đến server. Trong khi đó queue là hàng đợi dùng khi tất cả server đều đạt số lượng tối đa kết nối thì yêu cầu tiếp theo sẽ được đưa vào hàng đơi và sẽ được giữ trong hàng đợi tối đa là 30 giây

Kết luận

Việc loại bỏ hoàn toàn DDoS là rất khó, tuy nhiên ta có một số biện pháp loại bỏ các trường hợp tấn công đơn giản hoặc giảm nhẹ tác hại của các vụ tấn công DDoS. Hy vọng các ví dụ trên có thể giúp ích cho bạn trong thực tế. Cảm ơn bạn đã theo dõi bài viết

Tham khảo

  1. mitigating-ddos-attacks-with-nginx-and-nginx-plus
0