Triển khai Anycast với BGP và BIRD2 trên Linux: Tuyệt chiêu tăng HA và giảm Latency

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Tại sao Anycast là tiêu chuẩn vàng cho hệ thống lớn?

Hãy tưởng tượng bạn đang vận hành một hệ thống DNS toàn cầu. Làm sao để người dùng tại New York truy cập server Mỹ, còn người dùng tại TP.HCM tự động kết nối về server Việt Nam chỉ với một địa chỉ IP duy nhất? Nếu một cụm server tại Singapore đột ngột bảo trì, làm thế nào để traffic tự động chuyển hướng sang Hong Kong trong vài giây mà không cần can thiệp thủ công?

Câu trả lời nằm ở Anycast. Khác với Unicast (1 IP định danh cho 1 Server), Anycast cho phép nhiều server ở các vị trí địa lý khác nhau cùng quảng bá (advertise) một địa chỉ IP vào bảng định tuyến toàn cầu. Router sẽ tính toán khoảng cách ngắn nhất (thường dựa trên AS Path) để điều hướng người dùng đến node gần nhất.

Trong bài viết này, mình sẽ hướng dẫn anh em sử dụng BIRD2. Đây là một routing daemon cực nhẹ, chiếm chưa đến 20MB RAM nhưng đủ sức gánh vác hàng triệu route. Mình đã áp dụng giải pháp này cho hệ thống DNS nội bộ, giúp giảm độ trễ từ 150ms xuống còn dưới 20ms cho các chi nhánh từ xa.

Mô hình Lab chuẩn bị

Để triển khai, anh em cần ít nhất 2 Linux server (Ubuntu 22.04 là lựa chọn tốt nhất) và một Router hỗ trợ BGP. Nếu làm Lab, anh em có thể dùng VyOS hoặc một máy ảo Linux khác chạy BIRD làm Router trung tâm.

  • Anycast IP: 10.10.10.10/32 (IP dùng chung cho toàn bộ service).
  • Node 1: IP 192.168.1.11, AS 65001.
  • Node 2: IP 192.168.1.12, AS 65001.
  • Router trung tâm: IP 192.168.1.1, AS 65000.

Việc tính toán dải mạng và subnet là bước không thể thiếu. Nếu lười nhẩm thủ công, anh em có thể dùng IP Subnet Calculator để lấy nhanh range IP và broadcast, tránh sai sót khi cấu hình filter sau này.

Bước 1: Cài đặt BIRD2

BIRD2 đã có sẵn trong kho ứng dụng của hầu hết các bản phân phối Linux hiện nay. Cài đặt rất đơn giản:

sudo apt update && sudo apt install bird2 -y

File cấu hình chính nằm tại /etc/bird/bird.conf. Trước khi vọc vạch, hãy nhớ backup file gốc để có đường lui nhé.

Bước 2: Thiết lập Interface Dummy

IP Anycast không nên gắn trực tiếp vào card mạng vật lý để tránh xung đột Layer 2. Thay vào đó, ta tạo một interface ảo (dummy). IP này sẽ tồn tại độc lập trên mỗi node.

# Tạo interface dummy tên anycast0
sudo ip link add dev anycast0 type dummy
sudo ip addr add 10.10.10.10/32 dev anycast0
sudo ip link set anycast0 up

Để cấu hình này không mất đi khi khởi động lại, anh em hãy khai báo nó trong Netplan hoặc /etc/network/interfaces.

Bước 3: Cấu hình BGP quảng bá IP

Đây là trái tim của hệ thống. Ta cần cấu hình BIRD2 để nó “nói” với Router rằng: “Tôi đang giữ IP 10.10.10.10, hãy đẩy traffic về đây”.

Chỉnh sửa file /etc/bird/bird.conf trên Node 1:

log syslog all;
router id 192.168.1.11;

protocol device {
    scan time 10;
}

# Lấy IP từ interface dummy
protocol direct {
    ipv4;
    interface "anycast0";
}

# Đẩy route vào kernel để Linux biết đường xử lý gói tin
protocol kernel {
    ipv4 { export all; };
}

# Thiết lập kết nối BGP với Router
protocol bgp upstream_router {
    local as 65001;
    neighbor 192.168.1.1 as 65000;
    
    ipv4 {
        import none; 
        export filter {
            if net = 10.10.10.10/32 then accept;
            reject;
        };
    };
}

Với Node 2, anh em chỉ cần đổi router id tương ứng là xong.

Bước 4: Kiểm tra và vận hành

Sau khi lưu cấu hình, hãy khởi động lại service:

sudo systemctl restart bird

Sử dụng lệnh birdc show protocols để kiểm tra trạng thái. Nếu thấy Established, chúc mừng anh em, BGP đã thông. Lúc này, Router sẽ thấy IP 10.10.10.10 có hai đường đi song song.

Kiểm tra khả năng chịu lỗi (Failover)

Mình đã test thực tế kịch bản sập node. Khi tắt BIRD trên Node 1, Router mất tín hiệu BGP chỉ sau khoảng 1-3 giây (tùy cấu hình Keepalive). Ngay lập tức, toàn bộ traffic chuyển hướng sang Node 2. Trong quá trình này, lệnh ping chỉ mất đúng 1 gói tin. Đây là con số cực kỳ ấn tượng so với việc chờ DNS TTL hết hạn (thường mất vài phút).

Lưu ý sống còn: Health Check

Có một rủi ro lớn: BIRD vẫn chạy nhưng service chính (như Nginx hay DNS) bị treo. Lúc này Router vẫn đẩy traffic vào node lỗi, gây ra tình trạng “black hole”.

Giải pháp là dùng một script kiểm tra trạng thái dịch vụ. Nếu Nginx chết, script sẽ yêu cầu BIRD ngừng quảng bá IP ngay lập tức:

#!/bin/bash
if ! systemctl is-active --quiet nginx; then
    birdc down upstream_router
    echo "Service down, withdrawing route..."
fi

Ngoài ra, tuyệt đối không dùng IP Anycast để SSH quản trị. Hãy luôn dùng IP vật lý để tránh tình trạng bạn đang SSH ở node này nhưng lại bị nhảy sang node kia do thay đổi bảng định tuyến.

Triển khai Anycast giúp hệ thống của bạn chuyên nghiệp và bền bỉ hơn hẳn. Nếu gặp khó khăn trong việc cấu hình filter phức tạp hoặc tối ưu BFD để đạt tốc độ hội tụ dưới 1 giây, anh em cứ để lại bình luận phía dưới nhé!

Share: