Xây dựng Hệ thống Phát hiện và Phản hồi DDoS Tự động với FastNetMon

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Khi một cuộc tấn công DDoS volumetric nhắm vào server của bạn, mỗi giây đều quan trọng. Lưu lượng hợp lệ bắt đầu bị gián đoạn. Server ngập trong tải trọng. Nếu cuộc tấn công kéo dài đủ lâu — outage toàn bộ. Phát hiện tấn công mới chỉ giải quyết được một nửa vấn đề. Phản hồi đủ nhanh để thực sự giảm thiệt hại mới là điểm mà hầu hết các hệ thống thường bỏ ngỏ.

So sánh Cách tiếp cận: Ba Hướng Xử lý DDoS Volumetric

Các đội vận hành hạ tầng thường xử lý tấn công volumetric theo ba hướng — và sự đánh đổi giữa chi phí và mức độ bảo vệ rất khác nhau ở mỗi hướng:

1. Theo dõi Thủ công + Phản hồi Thủ công

Ai đó theo dõi dashboard hoặc nhận cảnh báo rồi SSH vào để thêm rule firewall. Cách này phù hợp với hệ thống nhỏ, tấn công hiếm gặp, nhưng thời gian phản hồi tính bằng phút — không phải giây. Đến lúc xác nhận đây là tấn công thật sự, thiệt hại đã xảy ra rồi.

2. Dịch vụ DDoS Scrubbing trên Cloud

Các dịch vụ như Cloudflare Magic Transit hay AWS Shield Advanced chuyển hướng traffic qua các trung tâm scrubbing trước khi đến hạ tầng của bạn. Hiệu quả cao, không cần cấu hình gì trên server — nhưng chi phí có thể rất lớn. Vài trăm đến vài nghìn đô mỗi tháng tùy theo băng thông.

3. Phát hiện Tự động On-Premise với FastNetMon

Chạy một daemon phân tích traffic trên phần cứng của chính bạn. Khi phát hiện mẫu traffic bất thường, nó tự động kích hoạt biện pháp giảm nhẹ — BGP blackholing, rule iptables, hoặc gọi API lên nhà cung cấp upstream. Thời gian phản hồi: dưới 10 giây.

Cách tiếp cận Nào Phù hợp với Hệ thống của Bạn

  • Thủ công: Không tốn chi phí, kiểm soát hoàn toàn — nhưng quá chậm, dễ sai sót, và hoàn toàn vô dụng khi bị tấn công lúc 3 giờ sáng.
  • Cloud scrubbing: Hoạt động mà không cần động vào server — nhưng đắt tiền, tăng latency, và bị ràng buộc vào nhà cung cấp.
  • FastNetMon (on-premise): Phản hồi trong vài giây, chạy trên hạ tầng của bạn, phiên bản community miễn phí — cài đặt đòi hỏi tích hợp BGP hoặc firewall, nhưng chỉ đầu tư một lần.

Với hầu hết các nhà vận hành VPS và chủ hạ tầng vừa và nhỏ, FastNetMon là lựa chọn cân bằng nhất. Tôi đã chạy cái này trên môi trường production — tấn công bị phát hiện trong vòng 5–10 giây và bị chặn trước khi làm bão hòa đường truyền. Chưa bỏ sót một lần nào.

Tại sao Phát hiện Thủ công Thất bại Dưới Áp lực

Một cuộc tấn công UDP flood hay ICMP amplification ở mức multi-Gbps không cho bạn thời gian để phản hồi thủ công. Đến lúc cảnh báo kích hoạt, bạn SSH vào, và xác nhận đây thực sự là tấn công — connection table đã cạn kiệt rồi. Người dùng hợp lệ bị ngắt kết nối trong khi bạn vẫn đang loay hoay tìm hiểu chuyện gì xảy ra. Một hệ thống giảm nhẹ tự động tốt cần ba yếu tố:

  • Nhanh hơn tốc độ phản hồi của con người — lý tưởng là dưới 30 giây từ lúc phát hiện đến lúc chặn
  • Hoàn toàn tự động, không cần can thiệp thủ công trong suốt cuộc tấn công
  • Đủ chính xác để tránh chặn nhầm traffic hợp lệ cùng với nguồn tấn công

FastNetMon chạy như một daemon phân tích traffic theo thời gian thực. Nó có thể nhận dữ liệu sFlow hoặc NetFlow từ router, hoặc bắt trực tiếp qua libpcap/AF_PACKET ngay trên server — không cần phần cứng đặc biệt cho triển khai cơ bản.

Cấu hình Khuyến nghị

Với một VPS hoặc server bare-metal thông thường, cách triển khai đơn giản nhất là bắt gói tin trực tiếp trên host:

[Internet] → [Server của bạn chạy FastNetMon + iptables]

Với cấu hình mạnh hơn khi bạn kiểm soát được router upstream:

[Internet] → [Router gửi sFlow đến FastNetMon] → [BGP Blackhole upstream]

Hướng dẫn này đề cập đến cấu hình single-server với bắt gói tin qua AF_PACKET và phản hồi bằng iptables — chạy được trên bất kỳ Linux server nào mà không cần BGP peering. Phần BGP blackhole ở cuối là nâng cấp tùy chọn.

Hướng dẫn Triển khai

Bước 1: Cài đặt FastNetMon Community Edition

sudo apt-get update && sudo apt-get install -y wget

wget https://install.fastnetmon.com/installer -O installer
sudo chmod +x installer
sudo ./installer

Trình cài đặt chạy khoảng 5–10 phút và tự động kéo tất cả dependencies. Nó cũng đăng ký một systemd service.

Bước 2: Cấu hình Ngưỡng Giám sát Traffic

sudo nano /etc/fastnetmon.conf
# Network interface cần giám sát
interfaces = eth0

# Các dải mạng IP được bảo vệ (ký hiệu CIDR)
networks_list = /etc/networks_list

# Bật phát hiện dựa trên ngưỡng
ban_for_pps = on
ban_for_bandwidth = on
ban_for_flows = on

# Ngưỡng — điều chỉnh dựa trên traffic baseline của bạn
threshold_pps = 20000        # 20K gói tin/giây
threshold_mbps = 1000        # 1 Gbps
threshold_flows = 3500       # 3500 luồng/giây

# Thời gian chặn kẻ tấn công
ban_time = 3600              # 1 giờ
# Tạo danh sách mạng của bạn — thay bằng dải IP thực tế
echo "203.0.113.0/24" | sudo tee /etc/networks_list

Bước 3: Tạo Script Phản hồi Tự động

FastNetMon gọi một script mỗi khi phát hiện hoặc kết thúc tấn công. Đây là nơi bạn định nghĩa hành động giảm nhẹ thực sự:

sudo nano /usr/local/bin/fastnetmon_notify.sh
#!/bin/bash

ACTION=$1      # "ban" hoặc "unban"
IP=$2
DIRECTION=$3   # "incoming", "outgoing", "both"

LOG_FILE="/var/log/fastnetmon_actions.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

case "$ACTION" in
  ban)
    iptables -I INPUT -s "$IP" -j DROP
    iptables -I FORWARD -s "$IP" -j DROP
    echo "$TIMESTAMP - ĐÃ CHẶN $IP (hướng: $DIRECTION)" >> "$LOG_FILE"

    # Tùy chọn: gửi thông báo Telegram
    # curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
    #   -d "chat_id=${CHAT_ID}&text=Đã chặn DDoS: ${IP}"
    ;;

  unban)
    iptables -D INPUT -s "$IP" -j DROP 2>/dev/null
    iptables -D FORWARD -s "$IP" -j DROP 2>/dev/null
    echo "$TIMESTAMP - ĐÃ BỎ CHẶN $IP" >> "$LOG_FILE"
    ;;
esac
sudo chmod +x /usr/local/bin/fastnetmon_notify.sh

Kết nối script vào cấu hình FastNetMon bằng cách thêm dòng này:

# Thêm vào /etc/fastnetmon.conf
notify_script_path = /usr/local/bin/fastnetmon_notify.sh

Bước 4: Khởi động FastNetMon và Xác minh Bắt gói tin

sudo systemctl enable fastnetmon
sudo systemctl start fastnetmon
sudo systemctl status fastnetmon

Kiểm tra thống kê traffic theo thời gian thực bằng client tích hợp sẵn:

sudo fastnetmon_client

Bạn sẽ thấy output như thế này, cập nhật mỗi vài giây:

FastNetMon v1.2.7 client
Traffic vào: 235 Mbps / 45K pps
Traffic ra:   45 Mbps /  8K pps

Top host theo gói tin (chiều vào):
203.0.113.45    UDP    12450 pps    450 Mbps  ← Ứng viên tấn công
198.51.100.22   TCP      234 pps     12 Mbps

Traffic hiển thị trong thống kê nghĩa là bắt gói tin đang hoạt động. Bất kỳ IP nào vượt ngưỡng của bạn đều sẽ tự động kích hoạt script thông báo — không cần can thiệp thêm để có bảo vệ cơ bản.

Bước 5: BGP Blackholing để Giảm nhẹ Upstream (Nâng cao)

Nếu nhà cung cấp hosting của bạn hỗ trợ BGP communities cho blackholing — hầu hết các nhà cung cấp lớn đều có — FastNetMon có thể announce IP bị tấn công qua BGP. Traffic sẽ bị hủy ngay tại edge của ISP, trước khi chạm đến mạng của bạn:

# Thêm vào /etc/fastnetmon.conf
gobgp = on
gobgp_next_hop = 192.0.2.1           # Next hop blackhole (tùy nhà cung cấp)
gobgp_announce_host = on
gobgp_community = 65000:666          # BGP community blackhole của ISP bạn

BGP announcement thường lan truyền trong vòng 60 giây. Sau đó, toàn bộ traffic đến IP bị tấn công sẽ không chạm đến server của bạn nữa. Đây là sự khác biệt then chốt so với iptables: rule ở mức kernel vẫn phải hấp thụ traffic đến giới hạn băng thông của NIC; còn BGP blackholing chặn flood ngay ở upstream, trước khi nó đến gần phần cứng của bạn.

Tinh chỉnh và Tránh Cảnh báo Nhầm

Sau vài ngày chạy, hãy kiểm tra log hành động để xem có IP hợp lệ nào bị chặn nhầm không:

grep BANNED /var/log/fastnetmon_actions.log | awk '{print $5}' | sort | uniq -c | sort -rn

Các nhà cung cấp CDN (Cloudflare, Fastly, Akamai) xuất hiện nhiều lần trong danh sách đó là dấu hiệu đáng lo ngại. Một đợt tăng traffic hợp lệ từ các dải IP đó có thể trông y hệt như tấn công. Hãy whitelist các CIDR của họ — nếu không bạn sẽ tự chặn CDN của mình vào những ngày đông traffic:

# Thêm IP hoặc CIDR tin cậy vào danh sách trắng
echo "103.21.244.0/22" | sudo tee -a /etc/white_list   # Ví dụ Cloudflare
sudo systemctl restart fastnetmon

Cũng hãy xem lại các ngưỡng so với traffic baseline thực tế. Nếu server của bạn thường xuyên xử lý 15K pps trong giờ làm việc bình thường, ngưỡng 20K sẽ kích hoạt vào những chiều bận rộn, không phải chỉ khi có tấn công. Hãy thu thập một tuần thống kê traffic trước khi chốt các con số đó:

# Kiểm tra traffic peak hiện tại trong log FastNetMon
grep "pps" /var/log/fastnetmon.log | tail -100

Hành vi của Hệ thống Khi Có Tấn công Thực sự

Chuỗi sự kiện diễn ra rất nhanh. FastNetMon phát hiện bất thường trong vòng một chu kỳ lấy mẫu — thường là 2–5 giây. Script thông báo kích hoạt. Nguồn tấn công bị chặn ở mức kernel. Traffic từ tất cả IP khác tiếp tục không bị ảnh hưởng, kể cả các nguồn trong cùng subnet với kẻ tấn công.

Phiên bản community bao phủ các kịch bản bạn có khả năng gặp nhất: UDP floods, ICMP amplification, SYN floods. Cần phân tích theo prefix, rate-limiting thay vì chặn cứng, hoặc báo cáo chi tiết hơn? FastNetMon Advanced xử lý được những việc đó. Để bảo vệ volumetric thuần túy mà không có ngân sách thương mại, phiên bản community hoàn toàn đủ dùng cho các cuộc tấn công thực tế mà hầu hết server thực sự phải đối mặt.

Share: