Khi mạng Layer 2 truyền thống trở nên quá chật chội
Cách đây vài năm, khi quản lý cụm server nhỏ cho một startup, mình đã vấp phải một bài toán hóc búa. Hệ thống yêu cầu các máy ảo (VM) nằm trên hai server vật lý khác nhau phải giao tiếp trực tiếp ở Layer 2. Chúng cần nằm cùng một dải IP nội bộ để broadcast và nhận diện nhau mà không muốn đi qua router phức tạp.
Giải pháp đầu tiên mình nghĩ tới là VLAN (802.1Q). Tuy nhiên, rắc rối ập đến ngay lập tức. Cấu hình VLAN yêu cầu quyền can thiệp vào switch vật lý để thiết lập Trunk port. Nếu bạn đang thuê VPS trên AWS hay Google Cloud, việc này là bất khả thi. Bạn bị kẹt ở Layer 3 (IP), trong khi ứng dụng lại đòi hỏi Ethernet Layer 2.
Chưa kể, VLAN chỉ giới hạn ở 4096 ID. Với các hệ thống chạy hàng nghìn container cho nhiều khách hàng, con số này sẽ cạn kiệt rất nhanh. Mình nhận ra hệ thống cần một cách tiếp cận khác: tạo ra một mạng ảo chạy đè lên hạ tầng IP sẵn có.
Tại sao VLAN không còn đủ gánh vác hạ tầng hiện đại?
VLAN hoạt động bằng cách chèn thêm tag vào frame Ethernet. Mọi switch trên đường truyền đều phải hiểu và hỗ trợ tag này. Chỉ cần một router xuất hiện giữa hai server, tag VLAN sẽ bị gỡ bỏ, khiến kết nối Layer 2 bị ngắt quãng.
Trong môi trường Docker hay Kubernetes, các node thường nằm rải rác ở nhiều subnet khác nhau. Để kết nối chúng thành một mạng phẳng (flat network), chúng ta cần kỹ thuật Overlay Network. Thay vì kéo dây cáp ảo, chúng ta đóng gói (encapsulate) toàn bộ frame Ethernet vào gói tin UDP/IP. Lúc này, các frame Layer 2 có thể “đi nhờ” trên hạ tầng Layer 3 để tới đích an toàn.
So sánh các phương án thực thi
Trước khi chọn VXLAN, mình đã cân nhắc ba ứng cử viên sáng giá:
- GRE Tunnel: Thiết lập kết nối point-to-point rất nhanh. Tuy nhiên, GRE xử lý gói tin broadcast/multicast khá tệ và cực kỳ khó quản lý khi số lượng node tăng lên theo kiểu full-mesh.
- VPN (WireGuard/OpenVPN): Bảo mật tuyệt vời nhưng tiêu tốn tài nguyên CPU. Overhead (dữ liệu dư thừa) lớn do mã hóa sẽ làm giảm băng thông đáng kể khi chạy traffic database nặng giữa các server trong cùng rack.
- VXLAN (Virtual Extensible LAN): Đây là tiêu chuẩn vàng hiện nay. Nó hỗ trợ tới 16 triệu mạng ảo (VNI) và hoạt động mượt mà trên mọi hạ tầng IP.
Triển khai VXLAN trên Linux
VXLAN tạo ra các điểm cuối gọi là VTEP (VXLAN Tunnel End Point). Mỗi server đóng vai trò một VTEP. Khi gói tin vào interface VXLAN, nó được đóng gói vào UDP port 4789 rồi gửi đến IP server đích. Tại đầu nhận, server sẽ gỡ header UDP để lấy lại frame Ethernet nguyên bản.
1. Thiết lập môi trường
Giả sử chúng ta có 2 server Ubuntu:
- Host A: IP vật lý
192.168.1.10 - Host B: IP vật lý
192.168.1.20
Mục tiêu: Thiết lập mạng ảo dải 10.0.0.0/24 kết nối hai host.
2. Cấu hình trên Host A
Chúng ta tạo interface VXLAN với ID (VNI) là 100. Cổng 4789 là port tiêu chuẩn được IANA quy định cho VXLAN.
# Tạo interface vxlan100
sudo ip link add vxlan100 type vxlan id 100 remote 192.168.1.20 dev eth0 dstport 4789
# Gán IP nội bộ
sudo ip addr add 10.0.0.1/24 dev vxlan100
# Kích hoạt interface
sudo ip link set vxlan100 up
3. Cấu hình trên Host B
Trên Host B, bạn thực hiện tương tự nhưng trỏ remote về IP của Host A.
# Tạo interface vxlan100
sudo ip link add vxlan100 type vxlan id 100 remote 192.168.1.10 dev eth0 dstport 4789
# Gán IP nội bộ
sudo ip addr add 10.0.0.2/24 dev vxlan100
# Kích hoạt interface
sudo ip link set vxlan100 up
4. Kiểm tra thành quả
Từ Host A, hãy thử ping sang IP ảo của Host B:
ping 10.0.0.2 -c 4
Nếu thấy phản hồi, bạn đã tạo thành công một “đường ống” Layer 2 xuyên qua môi trường Layer 3.
Tối ưu cho Container và VM bằng Linux Bridge
Trong thực tế, mình hiếm khi đặt IP trực tiếp lên interface VXLAN. Thay vào đó, mình tạo một Linux Bridge rồi gắn interface VXLAN và các interface của máy ảo (tap interface) vào đó. Cách này giúp các VM trên nhiều server vật lý giao tiếp như thể đang cắm chung một switch vật lý duy nhất.
# Tạo bridge mới
sudo ip link add br-overlay type bridge
sudo ip link set br-overlay up
# Gắn vxlan100 vào bridge
sudo ip link set vxlan100 master br-overlay
Khi áp dụng mô hình này cho cụm lab KVM, việc quản lý mạng trở nên cực kỳ nhàn nhã. Mình không còn phải chờ đợi quản trị viên hạ tầng cấu hình VLAN mỗi khi cần thêm phân vùng mạng mới cho khách hàng.
Những lưu ý sống còn khi vận hành
- Cạm bẫy MTU: Đây là lỗi phổ biến nhất. VXLAN thêm header dài 50 bytes vào gói tin. Nếu interface vật lý có MTU 1500, bạn phải chỉnh MTU của interface VXLAN xuống 1450. Nếu không, các gói tin lớn sẽ bị drop, gây hiện tượng website load chậm hoặc SSH bị treo.
- Tường lửa (Firewall): Hãy đảm bảo đã mở port
UDP 4789. Rất nhiều lần mình loay hoay debug cả tiếng đồng hồ chỉ vìufwđang chặn port này. - Mở rộng quy mô: Ví dụ trên dùng Unicast (remote IP) cho đơn giản. Với hệ thống lớn, hãy cân nhắc dùng Multicast hoặc BGP EVPN để tự động hóa việc học địa chỉ MAC.
VXLAN xóa bỏ rào cản giữa mạng vật lý và ảo hóa. Đây là công cụ không thể thiếu nếu bạn muốn xây dựng hạ tầng mạng linh hoạt, dễ mở rộng và độc lập với phần cứng.

