Vượt xa khỏi Default Gateway mặc định
Hầu hết các máy chủ Linux hoạt động theo chính sách “một lối thoát”. Nếu một gói tin thiếu đích đến cụ thể trong bảng định tuyến (routing table), kernel sẽ đẩy nó tới gateway mặc định. Cách này ổn với các thiết lập cơ bản. Nhưng ngay khi bạn thêm một đường truyền cáp quang 10Gbps song song với một link LTE dự phòng, hoặc cố gắng ép một container Docker cụ thể đi qua tunnel WireGuard, gateway đơn nhất sẽ trở thành một rào cản. Bạn cần một logic kiểu như: “Backup cơ sở dữ liệu dùng link chậm, nhưng traffic web phải đi qua cáp quang.”
Policy Based Routing (PBR) giải quyết vấn đề này. Thay vì định tuyến chỉ dựa trên việc gói tin đi đâu, PBR cho phép bạn quyết định dựa trên việc ai gửi nó hoặc nó sử dụng giao thức gì. Trong các môi trường edge production, đây là điểm khác biệt giữa một hybrid cloud hiệu quả và một cơn ác mộng về mạng.
PBR khác với Định tuyến tiêu chuẩn như thế nào
Để sử dụng PBR hiệu quả, bạn phải hiểu sự chuyển dịch từ logic chỉ dựa trên đích đến sang lựa chọn dựa trên quy tắc (rule-based).
Định tuyến tiêu chuẩn dựa trên đích đến
Đây là chế độ mặc định. Kernel kiểm tra IP đích, khớp với tiền tố (prefix) cụ thể nhất trong bảng main, và gửi nó đi. Nó hoàn toàn không quan tâm đến ứng dụng nguồn. Cho dù đó là cập nhật hệ thống hay một lời gọi API quan trọng, tất cả đều xếp hàng cho cùng một lối ra. Nó đơn giản nhưng thiếu linh hoạt.
Policy Based Routing (PBR)
PBR thêm một lớp “Quy tắc” (ip rule) lên trên các bảng định tuyến của bạn. Trước khi kernel chạm tới bảng định tuyến main, nó sẽ kiểm tra các quy tắc này. Một quy tắc đóng vai trò như một bộ lọc: “Nếu gói tin này xuất phát từ 192.168.1.50, hãy bỏ qua bảng main and sử dụng Bảng 100.” Bảng 100 có thể có default gateway riêng biệt, tạo ra các luồng định tuyến cô lập một cách hiệu quả trên một máy duy nhất.
Các đánh đổi khi sử dụng
Sự phức tạp là cái giá của khả năng kiểm soát. Hãy xem xét các yếu tố này trước khi triển khai.
- Ưu điểm:
- Tối ưu hóa chi phí: Chuyển 500GB dữ liệu backup hàng đêm qua đường truyền 100Mbps giá rẻ, độ trễ cao, trong khi dành riêng đường truyền 1Gbps độ trễ thấp cho người dùng.
- Cô lập VPN: Định tuyến các người dùng hoặc namespace cụ thể qua một VPN (như OpenVPN hoặc Tailscale) mà không làm rò rỉ traffic còn lại của hệ thống vào tunnel.
- Loại bỏ định tuyến bất đối xứng (Asymmetric Routing): Đảm bảo traffic đi vào qua ISP B cũng sẽ đi ra qua ISP B, ngăn chặn firewall chặn các gói tin “out-of-state”.
- Nhược điểm:
- Logic bị ẩn: Khó khắc phục sự cố hơn. Một lệnh
ip route showđơn giản không giải thích được tại sao một gói tin bị lỗi nếu có một quy tắc đang ghi đè nó. - Bảo trì: Bạn phải đồng bộ hóa các bảng tùy chỉnh với các thay đổi của mạng cục bộ một cách thủ công.
- Logic bị ẩn: Khó khắc phục sự cố hơn. Một lệnh
Kịch bản thực tế
Chúng ta sẽ sử dụng một thiết lập dual-homed (hai đường mạng) điển hình cho hướng dẫn này. Giả định bạn đang dùng Ubuntu 22.04 hoặc 24.04 với iproute2.
Thiết lập:
- eth0 (Chính): 192.168.1.10 (Gateway: 192.168.1.1)
- eth1 (Phụ/VPN): 10.0.0.5 (Gateway: 10.0.0.1)
Mục tiêu: Ép traffic từ IP nội bộ 192.168.1.100 đi ra qua eth1 (10.0.0.1), trong khi phần còn lại của hệ thống vẫn sử dụng eth0.
Các bước triển khai
1. Định nghĩa một bảng định tuyến tùy chỉnh
Linux cho phép tối đa 252 bảng tùy chỉnh. Tránh sử dụng các ID trên 253 vì chúng được dành riêng cho hệ thống. Chúng ta sẽ đăng ký một cái tên trong /etc/iproute2/rt_tables để giúp các câu lệnh dễ đọc hơn.
# Mở các định nghĩa bảng
sudo nano /etc/iproute2/rt_tables
# Thêm bảng mới của chúng ta
200 secondary_link
2. Thiết lập dữ liệu cho bảng tùy chỉnh
Bảng secondary_link hiện đang trống. Chúng ta phải gán cho nó một route mặc định và một route tới mạng cục bộ để nó không cố gửi traffic nội bộ ra ngoài ISP.
# Thiết lập gateway cho bảng mới
sudo ip route add default via 10.0.0.1 dev eth1 table secondary_link
# Đảm bảo traffic nội bộ vẫn hoạt động
sudo ip route add 192.168.1.0/24 dev eth0 table secondary_link
3. Áp dụng quy tắc định tuyến
Đây là nơi điều kỳ diệu xảy ra. Chúng ta yêu cầu kernel kích hoạt bảng secondary_link cho bất kỳ traffic nào xuất phát từ IP mục tiêu.
# Tạo quy tắc
sudo ip rule add from 192.168.1.100 table secondary_link
# Kiểm tra phân cấp quy tắc
ip rule show
Kết quả hiển thị mức độ ưu tiên. Số thấp hơn sẽ được ưu tiên trước:
0: from all lookup local
32765: from 192.168.1.100 lookup secondary_link
32766: from all lookup main
32767: from all lookup default
4. Cấu hình Source NAT
Nếu eth1 là một ISP hoặc VPN, gateway của nó yêu cầu các gói tin phải khớp with subnet của chính nó. Sử dụng iptables để masquerade traffic sao cho nó có vẻ như đến từ 10.0.0.5.
# Masquerade traffic đi ra trên eth1
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
5. Xác minh đường đi
Kiểm tra định tuyến bằng cách gán curl với IP nguồn cụ thể. So sánh kết quả để xem traffic có thực sự đi qua con đường thay thế hay không.
# Kiểm tra route mặc định (nên là ISP A)
curl -s icanhazip.com
# Kiểm tra route PBR (nên là ISP B/VPN)
curl -s --interface 192.168.1.100 icanhazip.com
Sử dụng nâng cao: Định tuyến theo dịch vụ (FWMARK)
Đôi khi bạn cần định tuyến theo giao thức—ví dụ như gửi tất cả traffic HTTPS (cổng 443) qua một đường truyền nhanh hơn. Bạn không thể làm điều này chỉ với ip rule. Bạn phải “đánh dấu” (mark) các gói tin bằng iptables trước.
# 1. Đánh dấu các gói tin TCP 443 với ID "1"
sudo iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 1
# 2. Định tuyến bất kỳ gói tin nào có dấu "1" bằng bảng tùy chỉnh của chúng ta
sudo ip rule add fwmark 1 table secondary_link
Lưu thay đổi vĩnh viễn với Netplan
Các lệnh ip chỉ có tác dụng tạm thời và sẽ biến mất sau khi khởi động lại. Trên Ubuntu, hãy sử dụng Netplan để lưu các quy tắc này vĩnh viễn. Cập nhật file cấu hình YAML của bạn trong /etc/netplan/:
network:
version: 2
ethernets:
eth1:
addresses: [10.0.0.5/24]
routes:
- to: default
via: 10.0.0.1
table: 200
routing-policy:
- from: 192.168.1.100
table: 200
Chạy sudo netplan apply để áp dụng cấu hình.
Tổng kết
Policy Based Routing phá vỡ mô hình mạng “chỉ có một lối ra” cứng nhắc. Mặc dù nó thêm một lớp phức tạp cho quá trình gỡ lỗi, nhưng sự linh hoạt mà nó mang lại cho các máy chủ đa đường mạng và VPN gateway là không gì sánh bằng. Một khi bạn đã nắm rõ quy trình—Quy tắc trước, Bảng sau—bạn có thể điều hướng traffic chính xác qua bất kỳ số lượng interface nào.

