Quay lại danh sách
Sử dụng proxy để bảo vệ API Gateway khỏi DDoS và giới hạn tốc độ

Sử dụng proxy để bảo vệ API Gateway khỏi DDoS và giới hạn tốc độ

12 tháng 7, 2026

Trong môi trường API hiện đại, việc duy trì uptime và độ tin cậy cao là ưu tiên hàng đầu. Tuy nhiên, các dịch vụ API thường xuyên gánh chịu những cuộc tấn công DDoS, spam request và giới hạn tốc độ (rate‑limit) không hợp lý. Một trong những biện pháp đơn giản nhưng hiệu quả nhất là triển khai proxy như một lớp bảo vệ trung gian.

1. Tại sao sử dụng proxy lại quan trọng?

  • Cách ẩn địa chỉ IP thực: Khi API Gateway được đặt phía sau proxy, các attacker chỉ có thể gửi request tới IP proxy, làm giảm khả năng nhận diện và tấn công IP nguồn.
  • Quản lý lưu lượng: Proxy có thể throttle, block hoặc redirect lưu lượng dựa trên quy tắc cài đặt.
  • Ghi log và cảnh báo: Proxy lưu trữ chi tiết request/response, giúp phát hiện mô hình tấn công nhanh chóng.
  • Khả năng xoay IP: Khi sử dụng proxy rotating, các request lớn sẽ được phân phối qua nhiều IP, giảm tỷ lệ throttling.

2. Kiến trúc tổng quan

Client ➜ External Proxy (RDP/Rotating) ➜ Internal API Gateway ➜ Microservices
  • External Proxy: Được cung cấp bởi RoProxy hoặc nhà cung cấp tương tự, có thể là residentialательство, datacenter, hoặc mobile.
  • Internal API Gateway: Định dạng như Kong, Traefik hoặc AWS API Gateway.
  • Microservices: Backend logic thực sự.

Tuy nhiên, proxy không chỉ là “đệm” mà còn có thể được tích hợp trực tiếp trong API Gateway để thực thi các chính sách.

3. Lập kế hoạch cấu hình proxy

  1. Xác định mục tiêu: ಳಿತ - Đánh giá mức độ DDoS (khoảng 50‑200 Mbps, 1 M request/s, v.v.).

    • Định nghĩa các endpoint nhạy cảm (login, payment, etc.).
    • Xác định giớiაზე ứ rate‑limit mong muốn (200 req/s, 10 req/min).
  2. Chọnuez Испан:

    • Residential: Thích hợp nếu muốn trông như người dùng thực, giảm khả năng detection.
    • Datacenter: Tốc độ cao, giá rẻ, nhưng dễ bị chặn.
    • Mobile: Đáp ứng khi API cần access từ các mạng di động.
  3. Thiết lập luật:

    • block IP/geo nếu vượt mức.
    • throttle các request > threshold.
    • redirect tới page “Rate limit exceeded” hoặc “Service unavailable”.
  4. Triển khai: Dùng Nginx, Traefik hoặc Kong.

4. Ví dụ cấu hình với Nginx + Lua (OpenResty)

OpenResty cho phép viết logic Lua trong Nginx, dễ dàng thực hiện rate‑limit và proxy.

# /etc/nginx/conf.d/api-gateway.conf
server {
    listen 80;
    server_name api.example.com;

    # 1. Rate limit by IP + endpoint
    limit_req_zone $binary_remote_addr zone=api_zone:10m rate=200r/s;
    limit_req zone=api_zone burst=400 nodelay;

    location / {
        # 2. Proxy to internal API
        proxy_pass http://internal_api_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        # 3. Log all requests
        log_format api_log '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent "$http_referer" "$http_user_agent"';
        access_log /var/log/nginx/api.access.log api_log;
    }
}

Giải thích:

  • limit_req_zone đặt vùng giới hạn tần suất.
  • burst cho phép 400 request ngay lập tức, sau đó bắt buộc chờ.
  • proxy_set_header truyền IP thực tới backend.

5. Xoay IP với RoProxy

ev RoProxy cung cấp API xoay IP tự động. Ví dụ, trong Python:

import requests

API_TOKEN = "YOUR_ROPROXY_TOKEN"
BASE_URL = "https://api.ropproxy.com/v1/rotating"

headers = {
    "Authorization": f"Bearer {API_TOKEN}",
    "Content-Type": "application/json"
}

# Yêu cầu proxy mới
payload = {
    "country": "US",
    "type": "datacenter",
    "sticky": False
}

resp = requests.post(BASE_URL, json=payload, headers=headers)
proxy_info = resp.json()
proxy_address = proxy_info["address"]  # e.g., 123.45.67.89:8000

Sau khi có proxy_address, bạn có thể cấu hình Nginx:

proxy_pass http://123.45.67.89:8000;

Lợi ích:

  • Cắt giảm tỷ lệ throttling.
  • Phân phối tải qua nhiều IP.
  • Giảm khả năng bị chặn bởi firewall.

6. Kiểm soát rate limit chi tiết

  • Client‑side: Thêm header X-RateLimit-Reset để thông báo cho client.
  • Backend‑side: Sử dụng Redis để lưu Pia count:
import redis
r = redis.StrictRedis(host='redis', port=6379, db=0)

def check_rate(ip):
    key = f"rate:{ip}"
    count = r.get(key)
    if count and int(count) > 200:
        return False
    r.incr(key)
    r.expire(key, 1)  # 1 second window
    return True

7. Tích hợp với Cloudflare Workers (tùy chọn)

Nếu API của bạn đang dùng Cloudflare, bạn có thể viết Worker để thực hiện cachingrate‑limit.

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const ip = request.headers.get('CF-Connecting-IP')
  const limit = 200
  const key = `rate:${ip}`
  const count = await RATE_LIMIT.get(key)
  if (count >= limit) {
    return new Response('Too many requests', { status: 429 })
  }
  await RATE_LIMIT.put(key, count + 1, { expirationTtl: 1 })
  return fetch(request)
}

8. Giám sát và cảnh báo

  • Grafana + Prometheus: Thu thập metrics từ Nginx ($status 429, 5xx).
  • Slack webhook: Gửi cảnh báo khi số lượng 429 request vượt ngưỡng.
  • ELK stack: Lưu log, phân tích trượt.

9. Kiểm tra hiệu năng

Sử dụng wrk hoặc ab:

wrk -t12 -c400 -d30s http://api.example.com/users

Theo dõi throughput, latency, số 429. Nếu vẫn có 429, điều chỉnh burst hoặc rate.

10. Kết luận

Proxy không chỉ là một lớp “bảo vệ” mà còn là công cụ quản lý lưu lượng tối ưu. Khi triển khai đúng cách:

  • Giảm rủi ro DDoS và throttling.
  • Cải thiện độ tin cậy và uptime.
  • Cho phép bạn linh hoạt điều chỉnh giới hạn theo nhu cầu thực tế.

Việc kết hợp proxy rotating, rate‑limit logic và monitoring tạo nên một vòng lặp tự động, giúp API Gateway luôn “tươi mới” và an toàn.