Bắt đầu nhanh: STP trên Open vSwitch trong 5 phút
Lý thuyết hãy để sau. Đây là cách nhanh nhất để chạy STP trên máy Linux của bạn với Open vSwitch (OVS). Nếu chưa cài OVS:
sudo apt-get install openvswitch-switch -y
sudo systemctl start openvswitch-switch
sudo systemctl enable openvswitch-switch
Tạo bridge và bật STP lên:
# Tạo một OVS bridge
sudo ovs-vsctl add-br br0
# Bật STP trên bridge
sudo ovs-vsctl set bridge br0 stp_enable=true
# Kiểm tra STP đã hoạt động
sudo ovs-vsctl get bridge br0 stp_enable
Xong. STP đã hoạt động trên br0. Thêm các port vào và OVS xử lý phần còn lại — nó tự bầu chọn root bridge và chặn các đường dự phòng một cách tự động:
# Thêm port vào bridge
sudo ovs-vsctl add-port br0 eth1
sudo ovs-vsctl add-port br0 eth2
# Kiểm tra trạng thái STP của port
sudo ovs-ofctl show br0
Tìm hiểu sâu: STP thực sự làm gì và tại sao bạn cần nó
Khi chạy virtual switch trong môi trường lab hoặc cloud với OVS, hầu như luôn có các đường dư thừa ở đâu đó. Đó là điều đúng để đảm bảo tính sẵn sàng — nhưng nếu không có STP, các đường dư thừa đó sẽ sớm gây ra broadcast storm. Mỗi switch flood frame, frame bật lại, rồi lại bị flood tiếp. Trên đường link 1Gbps, bạn có thể làm bão hòa toàn bộ phân đoạn mạng trong chưa đầy 3 giây.
STP (IEEE 802.1D) giải quyết vấn đề này bằng cách chặn một số port. Chỉ một đường active tồn tại giữa hai bridge bất kỳ tại một thời điểm. Khi đường đó lỗi, STP tính toán lại và mở đường dự phòng — mặc dù STP cổ điển mất 30–50 giây để hội tụ, đủ lâu để ngắt các session đang hoạt động và phát sinh ticket hỗ trợ.
STP vs RSTP vs MSTP — Chọn loại phù hợp
Open vSwitch hỗ trợ cả ba:
- STP (802.1D) — cổ điển, hội tụ chậm (~50 giây), tránh dùng trong môi trường production
- RSTP (802.1w) — hội tụ nhanh (1–2 giây), tương thích ngược với STP, lựa chọn hợp lý mặc định cho hầu hết cấu hình
- MSTP (802.1s) — nhiều instance spanning tree, ánh xạ VLAN vào các cây khác nhau, tốt nhất cho môi trường multi-VLAN phức tạp khi cần cân bằng tải thực sự trên các uplink dự phòng
RSTP là lựa chọn đúng đắn cho hầu hết các triển khai OVS. Tôi đã chạy nó trong production trên các cụm KVM hypervisor với bonded uplink — không có broadcast storm nào, và khi một uplink bị ngắt, failover hoàn thành trong chưa đầy 2 giây. Nó hoạt động đơn giản vậy thôi.
Giải thích các trạng thái port STP
Mỗi port được STP quản lý sẽ đi qua các trạng thái sau:
- Blocking — nhận BPDU nhưng không chuyển tiếp lưu lượng
- Listening — tham gia bầu chọn root bridge
- Learning — xây dựng bảng địa chỉ MAC, chưa chuyển tiếp
- Forwarding — hoạt động đầy đủ, truyền lưu lượng bình thường
- Disabled — bị tắt theo cấu hình quản trị
RSTP có thể bỏ qua thẳng đến trạng thái forwarding trong điều kiện phù hợp. Các edge port kết nối đến thiết bị đầu cuối và các đường point-to-point giữa các switch sẽ hoạt động ngay lập tức — không cần chờ đợi. Đó chính là điều rút ngắn thời gian hội tụ từ 50 giây xuống còn dưới 2 giây.
Bầu chọn Root Bridge
STP chọn root bridge bằng cách so sánh Bridge ID — sự kết hợp giữa priority (mặc định 32768) và địa chỉ MAC. Giá trị thấp nhất thắng. Vì địa chỉ MAC nằm ngoài tầm kiểm soát của bạn, để priority ở mặc định nghĩa là việc chọn root bridge thực chất là ngẫu nhiên. Hãy đặt giá trị này một cách rõ ràng:
# Priority thấp hơn = cơ hội cao hơn trở thành root bridge
# Priority phải là bội số của 4096 (0, 4096, 8192... 61440)
sudo ovs-vsctl set bridge br0 other-config:stp-priority=4096
# Kiểm tra
sudo ovs-vsctl get bridge br0 other-config
Cấu hình nâng cao: RSTP và MSTP
Chuyển sang RSTP
OVS xử lý RSTP như một cờ riêng biệt so với STP cổ điển — bạn không thể chỉ đơn giản chuyển chế độ. Bật nó một cách tường minh:
# Tắt STP trước nếu đang bật
sudo ovs-vsctl set bridge br0 stp_enable=false
# Bật RSTP
sudo ovs-vsctl set bridge br0 rstp_enable=true
# Xác nhận
sudo ovs-vsctl get bridge br0 rstp_enable
Tinh chỉnh Port Path Cost và Priority
Path cost cho STP biết đường nào nên ưu tiên. Cost thấp hơn nghĩa là port được ưu tiên để chuyển tiếp. Port priority phá vỡ sự bằng nhau khi hai port có path cost giống nhau:
# Ưu tiên eth1 hơn eth2 bằng cách gán path cost thấp hơn
sudo ovs-vsctl set port eth1 other-config:rstp-path-cost=100
sudo ovs-vsctl set port eth2 other-config:rstp-path-cost=200
# Đặt port priority (thấp hơn = được ưu tiên hơn, mặc định 128)
sudo ovs-vsctl set port eth1 other-config:rstp-port-priority=64
# Đánh dấu port là edge (kết nối đến server/VM — bỏ qua độ trễ learning)
sudo ovs-vsctl set port eth1 other-config:rstp-port-admin-edge=true
sudo ovs-vsctl set port eth1 other-config:rstp-port-auto-edge=true
MSTP cho môi trường Multi-VLAN
MSTP ánh xạ VLAN vào các instance spanning tree riêng biệt (MSTI). VLAN 10 sử dụng một đường vật lý, VLAN 20 sử dụng đường khác — phân phối tải thực sự trên các đường dự phòng, không chỉ failover. Trong OVS, MSTP cơ bản chia sẻ cờ rstp_enable với RSTP:
# Bật RSTP/MSTP
sudo ovs-vsctl set bridge br0 rstp_enable=true
# Xem topology spanning tree hiện tại
sudo ovs-appctl rstp/show br0
Quản lý instance per-VLAN đầy đủ trong OVS thường cần một SDN controller đứng sau. Với OVS standalone, RSTP xử lý được đại đa số trường hợp mà không cần thêm độ phức tạp.
Kiểm tra Topology Spanning Tree
# Trạng thái RSTP chi tiết cho tất cả bridge
sudo ovs-appctl rstp/show
# Giới hạn cho một bridge cụ thể
sudo ovs-appctl rstp/show br0
# Tổng quan cấu hình OVS đầy đủ
sudo ovs-vsctl show
Kết quả rstp/show cho bạn biết bridge nào là root, vai trò port (root, designated, alternate), trạng thái forwarding hay blocking, và path cost. Bắt đầu từ đây khi có gì đó trông không ổn.
Mẹo thực tế từ thực chiến
1. Luôn đặt Bridge Priority một cách rõ ràng
Priority mặc định (32768) nghĩa là địa chỉ MAC sẽ chọn root — thực chất là ngẫu nhiên. Gán priority một cách có chủ đích để switch đáng tin cậy nhất của bạn luôn thắng:
# Bridge lõi — root
sudo ovs-vsctl set bridge core-br other-config:rstp-priority=4096
# Bridge phân phối — backup root
sudo ovs-vsctl set bridge dist-br other-config:rstp-priority=8192
# Bridge truy cập — không bao giờ là root
sudo ovs-vsctl set bridge access-br other-config:rstp-priority=32768
2. Đánh dấu Port VM/Server là Edge Port
Các port VM và port hướng đến server sẽ không tạo ra vòng lặp — chúng kết nối đến endpoint, không phải các switch khác. Đánh dấu chúng là edge port và chúng sẽ bỏ qua hoàn toàn độ trễ learning của STP, hoạt động ngay lập tức:
# Áp dụng cấu hình edge port cho tất cả tap interface (port VM)
for port in $(sudo ovs-vsctl list-ports br0 | grep tap); do
sudo ovs-vsctl set port "$port" other-config:rstp-port-admin-edge=true
sudo ovs-vsctl set port "$port" other-config:rstp-port-auto-edge=true
done
3. Theo dõi Topology Change Notification
Thay đổi topology thường xuyên (TCN) sẽ xóa bảng MAC và gây ra flooding tạm thời. Khi điều này liên tục xảy ra, có gì đó không ổn — một đường link bị flapping, port cấu hình sai, hoặc vòng lặp bạn chưa phát hiện ra. Theo dõi log:
# Theo dõi sự kiện STP/RSTP theo thời gian thực
sudo tail -f /var/log/openvswitch/ovs-vswitchd.log | grep -i "rstp\|stp\|topology"
# Tóm tắt vai trò và trạng thái port
sudo ovs-appctl rstp/show br0 | grep -E "role|state|cost"
4. Kiểm tra với vòng lặp có chủ đích
Cách kiểm tra tốt nhất: tạo vòng lặp thủ công bằng cặp veth, rồi quan sát OVS tự chặn một trong các port:
# Tạo hai bridge
sudo ovs-vsctl add-br br-test1
sudo ovs-vsctl add-br br-test2
# Tạo hai cặp veth (hai đường giữa các bridge = vòng lặp)
sudo ip link add veth1a type veth peer name veth1b
sudo ip link add veth2a type veth peer name veth2b
# Kết nối cả hai cặp giữa hai bridge
sudo ovs-vsctl add-port br-test1 veth1a
sudo ovs-vsctl add-port br-test2 veth1b
sudo ovs-vsctl add-port br-test1 veth2a
sudo ovs-vsctl add-port br-test2 veth2b
# Bật RSTP trên cả hai
sudo ovs-vsctl set bridge br-test1 rstp_enable=true
sudo ovs-vsctl set bridge br-test2 rstp_enable=true
# Khởi động tất cả interface
sudo ip link set veth1a up; sudo ip link set veth1b up
sudo ip link set veth2a up; sudo ip link set veth2b up
# Chờ vài giây rồi kiểm tra
sudo ovs-appctl rstp/show br-test1
Một port veth sẽ hiển thị Alternate (blocking), port kia là Designated (forwarding). Vòng lặp vật lý vẫn còn đó — STP đã phá vỡ nó về mặt logic. Đó là sự xác nhận bạn đang tìm kiếm.
Tham chiếu nhanh: Các lệnh OVS STP thông dụng
# Bật/tắt STP cổ điển
sudo ovs-vsctl set bridge br0 stp_enable=true|false
# Bật/tắt RSTP
sudo ovs-vsctl set bridge br0 rstp_enable=true|false
# Đặt bridge priority (bội số của 4096)
sudo ovs-vsctl set bridge br0 other-config:rstp-priority=4096
# Đặt port path cost
sudo ovs-vsctl set port eth0 other-config:rstp-path-cost=100
# Hiển thị trạng thái spanning tree
sudo ovs-appctl rstp/show [bridge-name]
# Kiểm tra phiên bản OVS
sudo ovs-vswitchd --version
Cấu hình STP trên OVS không phải là công việc hào nhoáng. Nhưng đặt priority đúng cách, đánh dấu port VM là edge port, chạy bài kiểm tra vòng lặp một lần để xác nhận nó hoạt động, và STP sẽ âm thầm giữ cho mạng của bạn ổn định trong khi bạn giải quyết những vấn đề thú vị hơn.

