Linux VRF: Cách chạy nhiều bảng định tuyến độc lập trên cùng một máy chủ

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

Hạn chế của bảng định tuyến toàn cục

Mạng Linux tiêu chuẩn tuân theo một quy tắc đơn giản: một bảng định tuyến chính, một gateway mặc định, và mọi giao diện mạng (interface) đều cạnh tranh vị trí trong danh sách toàn cục đó. Cách tiếp cận ‘một kích cỡ cho tất cả’ này hoạt động ổn với các máy chủ web cơ bản, nhưng nó sẽ sụp đổ trong các môi trường doanh nghiệp phức tạp.

Hãy xem xét một kịch bản thực tế: bạn đang quản lý một gateway kết nối hai chi nhánh riêng biệt qua VPN. Cả hai chi nhánh đều sử dụng subnet 192.168.1.0/24 cho máy in nội bộ và thiết bị NAS. Khi bạn kết nối cả hai, nhân (kernel) sẽ đối mặt với sự xung đột.

Nếu bạn cố gắng truy cập 192.168.1.50, văn phòng nào sẽ nhận được gói tin? Trong thiết lập tiêu chuẩn, việc thêm route thứ hai đó thường dẫn đến mất 50% gói tin do kernel chao đảo giữa các đường dẫn, hoặc một kết nối đơn giản là bị ngắt. Trước đây, chúng ta thường lách luật bằng cách đánh dấu gói tin qua iptables hoặc định tuyến dựa trên chính sách (PBR), nhưng những thiết lập đó rất mong manh và cực kỳ khó gỡ lỗi.

VRF (Virtual Routing and Forwarding) giải quyết vấn đề này bằng cách phân chia stack mạng thành các thực thể định tuyến độc lập. Hãy coi đó là việc biến một máy chủ vật lý thành nhiều router ảo. Mỗi VRF duy trì bảng định tuyến, giao diện và gateway mặc định riêng.

VRF so với Network Namespaces: Giải pháp thay thế gọn nhẹ

Nếu bạn sử dụng Docker, bạn sẽ biết về Network Namespaces (netns). Mặc dù cả hai đều cung cấp sự cô lập, chúng hoạt động ở các cấp độ khác nhau. Một Namespace là một ‘silo’ hạng nặng—nó sao chép toàn bộ stack, bao gồm cả firewalls và thiết bị loopback. Về cơ bản, nó là một container cho mạng của bạn.

VRF mang tính ‘phẫu thuật’ hơn nhiều. Nó chỉ cô lập Layer 3 (tầng định tuyến). Tất cả các VRF dùng chung các quy tắc firewall toàn cục và tài nguyên hệ thống. Điều này khiến nó trở thành lựa chọn lý tưởng để tách biệt lưu lượng quản trị (SSH/SNMP) khỏi lưu lượng dữ liệu sản xuất. Bạn có được sự cô lập cần thiết mà không phải đối mặt với sự phức tạp khi quản lý 20 ngữ cảnh namespace khác nhau.

Xây dựng môi trường VRF

Để bắt đầu, hãy đảm bảo bạn đang chạy Linux kernel 4.14 trở lên. Mặc dù sự hỗ trợ đã bắt đầu từ phiên bản 4.4, các bản phát hành 4.14+ cung cấp sự ổn định cần thiết cho môi trường thực tế (production). Bạn cũng sẽ cần gói iproute2.

1. Tạo thiết bị VRF

Linux coi VRF như một thiết bị mạng ảo. Bạn phải liên kết nó với một ID bảng định tuyến cụ thể. Hãy tạo vrf-blue và gán nó cho bảng 100.

# Tạo thiết bị VRF master
sudo ip link add vrf-blue type vrf table 100

# Kích hoạt giao diện
sudo ip link set vrf-blue up

Kiểm tra kết quả bằng cách liệt kê các thiết bị VRF đang hoạt động:

ip link show type vrf

2. Gán các giao diện vào VRF

Thiết bị VRF đóng vai trò là ‘master’ cho các giao diện vật lý hoặc ảo. Khi một giao diện được ‘gán’ (enslaved), kernel sẽ bỏ qua bảng toàn cục và nhìn cụ thể vào Bảng 100 cho lưu lượng của giao diện đó.

Giả sử eth1 kết nối với Blue Client của bạn:

# Di chuyển eth1 vào ngữ cảnh vrf-blue
sudo ip link set dev eth1 master vrf-blue

# Việc di chuyển giao diện thường xóa IP của nó. Hãy gán lại ngay bây giờ:
sudo ip addr add 192.168.1.5/24 dev eth1
sudo ip link set eth1 up

3. Định tuyến bên trong VRF

Với eth1 nằm trong VRF, các lệnh định tuyến tiêu chuẩn sẽ không thấy nó. Bạn phải chỉ định ngữ cảnh VRF. Sử dụng từ khóa vrf để cú pháp dễ đọc hơn:

# Thiết lập gateway mặc định cho mạng Blue
sudo ip route add default via 192.168.1.1 dev eth1 vrf vrf-blue

Để kiểm tra bảng định tuyến cụ thể cho thực thể này, hãy chạy:

ip route show vrf vrf-blue

Chạy các tiến trình trong ngữ cảnh VRF

Thử chạy ping 8.8.8.8 và nó có khả năng sẽ thất bại. Theo mặc định, shell sử dụng bảng toàn cục. Để buộc một tiến trình sử dụng logic định tuyến của VRF, hãy sử dụng ip vrf exec.

# Kiểm tra kết nối bằng bảng định tuyến Blue
sudo ip vrf exec vrf-blue ping -c 3 8.8.8.8

Công cụ hỗ trợ này liên kết socket của tiến trình với thiết bị VRF. Đây là một bước ngoặt để chạy một thực thể SSH quản trị trên một mạng trong khi phần còn lại của máy chủ xử lý lưu lượng sản xuất đa gigabit trên một mạng khác.

Liên kết các dịch vụ với một VRF

Nếu bạn cần một dịch vụ cụ thể, như backup agent hoặc SSH daemon, chỉ lắng nghe trên mạng Blue, hãy khởi chạy nó trong ngữ cảnh đó:

sudo ip vrf exec vrf-blue /usr/sbin/sshd -D

Những bài học xương máu từ thực tế

Sau khi triển khai VRF trên hàng trăm router biên, có ba vấn đề thường xuyên xuất hiện nhất.

  • Hạn chế của Loopback: Mặc dù các giao diện được cô lập, 127.0.0.1 vẫn là toàn cục. Nếu hai dịch vụ trong các VRF khác nhau cố gắng liên kết (bind) vào cùng một cổng localhost, chúng sẽ xung đột.
  • Cấu hình Kernel: VRF yêu cầu các điều chỉnh sysctl cụ thể để xử lý các socket TCP/UDP một cách chính xác. Đảm bảo net.ipv4.tcp_l3mdev_accept=1net.ipv4.udp_l3mdev_accept=1 đã được thiết lập. Những cấu hình này cho phép kernel tự động ánh xạ các gói tin đến đúng bảng VRF.
  • Tính kiên định (Persistence): Các lệnh ip link thực thi lúc hệ thống đang chạy sẽ biến mất sau khi khởi động lại. Đối với các hệ thống Ubuntu hiện đại, hãy sử dụng khóa vrfs: của Netplan. Đối với các hệ thống Debian cũ hơn, hãy định nghĩa VRF master và các slave của nó trong /etc/network/interfaces.

Lời kết

VRF trên Linux cung cấp một giải pháp trung gian giữa định tuyến cơ bản và ảo hóa hoàn toàn. Nó mang lại một phương pháp sạch sẽ, có khả năng mở rộng để xử lý các IP trùng lặp và cô lập lưu lượng nghiêm ngặt mà không tốn chi phí CPU và bộ nhớ như namespaces hay máy ảo. Bằng cách coi VRF như một thiết bị master, bạn biến một máy chủ duy nhất thành một bộ định tuyến đa người dùng (multi-tenant) mạnh mẽ.

Share: