BGP Remotely Triggered Black Hole (RTBH) trên Linux với FRRouting: Giảm thiểu DDoS ngay tại biên mạng

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

Bắt đầu nhanh (5 phút): Loại bỏ lưu lượng DDoS Volumetric với FRRouting

Lúc 2 giờ sáng, chuông PagerDuty reo inh ỏi. Một cuộc tấn công khuếch đại DNS 40 Gbps đang dồn dập nhắm vào một địa chỉ IP public duy nhất trong trung tâm dữ liệu của bạn, tạo ra hơn 6 triệu gói tin mỗi giây. Tường lửa trên máy chủ hoàn toàn tê liệt. Tải CPU softirq chạm ngưỡng 100%, và đường truyền uplink 10 Gbps bị nghẽn hoàn toàn. Lưu lượng truy cập hợp lệ của khách hàng trên toàn bộ subnet đều bị đình trệ.

Việc hủy lưu lượng độc hại ở tầng máy chủ (host-level) chắc chắn thất bại ngay từ bản chất. Một khi các gói tin đã chạm tới card mạng của máy chủ, băng thông transit và năng lực xử lý của bus PCIe coi như đã cạn kiệt. Định tuyến Remotely Triggered Black Hole (RTBH) giải quyết triệt để vấn đề này. Bằng cách thông báo một route BGP được gắn kèm chuỗi community, bạn yêu cầu các router biên và nhà mạng transit loại bỏ toàn bộ gói tin nhắm đến IP mục tiêu trước khi chúng kịp đi vào hệ thống switch nội bộ.

Dưới đây là các bước thiết lập chuẩn xác trong 5 phút sử dụng FRRouting (FRR) trên Linux để cấu hình router biên làm điểm hủy RTBH (discard node) và kích hoạt route blackhole đầu tiên của bạn.

1. Cấu hình Discard Next-Hop và Policy tại biên mạng

Khởi động shell cấu hình tích hợp của FRR trên Linux router biên:

vtysh

Thêm một static route blackhole cho dải địa chỉ thử nghiệm RFC 5737 (192.0.2.1). Tiếp theo, tạo route-map để ghi đè các route RTBH nhận được hướng về đích discard này:

configure terminal

! 1. Route neo: báo cho nhân Linux loại bỏ lưu lượng gửi đến đây
ip route 192.0.2.1/32 blackhole

! 2. Khớp chuỗi community RTBH nội bộ (AS 65001, Tag 666)
bgp community-list standard CL-RTBH permit 65001:666

! 3. Ghi đè next-hop và chặn tái quảng bá route ra ngoài
route-map RM-APPLY-BLACKHOLE permit 10
 match community CL-RTBH
 set ip next-hop 192.0.2.1
 set local-preference 500
 set community no-export additive
exit

route-map RM-APPLY-BLACKHOLE permit 20
exit

2. Kích hoạt Blackhole từ một Controller Node

Chuyển sang node quản trị hoặc node route injector của bạn. Thông báo IP nạn nhân (ví dụ: 203.0.113.75/32) qua phiên BGP nội bộ đến router biên:

configure terminal

router bgp 65001
 bgp router-id 10.0.0.10
 neighbor 10.0.0.1 remote-as 65001
 neighbor 10.0.0.1 send-community
 !
 address-family ipv4 unicast
  network 203.0.113.75/32 route-map RM-SET-RTBH
 exit-address-family
exit

route-map RM-SET-RTBH permit 10
 set community 65001:666
exit

Kiểm tra bảng định tuyến của nhân hệ điều hành trên router biên bằng lệnh ip route:

ip route show 203.0.113.75

Bảng FIB của Linux xác nhận route đã được drop âm thầm ở tầng phần cứng/nhân:

blackhole 203.0.113.75 proto bgp metric 20

Đi sâu vào chi tiết: Cách Destination RTBH tương tác với Linux Kernel

Trong môi trường production, RTBH hoạt động dựa trên cơ chế phân giải recursive next-hop qua hai tầng: tầng điều khiển định tuyến (control plane) của FRR và Forwarding Information Base (FIB) của nhân Linux.

Định tuyến thông thường sẽ tìm IP của neighbor vật lý. Tuy nhiên, RTBH chủ động chuyển hướng next-hop của mục tiêu vào một ngõ cụt:

  1. Nguồn kích hoạt (Trigger Source): Máy chủ quản trị mạng hoặc hệ thống thu thập tự động phát hiện bất thường (ví dụ: lưu lượng vào vượt quá 50.000 pps). Nó phát ra prefix iBGP /32 (hoặc /128 cho IPv6) được gắn kèm community 65001:666.
  2. Router biên (Border Router): Tiến trình bgpd của FRR xử lý bản tin cập nhật. Policy RM-APPLY-BLACKHOLE ghi đè thuộc tính next-hop thành IP giả định 192.0.2.1 và đặt local preference thành 500 để tuyến đường này được ưu tiên hơn các bảng định tuyến thông thường.
  3. Đồng bộ qua Zebra và Netlink: bgpd chuyển tuyến đường được chọn sang zebra. Do zebra đang giữ ip route 192.0.2.1/32 blackhole, nó nhận diện đây là một điểm xả bỏ lưu lượng. Zebra lập tức phát thông điệp Netlink RTM_NEWROUTE, nạp thẳng blackhole 203.0.113.75 vào FIB của nhân.

Nếu không có cơ chế hủy gói tin ở tầng phần cứng hoặc nhân tại khu vực chu vi mạng, các đợt tấn công lưu lượng lớn sẽ gây ra thiệt hại nghiêm trọng. Các nhà mạng transit tính phí vượt ngưỡng dựa trên phân vị 95 (95th-percentile burst billing) có thể lên tới hàng nghìn USD cho mỗi sự cố. Hàng đợi của switch phần cứng bị tràn, và bảng theo dõi kết nối của Linux (nf_conntrack) cạn kiệt bộ nhớ, dẫn đến việc đánh rớt các kết nối stateful trên toàn hệ thống.

Thiết lập bộ lọc Prefix-Length nghiêm ngặt

Sơ suất rất dễ xảy ra khi chịu áp lực xử lý sự cố. Nếu ai đó vô tình quảng bá subnet /24 của khách hàng kèm theo community RTBH, 254 máy chủ đang hoạt động sẽ biến mất khỏi Internet ngay lập tức. Hãy bảo vệ các policy BGP của bạn bằng cách chỉ chấp nhận các host route chính xác:

! Chỉ cho phép duy nhất các host route /32
ip prefix-list PL-ONLY-HOST-ROUTES permit 0.0.0.0/0 ge 32

! Áp dụng bộ lọc nghiêm ngặt vào policy cho iBGP neighbor nhận vào
route-map RM-TRIGGER-IN permit 10
 match ip address prefix-list PL-ONLY-HOST-ROUTES
 match community CL-RTBH
 set ip next-hop 192.0.2.1
 set local-preference 500
 set community no-export additive
exit

route-map RM-TRIGGER-IN deny 20
exit

router bgp 65001
 neighbor 10.0.0.10 route-map RM-TRIGGER-IN in
exit

Cấu hình nâng cao: Tự động hóa giảm thiểu và kết nối nhà mạng Upstream

Nhập từng lệnh trong vtysh giữa lúc cuộc tấn công đang diễn ra sẽ làm tiêu hao thời gian uptime quý giá. Các công cụ phát hiện tự động như FastNetMon, pmacct hoặc Kentik có thể kích hoạt các route FRR thông qua shell hook chỉ trong chưa đầy hai giây.

1. Tự động hóa bơm route với vtysh

Bạn có thể thực thi các thay đổi trực tiếp qua các lệnh không tương tác vtysh -c. Phương pháp này rất dễ tích hợp vào các script xử lý sự cố:

#!/usr/bin/env bash
set -euo pipefail

VICTIM_IP="${1:-}"
ACTION="${2:-add}"
AS_NUM="65001"

if [[ ! "$VICTIM_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echo "Cách dùng: $0 <địa_chỉ_ipv4> [add|remove]" >&2
  exit 1
fi

case "$ACTION" in
  add)
    vtysh -c "configure terminal" \
          -c "router bgp ${AS_NUM}" \
          -c "address-family ipv4 unicast" \
          -c "network ${VICTIM_IP}/32 route-map RM-SET-RTBH" \
          -c "exit-address-family"
    logger -t rtbh "[SECURITY] Đã kích hoạt route RTBH cho ${VICTIM_IP}"
    ;;
  remove)
    vtysh -c "configure terminal" \
          -c "router bgp ${AS_NUM}" \
          -c "address-family ipv4 unicast" \
          -c "no network ${VICTIM_IP}/32 route-map RM-SET-RTBH" \
          -c "exit-address-family"
    logger -t rtbh "[SECURITY] Đã gỡ bỏ route RTBH cho ${VICTIM_IP}"
    ;;
  *)
    echo "Hành động phải là add hoặc remove" >&2
    exit 1
    ;;
esac

Cài đặt script vào thư mục path của hệ thống và kiểm tra việc bơm route:

chmod 750 /usr/local/bin/rtbh-trigger.sh
/usr/local/bin/rtbh-trigger.sh 203.0.113.88 add

2. Đẩy Blackhole lên nhà mạng Transit Upstream (eBGP)

Blackhole cục bộ giúp bảo vệ các máy chủ nội bộ, nhưng hoàn toàn không thể giải phóng đường truyền transit phía trên nếu đợt tấn công làm bão hòa đường cáp quang uplink vật lý. Các nhà cung cấp upstream cung cấp sẵn các community BGP blackhole chuyên dụng. Bạn có thể gửi tín hiệu theo chuẩn community RFC 7999 (65535:666) hoặc các tag riêng của từng nhà mạng như Lumen/Level3 (3356:9999), Cogent (174:9999), hoặc Arelion/Telia (1299:999).

Chuyển đổi tag kích hoạt nội bộ sang community của nhà mạng upstream trên các phiên eBGP gửi đi:

! Ánh xạ tag RTBH nội bộ sang community blackhole chuẩn RFC 7999
route-map RM-EBGP-OUT permit 10
 match community CL-RTBH
 set community 65535:666 additive
exit

route-map RM-EBGP-OUT permit 20
 ! Cho phép các quảng bá thông thường khác đi qua
exit

router bgp 65001
 neighbor 198.51.100.1 remote-as 64496
 neighbor 198.51.100.1 send-community
 neighbor 198.51.100.1 route-map RM-EBGP-OUT out
exit

Kinh nghiệm vận hành thực tế và Kiểm tra xác thực

  • Đưa hạ tầng trọng yếu vào Whitelist: Cần khai báo một blocklist rõ ràng trong hệ thống tự động kích hoạt. Default gateway, Anycast DNS resolver (như các endpoint BIND/PowerDNS), và VIP của reverse proxy tuyệt đối không bao giờ được đưa vào blackhole. Nếu kẻ tấn công nhận ra một IP bị tự động drop ở ngưỡng 100.000 pps, chúng sẽ nhắm ngay vào máy chủ DNS để đánh sập toàn bộ tên miền của bạn.
  • Kiểm tra độ lan truyền trên cả hai bảng định tuyến: Đảm bảo route tồn tại trên cả control plane BGP và FIB của hệ điều hành:
    # Xác minh thuộc tính đường đi và community BGP
    vtysh -c "show ip bgp 203.0.113.88/32"
    
    # Xác nhận Zebra đã cài đặt recursive next-hop
    vtysh -c "show ip route 203.0.113.88"
    
    # Truy vấn đường chuyển tiếp trong nhân Linux
    ip route get 203.0.113.88
    

    Nhân hệ điều hành sẽ lập tức trả về RTNETLINK answers: Network is unreachable hoặc hiển thị một route blackhole đang hoạt động.

  • Thiết lập cơ chế tự động mở lại dịch vụ (Cooldown Window): Các đợt tấn công volumetric hiện đại hiếm khi duy trì liên tục; chúng thường bắn từng đợt kéo dài 10 đến 20 phút rồi xoay vòng sang IP mục tiêu khác. Hãy cấu hình một systemd timer hoặc task Celery chạy trên Redis để tự động thu hồi blackhole sau 45 đến 60 phút. Việc này giúp khôi phục dịch vụ cho nạn nhân mà không cần can thiệp thủ công qua ticket.
  • Luôn sử dụng Silent Discard: Tuyến đường blackhole trên Linux sẽ loại bỏ gói tin một cách âm thầm ngay trong bộ nhớ nhân. Tuyệt đối không thay thế bằng đích unreachable hoặc prohibit khi giảm thiểu DDoS. Những hành động đó sẽ ép network stack phải sinh các gói ICMP Type 3 unreachable, nhanh chóng làm nghẽn luôn chiều uplink gửi đi của bạn trong một cuộc tấn công nhiều gigabit.
Share: