BIRD Routing Daemon trên Linux: Cấu hình BGP và OSPF cho HomeLab và Mạng Tự Quản

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

Bối cảnh & Tại sao chọn BIRD?

Khi tôi bắt đầu xây dựng một HomeLab nghiêm túc hơn — năm VLAN, sáu VPS node trải rộng trên hai địa điểm và ba máy bare-metal ở nhà — static route gần như ngay lập tức trở thành cơn ác mộng bảo trì. Mỗi lần thêm subnet hay di chuyển một máy, tôi phải cập nhật route thủ công trên từng node một. Rất nhanh chán.

Tôi đã từng làm việc với FRRouting (blog này có hướng dẫn riêng cho FRR), nhưng liên tục gặp các tình huống mà BIRD phù hợp hơn. BIRD thực sự nổi bật khi bạn cần:

  • Một BGP route reflector nội bộ — cấu hình dạng template của BIRD làm điều này gọn gàng hơn đáng kể
  • Một daemon nhẹ không ngốn RAM — BIRD2 chạy thoải mái dưới 30MB trên mạng yên tĩnh, so với 200MB+ của một số giải pháp thay thế
  • Route filtering chi tiết dùng ngôn ngữ filter riêng của BIRD — logic accept/reject/modify thực sự, không chỉ là prefix list
  • Kỹ năng routing có thể áp dụng vào môi trường ISP và IXP thực tế — BIRD được triển khai rộng rãi tại các internet exchange

BIRD (BIRD Internet Routing Daemon) xuất phát từ CZ.NIC, tổ chức quản lý tên miền của Cộng hòa Séc, và đã vận hành các mạng production nghiêm túc trong nhiều thập kỷ. BIRD2 — phiên bản chính hiện tại — xử lý cả IPv4 lẫn IPv6 trong một tiến trình duy nhất. Tôi đã chạy thiết lập này trên production hơn một năm. Chưa một lần BGP session bị ngắt bất ngờ.

Điểm khác biệt lớn nhất so với FRR: BIRD dùng một file cấu hình khai báo với cú pháp riêng — không có workflow kiểu Cisco “configure terminal”. Sửa file, chạy birdc configure, xong. Diff cấu hình rõ ràng và quản lý được bằng version control.

Cài đặt

Ubuntu / Debian

BIRD2 có sẵn trong repo chuẩn trên Ubuntu 20.04+ và Debian 11+:

sudo apt update
sudo apt install bird2

Service khởi động tự động sau khi cài. Kiểm tra trạng thái:

sudo systemctl status bird
bird --version
# BIRD phiên bản 2.0.x

RHEL / Rocky Linux / AlmaLinux

Trên các hệ thống thuộc dòng RHEL, cài từ EPEL:

sudo dnf install epel-release
sudo dnf install bird

Trên Rocky 9 và AlmaLinux 9, gói EPEL cài đặt sạch sẽ mà không cần thêm dependency nào.

File cấu hình chính nằm tại /etc/bird/bird.conf. Hãy sao lưu trước khi chỉnh sửa:

sudo cp /etc/bird/bird.conf /etc/bird/bird.conf.orig

Cấu hình

Hiểu cấu trúc file cấu hình

File cấu hình BIRD được tổ chức thành ba phần logic:

  • Tùy chọn toàn cục — router ID, đích log, vị trí socket
  • Các khối protocol — một khối cho mỗi routing protocol hoặc chức năng hệ thống (kernel, device, static, ospf, bgp…)
  • Định nghĩa filter — các route filter được đặt tên, áp dụng bên trong các khối protocol

Đây là khung tối thiểu mà mọi file cấu hình đều cần:

# /etc/bird/bird.conf

log syslog all;
router id 10.0.0.1;  # Dùng IP loopback hoặc IP chính của bạn

# Tự động phát hiện các interface được kết nối trực tiếp
protocol device { }

# Đưa các route trực tiếp vào bảng routing của BIRD
protocol direct {
    ipv4;
    ipv6;
}

# Đồng bộ route của BIRD vào bảng routing của Linux kernel
protocol kernel {
    ipv4 {
        export all;
    };
}

Protocol kernel là cầu nối giữa BIRD và bảng routing của Linux kernel. Nếu không có export all, BIRD tính toán route nội bộ nhưng không bao giờ cài vào hệ thống — đây là một trong những lỗi phổ biến nhất với người mới bắt đầu.

Cấu hình OSPF

OSPF là lựa chọn phù hợp cho HomeLab khi bạn kiểm soát toàn bộ các router. Cấu hình này thiết lập một OSPF area duy nhất trên hai interface:

protocol ospf v2 homelab_ospf {
    area 0.0.0.0 {
        interface "eth0" {
            type broadcast;
            hello 10;
            dead 40;
            cost 10;
        };
        interface "eth1" {
            type broadcast;
            cost 20;  # Cost cao hơn = đường ít được ưu tiên hơn
        };
    };

    ipv4 {
        import all;
        export where source = RTS_OSPF || source = RTS_STATIC;
    };
}

Dòng export kiểm soát những gì BIRD quảng bá vào OSPF. Ở đây chúng ta đang redistribute các route học được qua OSPF và static route — điều chỉnh filter này tùy theo từng node nên chia sẻ gì. Với IPv6, thay ospf v2 bằng ospf v3 và đổi ipv4 thành ipv6.

Cấu hình BGP

Đây là nơi hệ thống template của BIRD thể hiện ưu điểm. Thay vì sao chép cấu hình peer cho từng neighbor, hãy định nghĩa một template và kế thừa từ đó:

# Template cho tất cả iBGP peer — định nghĩa một lần, dùng lại ở mọi nơi
template bgp ibgp_peers {
    local as 65001;
    hold time 90;
    keepalive time 30;

    ipv4 {
        next hop self;
        import all;
        export all;
    };
}

# Mỗi peer chỉ cần tham chiếu đến template
protocol bgp homelab_router2 from ibgp_peers {
    neighbor 10.0.0.2 as 65001;
    description "HomeLab Router 2";
}

protocol bgp homelab_router3 from ibgp_peers {
    neighbor 10.0.0.3 as 65001;
    description "HomeLab Router 3";
}

Nếu bạn đang chạy route reflector — một node trung tâm redistribute route đến tất cả các node khác, loại bỏ nhu cầu kết nối full mesh — thêm hai dòng vào template:

template bgp ibgp_rr_client {
    local as 65001;
    rr client;          # Coi các peer kết nối vào là RR client
    rr cluster id 1;
    next hop self;

    ipv4 {
        import all;
        export all;
    };
}

Mỗi client chỉ kết nối đến route reflector, không cần kết nối đến mọi peer khác. Nên tính thử: sáu router kết nối full mesh cần 15 BGP session riêng biệt. Với route reflector, con số đó giảm xuống còn 5. Đơn giản hóa đáng kể.

Route filter

Ngôn ngữ filter là điểm BIRD thực sự tạo ra sự khác biệt. Filter này chỉ chấp nhận route thuộc không gian RFC1918 10.x.x.x và từ chối tất cả những gì còn lại:

filter only_homelab_routes {
    if net ~ [ 10.0.0.0/8+ ] then accept;
    reject;
}

protocol bgp homelab_router2 from ibgp_peers {
    neighbor 10.0.0.2 as 65001;
    ipv4 {
        import filter only_homelab_routes;
        export all;
    };
}

Ký hiệu 10.0.0.0/8+ có nghĩa là “10.0.0.0/8 và bất kỳ prefix cụ thể hơn nào” — bao gồm mọi subnet trong dải 10.0.0.0/8 mà không cần liệt kê từng cái một.

Áp dụng thay đổi cấu hình

Sau khi sửa file cấu hình, tải lại mà không làm gián đoạn các session:

sudo birdc configure

BIRD kiểm tra cú pháp trước khi áp dụng. Nếu có lỗi, cấu hình hiện tại vẫn hoạt động và lỗi được báo cáo — không có gián đoạn service vì một lỗi đánh máy.

Xác minh & Giám sát

Shell tương tác birdc

birdc là giao diện điều khiển của BIRD — tương đương với CLI của router:

sudo birdc

Các lệnh quan trọng trong shell:

bird> show status
bird> show protocols
bird> show protocols all
bird> show route
bird> show route table master4
bird> show ospf topology
bird> show ospf neighbors
bird> show bgp sessions

Để scripting và giám sát, birdc nhận lệnh trực tiếp mà không cần vào shell tương tác:

sudo birdc show protocols
sudo birdc show route count

Kiểm tra trạng thái BGP session

sudo birdc show protocols

Một BGP session hoạt động bình thường trông như sau:

Name              Proto   Table   State  Since        Info
homelab_router2   BGP     ---     up     2026-07-01   Established

Nếu bạn thấy Active hoặc Connect thay vì Established, kết nối TCP chưa hoàn tất. Việc đầu tiên cần kiểm tra: firewall rule ở cả hai đầu. BGP chạy trên TCP port 179 — cả hai bên đều phải cho phép kết nối inbound từ IP của neighbor.

Kiểm tra OSPF adjacency

sudo birdc show ospf neighbors
Router ID    Pri   State      DTime   Interface   Router ID
10.0.0.2      1   Full/DR    00:32   eth0        10.0.0.2

Full/DR có nghĩa là adjacency đã được thiết lập hoàn toàn. Bị kẹt ở 2-Way hoặc ExStart? Kiểm tra xem cả hai đầu có cùng OSPF area và các giá trị hello/dead interval có khớp chính xác không.

Xác nhận route đã được cài vào kernel

Xác nhận BIRD đang thực sự đẩy route vào bảng routing của Linux:

ip route show
# Các route học được qua BIRD sẽ xuất hiện với metric tương ứng

# Kiểm tra một prefix cụ thể:
ip route show 10.0.2.0/24

Theo dõi log theo thời gian thực

sudo journalctl -u bird -f

Để debug một BGP session cụ thể, thêm debug all vào khối protocol tạm thời. Cảnh báo thật: nó có thể sinh ra hàng trăm megabyte log mỗi giờ trên session đang hoạt động. Nhớ xóa đi kẻo quên:

protocol bgp homelab_router2 from ibgp_peers {
    neighbor 10.0.0.2 as 65001;
    debug all;  # Xóa sau khi debug xong
}

Health check đơn giản cho giám sát

Tôi giữ lệnh một dòng này trong hệ thống monitoring để phát hiện kịp thời khi BGP session bị ngắt:

sudo birdc show protocols | grep BGP | grep -v Established \
  && echo "CẢNH BÁO: BGP SESSION ĐÃ NGẮT" \
  || echo "OK: Tất cả BGP session đang hoạt động"

Đưa vào cron job hoặc Prometheus textfile collector và bạn sẽ nhận cảnh báo trong vòng vài phút khi có session bị ngắt.

Để làm quen với mô hình cấu hình của BIRD có thể mất khoảng một cuối tuần. Sau đó nó sẽ hoàn vốn nhanh chóng. Một route reflector đầy đủ với các chính sách filter gọn gàng trong chưa đến 100 dòng cấu hình — thiết lập tương đương trên Cisco IOS sẽ dài gấp ba lần và không thể diff sạch sẽ. Sáu tháng sau, khi bạn cần thêm peer hay điều chỉnh filter, file cấu hình vẫn còn dễ hiểu mà không cần phải học lại từ đầu.

Share: