Làm chủ Policy-Based Routing (PBR) trên Linux: Điều hướng Traffic như một Pro

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

Khi bảng định tuyến mặc định trở thành nút thắt

2 giờ sáng, hệ thống giám sát báo đỏ: Đường truyền Leased Line 100Mbps của công ty chạm ngưỡng 98%. Ping vọt lên 500ms, khách hàng bắt đầu phàn nàn web load chậm như rùa. Mình SSH vào gateway và phát hiện thủ phạm: Một script rsync đang đẩy hàng trăm GB dữ liệu backup lên Cloud. Mặc định, Linux chỉ nhìn vào Destination IP để quyết định gói tin đi đâu. Nó không quan tâm đó là traffic ưu tiên của khách hàng hay gói tin backup của hệ thống.

Để giải quyết, mình cần Policy-Based Routing (PBR). Thay vì định tuyến mù quáng dựa trên đích đến, PBR cho phép chúng ta phân luồng dựa trên IP nguồn, loại dịch vụ hoặc port. Đây là kỹ năng sống còn nếu bạn đang quản lý hệ thống Multi-homed hoặc Datacenter cần tối ưu chi phí đường truyền.

Bộ đôi quyền lực: Rule và Table

Trong thế giới của iproute2, PBR vận hành dựa trên hai khái niệm then chốt:

  • Routing Table (Bảng định tuyến): Đừng chỉ dùng bảng main. Linux cho phép bạn tạo tới 255 bảng định tuyến riêng biệt. Mỗi bảng có thể có Gateway riêng.
  • Routing Policy Database (RPDB): Đây là lớp logic điều khiển. Nó quyết định gói tin nào sẽ được tra cứu ở bảng định tuyến nào thông qua lệnh ip rule.

Hãy tưởng tượng RPDB như một nhân viên phân loại thư. Thư từ phòng sếp (IP nguồn) sẽ được bỏ vào khay ưu tiên (Table A), còn thư quảng cáo sẽ bị đẩy vào khay thường (Table B).

Triển khai thực tế: Tách luồng cho máy chủ Backup

Giả sử server gateway của bạn có hai kết nối:

  • eth0: ISP A (Chính), IP 192.168.1.10, Gateway 192.168.1.1.
  • eth1: ISP B (Dự phòng/Giá rẻ), IP 10.0.0.10, Gateway 10.0.0.1.

Mục tiêu: Đẩy toàn bộ traffic từ máy backup (192.168.1.50) qua ISP B để giải phóng đường truyền chính.

1. Khởi tạo bảng định tuyến mới

Đầu tiên, hãy đặt tên cho bảng định tuyến để tránh nhầm lẫn với các con số khô khan. Mở file /etc/iproute2/rt_tables:

echo "100 backup_line" | sudo tee -a /etc/iproute2/rt_tables

2. Thiết lập lộ trình cho bảng mới

Bây giờ, chúng ta sẽ định nghĩa lối thoát cho bảng backup_line. Lưu ý: Nếu thiếu bước này, gói tin sẽ bị “lạc đường” vì bảng mới đang trống rỗng.

# Chỉ định gateway mặc định cho bảng 100
sudo ip route add default via 10.0.0.1 dev eth1 table backup_line

# Giữ kết nối nội bộ để server không bị mất liên lạc với LAN
sudo ip route add 192.168.1.0/24 dev eth0 table backup_line

3. Kích hoạt luật điều hướng

Đây là bước then chốt để kết nối IP nguồn với bảng định tuyến vừa tạo:

sudo ip rule add from 192.168.1.50 lookup backup_line

Dùng lệnh ip rule show để kiểm tra. Bạn sẽ thấy rule mới nằm ở priority 32765. Từ giây phút này, mọi gói tin từ .50 sẽ bị buộc phải đi qua cổng 10.0.0.1, bất kể bảng định tuyến chính đang chạy gì.

Kỹ thuật nâng cao: Điều hướng theo Port (FWMARK)

Đôi khi IP nguồn là chưa đủ. Bạn muốn traffic Web (80, 443) đi đường nhanh, còn Torrent hay FTP đi đường chậm? Lúc này, chúng ta cần iptables để “dán nhãn” gói tin.

Bước 1: Đánh dấu gói tin

Sử dụng bảng mangle để gán nhãn số 2 cho các gói tin HTTPS:

sudo iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 2

Bước 2: Điều hướng theo nhãn

Thay vì lọc theo IP, chúng ta lọc theo fwmark:

sudo ip rule add fwmark 2 lookup high_speed_table
sudo ip route flush cache

Đảm bảo cấu hình sống sót sau khi Reboot

Các lệnh ip sẽ biến mất khi khởi động lại máy. Trên Ubuntu hiện đại, hãy đưa cấu hình vào Netplan (/etc/netplan/01-netcfg.yaml) để đảm bảo tính bền vững:

routing-policy:
  - from: 192.168.1.50
    table: 100
    priority: 10
routing-tables:
  - name: backup_line
    id: 100

Những cái bẫy cần tránh (Troubleshooting)

Trong nhiều năm vận hành, mình rút ra 3 lưu ý quan trọng để bạn không phải thức đêm debug:

  1. Ám ảnh mang tên rp_filter: Linux mặc định sẽ chặn gói tin nếu đường đi và đường về không khớp nhau (Asymmetric routing). Hãy nới lỏng cơ chế này bằng cách set net.ipv4.conf.all.rp_filter=2.
  2. Thứ tự ưu tiên: Rule có ID thấp hơn sẽ được xử lý trước. Nếu bạn đặt một rule quá chung chung ở trên, các rule chi tiết phía dưới sẽ bị phớt lờ.
  3. Sát thủ thầm lặng: Luôn dùng tcpdump -i eth1 -n để xác nhận traffic có thực sự đi ra đúng interface như kỳ vọng hay không. Đừng chỉ tin vào bảng cấu hình.

PBR không chỉ là một thủ thuật mạng. Nó là công cụ giúp bạn giành lại quyền kiểm soát hạ tầng, biến những đường truyền khô cứng trở nên linh hoạt và thông minh hơn. Chúc các bạn cấu hình thành công!

Share: