Hướng dẫn cài đặt và cấu hình Open vSwitch (OVS) trên Linux: VLAN, Bonding và SDN

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

Khi switch vật lý không còn đủ dùng

Mình từng quản lý một hệ thống lab với khoảng 20 máy ảo KVM chạy trên 3 host vật lý. Ban đầu dùng Linux Bridge bình thường, mọi thứ ổn. Nhưng khi cần tách mạng cho từng nhóm máy ảo (dev, staging, production), tạo VLAN để isolate traffic, hay muốn thử nghiệm SDN — Linux Bridge bắt đầu đuối. Cấu hình VLAN phải làm thủ công từng cái, không có cách nào nhìn tổng quan toàn bộ topology mạng, và quan trọng nhất: không monitor được traffic giữa các VM.

Đó là lúc mình chuyển sang Open vSwitch. Sau khi quen tay, nó không khó như cái tên nghe có vẻ enterprise.

Vấn đề thực tế với Linux Bridge truyền thống

Linux Bridge đủ dùng cho hầu hết nhu cầu đơn giản — nối VM vào mạng LAN, chia sẻ internet. Nhưng khi hệ thống lớn hơn, bạn sẽ gặp ngay mấy vấn đề này:

  • VLAN thủ công và rối: Phải tạo từng sub-interface (eth0.10, eth0.20…), mỗi VLAN một bridge riêng. Quản lý 10 VLAN là 10 bridge, rất khó theo dõi.
  • Không có visibility: Không biết traffic đang đi đâu, VM nào đang nói chuyện với VM nào. Muốn debug phải dùng tcpdump đoán mò.
  • Không tích hợp SDN được: Linux Bridge không hỗ trợ OpenFlow — giao thức dùng để lập trình hành vi switch từ một controller trung tâm (như OpenDaylight, ONOS, hay Neutron của OpenStack).
  • Bonding + VLAN phức tạp: Kết hợp bonding nhiều NIC với VLAN trên Linux Bridge là cả một bài toán cấu hình dài.

Nếu bạn chỉ có 2-3 VM thì không cần lo. Nhưng khi làm với KVM/Proxmox ở quy mô vừa, hoặc muốn học SDN/OpenStack, thì cần một thứ mạnh hơn.

Open vSwitch là gì và tại sao nó khác

Open vSwitch (OVS) là một switch ảo mã nguồn mở, chạy trong kernel Linux, được thiết kế cho môi trường ảo hóa. Nó hỗ trợ đầy đủ VLAN (802.1Q), LACP bonding, tunneling (VXLAN, GRE, Geneve), OpenFlow, và có database cấu hình riêng (OVSDB).

Khác với Linux Bridge, OVS quản lý tất cả qua một CLI thống nhất (ovs-vsctl). Cấu hình được lưu persistent tự động qua OVSDB — khởi động lại máy không mất setting. Và quan trọng hơn: OVS có thể bị điều khiển bởi SDN controller qua giao thức OpenFlow.

Nói đơn giản hơn: Linux Bridge như cái switch unmanaged mua ở chợ điện tử. OVS như switch managed của Cisco — có VLAN, có monitoring, có thể lập trình được.

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

Cài packages

# Ubuntu 22.04 / Debian 12
sudo apt update
sudo apt install -y openvswitch-switch openvswitch-common

# Kiểm tra service đang chạy
sudo systemctl status openvswitch-switch

# Kiểm tra version
ovs-vsctl --version

Cài trên CentOS/Rocky Linux

# Cần enable repo EPEL trước
sudo dnf install -y epel-release
sudo dnf install -y openvswitch
sudo systemctl enable --now openvswitch

Tạo switch ảo đầu tiên

Sau khi cài xong, tạo một bridge OVS (tương đương Linux Bridge nhưng do OVS quản lý):

# Tạo OVS bridge tên là br-ovs
sudo ovs-vsctl add-br br-ovs

# Thêm interface vật lý eth1 vào bridge
sudo ovs-vsctl add-port br-ovs eth1

# Xem tổng quan cấu hình hiện tại
sudo ovs-vsctl show

Output của ovs-vsctl show trông như này:

abc12345-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    Bridge br-ovs
        Port br-ovs
            Interface br-ovs
                type: internal
        Port eth1
            Interface eth1
    ovs_version: "3.1.0"

Cấu hình VLAN trên OVS

VLAN mới thấy rõ OVS vượt Linux Bridge ở chỗ nào. Mình cần tách 3 nhóm VM: VLAN 10 (dev), VLAN 20 (staging), VLAN 30 (production).

Access port — VM chỉ thuộc một VLAN

# VM1 thuộc VLAN 10 (dev) — gán tag cho port vnet0
sudo ovs-vsctl add-port br-ovs vnet0 tag=10

# VM2 thuộc VLAN 20 (staging)
sudo ovs-vsctl add-port br-ovs vnet1 tag=20

# VM3 thuộc VLAN 30 (production)
sudo ovs-vsctl add-port br-ovs vnet2 tag=30

Trunk port — đường uplink mang tất cả VLAN

# Port kết nối lên router/switch vật lý, cho qua tất cả VLAN
sudo ovs-vsctl add-port br-ovs eth1 trunks=10,20,30

# Hoặc cho qua tất cả VLAN (không giới hạn)
sudo ovs-vsctl set port eth1 trunks=[]

Với cấu hình này, VM trong VLAN 10 không thể nói chuyện với VM trong VLAN 20 — hoàn toàn isolated ở layer 2, không cần thêm firewall rule nào.

À, khi cần tính nhanh subnet cho từng VLAN — ví dụ VLAN 10 dùng 192.168.10.0/24, VLAN 20 dùng 10.20.0.0/24 — mình hay dùng toolcraft.app/vi/tools/developer/ip-subnet-calculator. Nhập CIDR vào là ra ngay network range, broadcast address, số host khả dụng — tiết kiệm thời gian tính tay.

Cấu hình Bonding (LACP) với OVS

Blog này đã có bài về Linux Network Bonding nên mình không lặp lại lý thuyết. Chỉ nói về cách làm với OVS — nó khác và đơn giản hơn nhiều.

Tạo bond hai NIC với LACP

# Xóa port đơn nếu đã add trước đó
sudo ovs-vsctl del-port br-ovs eth1

# Tạo bond từ eth1 + eth2 với LACP
sudo ovs-vsctl add-bond br-ovs bond0 eth1 eth2 \
    bond_mode=balance-tcp \
    lacp=active

# Xem trạng thái bond
sudo ovs-appctl bond/show bond0

OVS có 3 chế độ bond, mỗi cái phù hợp một tình huống khác nhau:

  • active-backup: 1 active, 1 standby. Đơn giản nhất, không cần switch hỗ trợ LACP. Failover tự động khi link chết.
  • balance-slb: Load balancing theo source MAC. Không cần LACP, nhưng chỉ phân tải được theo chiều ra.
  • balance-tcp: Load balancing theo flow (src/dst IP + port). Hiệu quả nhất — có thể đẩy đủ bandwidth 2 NIC — nhưng cần switch đầu kia hỗ trợ LACP 802.3ad.

Tunneling: Kết nối OVS trên nhiều host

Tính năng mình thích nhất là tunneling. Khi có 3 host vật lý, mỗi host chạy OVS, mình muốn VM trên host A nói chuyện được với VM trên host B như đang cùng một switch — mà không cần cấu hình gì trên switch vật lý.

Giải pháp: dùng VXLAN tunnel giữa các OVS.

# Trên Host A (IP: 192.168.1.10)
# Tạo tunnel tới Host B (192.168.1.20)
sudo ovs-vsctl add-port br-ovs vxlan-to-hostB \
    -- set interface vxlan-to-hostB \
    type=vxlan \
    options:remote_ip=192.168.1.20 \
    options:key=100

# Trên Host B (IP: 192.168.1.20)
# Tạo tunnel ngược lại tới Host A
sudo ovs-vsctl add-port br-ovs vxlan-to-hostA \
    -- set interface vxlan-to-hostA \
    type=vxlan \
    options:remote_ip=192.168.1.10 \
    options:key=100

Sau khi tạo tunnel, VM cùng VLAN trên hai host khác nhau có thể ping nhau qua mạng overlay. Traffic được đóng gói trong UDP port 4789, đi qua mạng vật lý như một packet bình thường — switch vật lý không cần biết gì về VLAN bên trong.

Một số lệnh debug thực tế hay dùng

# Xem toàn bộ cấu hình OVS
sudo ovs-vsctl show

# Xem flow table (OpenFlow rules đang active)
sudo ovs-ofctl dump-flows br-ovs

# Xem port statistics (packets, bytes, errors)
sudo ovs-ofctl dump-ports br-ovs

# Xem trạng thái từng interface
sudo ovs-vsctl list interface

# Xóa toàn bộ flow (reset về default forwarding)
sudo ovs-ofctl del-flows br-ovs

# Mirror traffic một port ra port khác (để capture)
sudo ovs-vsctl -- set Bridge br-ovs mirrors=@m \
  -- --id=@vnet0 get Port vnet0 \
  -- --id=@mirror_port get Port eth-monitor \
  -- --id=@m create Mirror name=monitor \
     select-dst-port=@vnet0 \
     select-src-port=@vnet0 \
     output-port=@mirror_port

Cái mirror traffic này hữu ích khi cần debug: clone toàn bộ traffic của một VM ra một interface khác để Wireshark capture mà không ảnh hưởng gì đến VM đang chạy.

Tích hợp SDN với OpenFlow

Nếu bạn đang học OpenStack, Kubernetes networking, hay muốn thử SDN controller — OVS hỗ trợ OpenFlow out of the box. Đây là cấu hình kết nối OVS tới một SDN controller:

# Kết nối br-ovs tới OpenDaylight/ONOS controller
sudo ovs-vsctl set-controller br-ovs tcp:192.168.1.100:6653

# Xem trạng thái kết nối controller
sudo ovs-vsctl get-controller br-ovs

# Thêm OpenFlow rule thủ công (ví dụ: drop traffic từ MAC cụ thể)
sudo ovs-ofctl add-flow br-ovs \
  "in_port=1,dl_src=aa:bb:cc:dd:ee:ff,actions=drop"

# Kiểm tra rule vừa thêm
sudo ovs-ofctl dump-flows br-ovs

Khi không có controller, OVS hoạt động như switch bình thường (fail-open mode). Khi controller kết nối được, nó sẽ đẩy flow rules xuống và kiểm soát hoàn toàn hành vi của switch.

Cách tiếp cận tốt nhất cho từng use case

Sau khoảng 2 năm dùng OVS trong lab, đây là cách mình lựa chọn cho từng tình huống:

  • Chỉ cần bridge đơn giản cho KVM/libvirt? Linux Bridge vẫn đủ. Đừng overcomplicate.
  • Cần VLAN isolation giữa nhiều VM? OVS với tagged ports — cấu hình nhanh hơn nhiều so với bridge + vlan interface.
  • Multi-host VM networking? OVS + VXLAN tunnel. Không cần switch vật lý hỗ trợ VLAN, không cần cấu hình gì ở phần cứng.
  • Học OpenStack/SDN? Bắt buộc phải dùng OVS. Neutron OVS driver là default của nhiều distro OpenStack.
  • Cần bandwidth cao + redundancy? OVS bond với balance-tcp + LACP — kết hợp cả hai mà không cần config phức tạp.

OVS có learning curve ban đầu, nhưng sau khi hiểu mô hình bridge/port/interface của nó thì cấu hình rất logic. Cái khó nhất thường là debug khi flow rules xung đột — lúc đó ovs-ofctl dump-flowsovs-appctl fdb/show là hai lệnh cứu sinh.

Share: