Rate Limiting: http-request track

Trong HAProxy, lệnh http-request track-sc0 (cùng các biến thể track-sc1, track-sc2,...) cho phép bạn theo dõi thông tin từ các yêu cầu HTTP và lưu chúng vào stick table. Việc này hữu ích khi bạn cần giám sát số lần truy cập từ một địa chỉ IP, theo dõi các yêu cầu theo từng URL cụ thể, hoặc phát hiện hành vi bất thường.

Các Field Thường Được Theo Dõi với http-request track

HAProxy cung cấp nhiều lựa chọn cho khóa (key) mà bạn có thể sử dụng với http-request track:

Field
Mô tả

src

Địa chỉ IP của client

src,map

Địa chỉ IP của client với file mapping

req.hdr(<header>)

Giá trị của một header cụ thể trong yêu cầu (ví dụ: User-Agent)

req.uri

Đường dẫn URI của yêu cầu

req.path

Đường dẫn của yêu cầu (không bao gồm query string)

req.query

Phần query string trong URL

req.method

Phương thức HTTP của yêu cầu (GET, POST,...)

req.body

Nội dung của yêu cầu POST

Các field này giúp bạn kiểm soát chính xác thông tin mà bạn muốn track, nhưng đôi khi bạn cần thêm timestamp để nhận diện các yêu cầu đến trong khoảng thời gian nhất định.

Cách Track Dữ Liệu Cùng Timestamp

Để track một yêu cầu HTTP kèm timestamp, bạn cần:

  1. Lưu timestamp vào một biến.

  2. Kết hợp timestamp này với các trường khác để tạo một khóa (key) độc nhất cho mỗi yêu cầu.

Hướng Dẫn Cấu Hình

Dưới đây là cấu hình ví dụ trong HAProxy sử dụng http-request track-sc0 kết hợp timestamp với địa chỉ IP của client:

frontend http_in
    bind *:80

    # Lưu timestamp vào một biến
    http-request set-var(req.timestamp) date(%ts)

    # Track các yêu cầu theo địa chỉ IP kết hợp với timestamp
    http-request track-sc0 src,req.timestamp

Giải Thích Cấu Hình

  • http-request set-var(req.timestamp) date(%ts): Lưu timestamp hiện tại vào biến req.timestamp để sử dụng cho các thao tác sau.

  • http-request track-sc0 src,req.timestamp: Tạo khóa track độc nhất dựa trên địa chỉ IP của client (src) và timestamp (req.timestamp). Điều này giúp bạn dễ dàng theo dõi từng yêu cầu với chi tiết về thời gian và nguồn yêu cầu.

Ví Dụ Thực Tế

Giả sử bạn muốn giới hạn số lượng yêu cầu từ một địa chỉ IP cụ thể trong một khoảng thời gian, ví dụ giới hạn mỗi IP chỉ được gửi tối đa 100 yêu cầu trong vòng 1 phút. Bạn có thể cấu hình HAProxy như sau:

# Định nghĩa stick table để lưu thông tin theo dõi
stick-table type ip size 1m expire 1m store http_req_rate(1m)

frontend http_in
    bind *:80

    # Lưu timestamp vào biến
    http-request set-var(req.timestamp) date(%ts)

    # Track các yêu cầu theo địa chỉ IP và timestamp
    http-request track-sc0 src,req.timestamp

    # Kiểm tra tốc độ yêu cầu và giới hạn số lượng yêu cầu
    acl rate_limit_exceeded sc_http_req_rate(0) gt 100
    http-request deny if rate_limit_exceeded

Giải Thích Cấu Hình Trên

  • stick-table: Định nghĩa bảng theo dõi (stick table) với http_req_rate(1m) để lưu số lượng yêu cầu từ mỗi IP trong 1 phút.

  • track-sc0 src,req.timestamp: Theo dõi các yêu cầu của client kèm timestamp để tạo một khóa track duy nhất.

  • acl rate_limit_exceeded: Kiểm tra nếu số lượng yêu cầu từ một IP vượt quá 100 trong khoảng thời gian 1 phút (sc_http_req_rate(0) gt 100).

  • http-request deny if rate_limit_exceeded: Từ chối yêu cầu nếu vượt quá giới hạn.

Kết Luận

Lệnh http-request track trong HAProxy giúp bạn theo dõi chi tiết từng yêu cầu, và bằng cách kết hợp với timestamp, bạn có thể tạo các giới hạn chi tiết cho từng client theo thời gian. Điều này là công cụ hữu ích để kiểm soát lưu lượng và bảo vệ hệ thống khỏi các hành vi quá tải.

Last updated