Hướng dẫn sử dụng BIRD2 để triển khai BGP và OSPF trên Linux

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

Static Routing hay Dynamic Routing — Cái nào phù hợp với bạn?

Khi mới làm quen với network, hầu hết mọi người đều bắt đầu bằng static route — thêm tay từng tuyến đường vào bảng routing. Cách này ổn cho mạng nhỏ, nhưng khi số lượng node tăng lên thì bắt đầu có vấn đề.

Mình từng quản lý một lab có khoảng 15 VM, và mỗi lần thêm node mới là phải SSH vào từng máy để cập nhật route. Sai một dấu chấm là cả segment mất kết nối. Đó là lúc mình quyết định chuyển sang dynamic routing.

Có ba lựa chọn phổ biến cho dynamic routing trên Linux:

  • FRRouting (FRR) — Kế thừa từ Quagga, cú pháp giống Cisco IOS, phổ biến nhất
  • BIRD2 — Nhẹ, hiệu năng cao, dùng ngôn ngữ cấu hình riêng
  • OpenBGPD / OpenOSPFD — Xuất phát từ OpenBSD, ít gặp trên Linux

So sánh BIRD2 và FRRouting

FRRouting

FRR dùng cú pháp VTY (Virtual Terminal) rất gần Cisco, nên ai có background thiết bị Cisco thì học nhanh. Hỗ trợ nhiều giao thức: BGP, OSPF, OSPFv3, IS-IS, PIM, MPLS, EVPN…

Ưu điểm:

  • Cú pháp quen thuộc với người đã biết Cisco IOS
  • Community lớn, tài liệu phong phú
  • Tích hợp tốt với nhiều distro, có sẵn trong repo

Nhược điểm:

  • Nặng hơn BIRD2 — mỗi giao thức chạy một tiến trình riêng
  • Cấu hình VTY đôi khi phức tạp với người mới

BIRD2

BIRD Internet Routing Daemon version 2 dùng một file config duy nhất với cú pháp riêng. Nhìn ban đầu hơi lạ, nhưng cực kỳ mạnh và linh hoạt. Một tiến trình duy nhất xử lý tất cả giao thức.

Ưu điểm:

  • Nhẹ, hiệu năng cao — lý tưởng cho VPS nhỏ hoặc edge router
  • Filter language mạnh mẽ, viết được logic phức tạp
  • Hỗ trợ multiple routing tables gọn gàng
  • Nhiều ISP dùng BIRD2 làm BGP route server ở production scale

Nhược điểm:

  • Cú pháp riêng — phải học từ đầu, không giống Cisco
  • Debug lúc mới làm quen hơi mất thời gian

Nên chọn giao thức nào: OSPF hay BGP?

Đây là câu hỏi hay gặp khi dạy network cho junior. Câu trả lời ngắn gọn:

  • OSPF — dùng bên trong hạ tầng của mình (nội bộ một AS). Tốc độ hội tụ nhanh (vài giây), phù hợp datacenter, lab nhiều VM.
  • BGP — dùng khi kết nối với upstream provider, hoặc peering giữa hai tổ chức/datacenter riêng biệt. Phức tạp hơn nhưng linh hoạt hơn về policy.

Với lab nhỏ hoặc production nội bộ: bắt đầu với OSPF trước, thêm BGP khi thực sự cần multi-homing hoặc peering với bên ngoài.

Cài đặt BIRD2 trên Ubuntu/Debian

# Ubuntu 22.04 / Debian 12
sudo apt update
sudo apt install bird2 -y

# Kiểm tra version
bird --version
# BIRD version 2.0.x

# Start và enable service
sudo systemctl enable --now bird
sudo systemctl status bird

File cấu hình mặc định nằm tại /etc/bird/bird.conf. Backup trước khi chỉnh:

sudo cp /etc/bird/bird.conf /etc/bird/bird.conf.backup

Cấu hình OSPF với BIRD2

Giả sử bạn có lab với 3 node Linux:

  • Node A: 192.168.10.1
  • Node B: 192.168.10.2
  • Node C: 192.168.10.3

Cấu hình BIRD2 cho Node A tại /etc/bird/bird.conf:

log syslog all;

router id 192.168.10.1;   # Router ID — thường dùng IP chính của node

protocol device {
    scan time 10;
}

protocol direct {
    ipv4;   # Tự động import địa chỉ interface vào routing table
}

protocol kernel {
    ipv4 {
        export all;   # Đẩy routes từ BIRD vào kernel routing table
    };
}

protocol ospf v2 OSPF_MAIN {
    area 0.0.0.0 {    # Backbone area
        interface "eth0" {
            type broadcast;
            cost 10;
            hello 10;
            dead count 4;
        };
    };
}

Trên Node B và C, chỉ cần đổi router id thành IP tương ứng. Sau đó reload cấu hình:

sudo birdc configure         # Reload không cần restart service
sudo birdc show ospf neighbors   # Kiểm tra neighbors

Nếu cấu hình đúng, output sẽ trông như thế này:

BIRD 2.0.12 ready.
OSPF_MAIN:
Router ID       Pri          State      DTime   Interface  Router IP
192.168.10.2      1        Full/DR      00:38        eth0  192.168.10.2
192.168.10.3      1       Full/BDR      00:34        eth0  192.168.10.3

Cấu hình BGP với BIRD2

BGP thường dùng khi bạn có VPS với IP public muốn announce prefix lên upstream, hoặc setup BGP peering giữa hai datacenter. Đây là cấu hình BGP cơ bản giữa hai node:

Node A (AS 65001, IP: 10.0.0.1):

log syslog all;
router id 10.0.0.1;

protocol device { scan time 10; }
protocol direct { ipv4; }
protocol kernel { ipv4 { export all; }; }

# Filter: chỉ accept prefix hợp lệ
filter bgp_import {
    if net ~ [ 10.0.0.0/8+ ] then accept;
    reject;
}

filter bgp_export {
    if net ~ [ 10.0.0.0/24 ] then accept;
    reject;
}

protocol bgp PEER_B {
    local 10.0.0.1 as 65001;
    neighbor 10.0.0.2 as 65002;

    ipv4 {
        import filter bgp_import;
        export filter bgp_export;
    };

    hold time 90;
    keepalive time 30;
}

Node B (AS 65002) — chỉ cần đổi local, neighbor và AS number:

protocol bgp PEER_A {
    local 10.0.0.2 as 65002;
    neighbor 10.0.0.1 as 65001;

    ipv4 {
        import filter bgp_import;
        export filter bgp_export;
    };

    hold time 90;
    keepalive time 30;
}

Kiểm tra BGP session:

sudo birdc show protocols all PEER_B
sudo birdc show route protocol PEER_B

Debug khi gặp sự cố

Lần debug network issue khó nhất với mình là khi setup BGP peering giữa hai datacenter — BGP session lúc up lúc down, nhưng chỉ xảy ra vào giờ cao điểm. Sau một hồi phân tích mới phát hiện ra nguyên nhân là MTU mismatch: một bên interface MTU 1500, bên kia 1450 do đường VPN overlay. BGP packets lớn bị fragment và drop đúng lúc traffic tăng cao — kiểu lỗi intermittent packet loss rất khó pinpoint nếu không biết hướng tìm.

Một số lệnh debug hữu ích:

# Bật debug log cho protocol cụ thể
sudo birdc debug OSPF_MAIN all
sudo birdc debug PEER_B all

# Xem chi tiết routing table
sudo birdc show route all
sudo birdc show route for 10.0.0.0/24

# OSPF detail
sudo birdc show ospf state
sudo birdc show ospf lsadb

# BGP detail
sudo birdc show protocols all
sudo birdc show bgp sessions

Tip quan trọng: khi reload cấu hình với birdc configure, BIRD2 kiểm tra syntax trước khi apply. Nếu có lỗi, nó từ chối và báo ngay — không sợ commit sai config giữa đêm.

Thêm tính năng hữu ích

Route redistribution: Đưa static route vào OSPF

protocol static STATIC_ROUTES {
    ipv4;
    route 172.16.0.0/24 via 192.168.10.254;
    route 172.16.1.0/24 via 192.168.10.254;
}

protocol ospf v2 OSPF_MAIN {
    redistribute static;   # Import static routes vào OSPF
    area 0.0.0.0 {
        interface "eth0";
    };
}

BFD — Phát hiện link failure nhanh hơn

BFD (Bidirectional Forwarding Detection) giúp phát hiện neighbor fail trong vài trăm milliseconds thay vì đợi hết hello timer:

protocol bfd {
    interface "eth0" {
        min rx interval 100ms;
        min tx interval 100ms;
    };
}

protocol ospf v2 OSPF_MAIN {
    area 0.0.0.0 {
        interface "eth0" {
            bfd yes;   # Enable BFD trên interface
        };
    };
}

Lộ trình học thực tế

BIRD2 là lựa chọn tốt nếu bạn cần routing daemon nhẹ, linh hoạt cho lab hoặc production nhỏ. Cú pháp config ban đầu hơi khác FRR, nhưng sau khi quen thì viết filter và policy rất thoải mái.

Mình gợi ý lộ trình: bắt đầu với OSPF trong lab 3 node → thử redistribute static routes vào OSPF → sau đó thêm BGP peering giữa 2 AS giả lập. Khi đã nắm chắc flow này thì apply vào production thực tế rất tự tin.

Share: