Cuộc Gọi Lúc 2 Giờ Sáng Thay Đổi Cách Tôi Nhìn Về VLAN
Ba năm trước, tôi bị gọi vào giữa đêm vì “cả văn phòng không kết nối được với server.” Không phải một người. Cả 60 người trong văn phòng. Tôi bật dậy, VPN vào hệ thống, rồi mất 45 phút đuổi theo bóng ma — chỉ để phát hiện ra có ai đó đã cắm laptop vào sai cổng switch và làm sập toàn bộ phân đoạn mạng.
Nguyên nhân gốc rễ không phải cáp hay card mạng hỏng. Đó là một cấu hình VLAN bị thiếu trên một trunk port. Đêm đó khiến chúng tôi mất $4.000 tiền phạt SLA và cho tôi một bài học nhớ đời về việc cấu hình VLAN đúng ngay từ đầu.
Dù hệ thống của bạn đang gặp sự cố hay bạn chỉ muốn phòng ngừa từ đầu — hướng dẫn này dành cho bạn.
Chuyện Gì Thực Sự Xảy Ra Khi Mạng Của Bạn “Gặp Sự Cố”
Phần lớn các sự cố mạng bị đổ lỗi cho “switch” thực ra là do cấu hình VLAN sai. Trước khi đi vào các lệnh cụ thể, bạn cần hiểu VLAN hoạt động như thế nào ở tầng frame — vì khi hiểu rõ vấn đề, cách sửa sẽ trở nên hiển nhiên. Nếu bạn muốn có nền tảng vững chắc hơn về cách các tầng mạng tương tác với nhau, hãy xem mô hình OSI 7 tầng dành cho kỹ sư DevOps.
VLAN (Virtual Local Area Network) chia mạng vật lý của bạn thành các broadcast domain độc lập. Thiết bị trong VLAN 10 không thể giao tiếp với thiết bị trong VLAN 20 trừ khi traffic đi qua thiết bị Layer 3. Đây không phải lỗi — đây chính là mô hình bảo mật.
Mỗi cổng switch hoạt động theo một trong hai chế độ:
- Access port — thuộc về đúng một VLAN, gỡ VLAN tag trước khi chuyển tiếp đến thiết bị đầu cuối. Máy trạm, máy in và thiết bị IoT kết nối ở đây.
- Trunk port — mang nhiều VLAN được gắn tag theo chuẩn 802.1Q. Dùng cho liên kết switch-to-switch và switch-to-router.
Sự cố tôi kể ở trên? Ai đó đã thêm VLAN mới vào switch nhưng quên cho phép nó trên trunk port giữa access layer và distribution layer. Traffic từ VLAN mới không có đường đi.
Phân Tích Nguyên Nhân Gốc Rễ: Tại Sao Cấu Hình VLAN Thất Bại Trên Production
Sau nhiều năm trực on-call, tôi đã liệt kê được những lỗi VLAN lặp đi lặp lại:
- Trunk port thiếu VLAN — bạn thêm VLAN 30 vào một switch nhưng quên cho phép nó trên uplink trunk. Traffic bị blackhole.
- Native VLAN không khớp — Switch A có native VLAN 1, Switch B có native VLAN 99. Traffic không có tag bị gán sai. Kết quả là kết nối gián đoạn kỳ lạ, cực kỳ khó truy tìm nguyên nhân.
- Thay đổi topology STP — thêm VLAN mới mà không kiểm tra Spanning Tree Priority dẫn đến bầu chọn root bridge bất ngờ.
- Chưa cấu hình inter-VLAN routing — VLAN tồn tại nhưng không có đường Layer 3 giữa chúng. Người dùng ping được trong VLAN của mình nhưng không đi được đâu khác.
- VLAN không có trong VLAN database — bạn gán port vào VLAN 50 nhưng VLAN 50 chưa được tạo. Port rơi vào trạng thái inactive.
Hầu hết mọi sự cố VLAN đều rơi vào một trong năm loại này. Khi bạn đã gặp đủ cả năm, bạn sẽ không còn đoán mò mà đi thẳng vào checklist. Để chủ động phát hiện các vấn đề mạng trước khi chúng leo thang, quét mạng với Nmap là kỹ năng bổ trợ rất hữu ích.
So Sánh Giải Pháp: Cisco IOS vs. Open vSwitch vs. Linux Bridge
Các lệnh trông khác nhau tùy nền tảng — nhưng logic bên dưới không thay đổi. Đây là cách hoạt động trên ba môi trường tôi dùng nhiều nhất.
Lựa Chọn 1: Cisco IOS (Catalyst switches)
Kịch bản doanh nghiệp phổ biến nhất. Tạo VLAN và gán port khá đơn giản:
# Tạo VLAN trong VLAN database
switch# configure terminal
switch(config)# vlan 10
switch(config-vlan)# name OFFICE
switch(config-vlan)# vlan 20
switch(config-vlan)# name SERVERS
switch(config-vlan)# exit
# Cấu hình access port (ví dụ: Gi0/1 cho máy trạm)
switch(config)# interface GigabitEthernet0/1
switch(config-if)# switchport mode access
switch(config-if)# switchport access vlan 10
switch(config-if)# spanning-tree portfast
switch(config-if)# exit
# Cấu hình trunk port (ví dụ: Gi0/24 uplink)
switch(config)# interface GigabitEthernet0/24
switch(config-if)# switchport mode trunk
switch(config-if)# switchport trunk encapsulation dot1q
switch(config-if)# switchport trunk allowed vlan 10,20
switch(config-if)# switchport trunk native vlan 999
switch(config-if)# exit
# Lưu cấu hình
switch# write memory
Dòng native vlan 999 là có chủ ý — tôi luôn đặt native VLAN thành một VLAN không dùng đến. Để nguyên VLAN 1 là một rủi ro bảo mật nổi tiếng (tấn công VLAN hopping khai thác native VLAN 1). Để hiểu sâu hơn về cách bảo vệ hạ tầng mạng khỏi các kiểu tấn công này, hướng dẫn cấu hình tường lửa Linux với iptables và nftables là tài liệu đáng đọc tiếp theo.
Lựa Chọn 2: Open vSwitch (môi trường ảo hóa/SDN)
Đang chạy KVM, OpenStack hay bất kỳ hạ tầng dựa trên SDN nào? Open vSwitch xử lý VLAN theo cách khác:
# Tạo một bridge
ovs-vsctl add-br br0
# Thêm interface vật lý làm trunk
ovs-vsctl add-port br0 eth0
# Thêm interface VM làm access port cho VLAN 10
ovs-vsctl add-port br0 vnet0 tag=10
# Thêm trunk port cho phép VLAN 10 và 20
ovs-vsctl add-port br0 eth1 trunks=10,20
# Kiểm tra
ovs-vsctl show
ovs-ofctl show br0
Lựa Chọn 3: Linux kernel bridge (server/container đơn giản)
Dành cho Linux server cần tham gia vào VLAN mà không cần cả stack SDN:
# Tải module 8021q nếu chưa được tải
modprobe 8021q
echo "8021q" >> /etc/modules
# Tạo VLAN interface trên eth0 cho VLAN 10
ip link add link eth0 name eth0.10 type vlan id 10
ip link set eth0.10 up
ip addr add 192.168.10.100/24 dev eth0.10
# Tạo bridge và gắn VLAN interface vào
ip link add name br-vlan10 type bridge
ip link set eth0.10 master br-vlan10
ip link set br-vlan10 up
# Cố định cấu hình với /etc/network/interfaces (Debian/Ubuntu)
cat >> /etc/network/interfaces << 'EOF'
auto eth0.10
iface eth0.10 inet manual
vlan-raw-device eth0
auto br-vlan10
iface br-vlan10 inet static
bridge_ports eth0.10
address 192.168.10.100
netmask 255.255.255.0
EOF
Phương Pháp Tốt Nhất: Inter-VLAN Routing với Router-on-a-Stick
VLAN cô lập traffic — nhưng người dùng vẫn cần giao tiếp qua ranh giới phân đoạn. Máy trạm trong VLAN 10 cần kết nối đến server trong VLAN 20. Khi không có Layer 3 switch, giải pháp gọn nhất là router-on-a-stick: một trunk link giữa switch và router, với các sub-interface xử lý từng VLAN. Nếu bạn muốn hiểu rõ hơn về NAT và cách traffic định tuyến qua các ranh giới mạng, bài viết về NAT và Port Forwarding sẽ bổ sung kiến thức rất tốt.
Tôi đã chạy thiết lập này trên production với hơn 15 VLAN trên một uplink duy nhất. Nó hoạt động tốt dưới tải nặng và cấu hình vẫn dễ kiểm tra.
# Trên Cisco router — cấu hình sub-interface cho inter-VLAN routing
router# configure terminal
# Sub-interface cho VLAN 10
router(config)# interface GigabitEthernet0/0.10
router(config-subif)# encapsulation dot1Q 10
router(config-subif)# ip address 192.168.10.1 255.255.255.0
router(config-subif)# exit
# Sub-interface cho VLAN 20
router(config)# interface GigabitEthernet0/0.20
router(config-subif)# encapsulation dot1Q 20
router(config-subif)# ip address 192.168.20.1 255.255.255.0
router(config-subif)# exit
# Bật interface vật lý
router(config)# interface GigabitEthernet0/0
router(config-if)# no shutdown
router(config-if)# exit
router# write memory
Sau đó, đặt default gateway cho các host trong VLAN 10 là 192.168.10.1 và VLAN 20 là 192.168.20.1. Traffic giữa các VLAN giờ đây sẽ đi qua các sub-interface của router.
Các Lệnh Kiểm Tra Bạn Nên Thuộc Lòng
Khi sự cố xảy ra lúc 2 giờ sáng, bạn không có thời gian lên mạng tìm kiếm. Đây là các lệnh tôi chạy theo thứ tự:
# Kiểm tra VLAN database — VLAN đã được tạo chưa?
show vlan brief
# Kiểm tra trạng thái trunk — VLAN có được cho phép trên trunk không?
show interfaces trunk
# Kiểm tra một interface cụ thể
show interfaces GigabitEthernet0/24 trunk
show interfaces GigabitEthernet0/1 switchport
# Kiểm tra bảng MAC address cho một VLAN cụ thể
show mac address-table vlan 10
# Kiểm tra spanning tree theo VLAN
show spanning-tree vlan 10
# Trên Linux — kiểm tra VLAN interface
ip link show type vlan
cat /proc/net/vlan/config
# Trên Open vSwitch — kiểm tra cấu hình port
ovs-vsctl list port
ovs-vsctl get port vnet0 tag
Checklist 5 Phút Trước Khi Thay Đổi
Mỗi lần tôi chỉnh sửa cấu hình VLAN trên production, tôi chạy qua danh sách này trước:
- Ghi lại trạng thái hiện tại:
show running-config→ lưu vào file - Xác nhận VLAN tồn tại trong database trước khi gán vào port
- Kiểm tra trunk port và xác nhận VLAN mới sẽ được cho phép
- Xác nhận native VLAN khớp ở cả hai đầu của mỗi trunk
- Sau khi thay đổi: kiểm tra với
show vlan briefvà test ping
Thực tế mà nói, checklist này đã ngăn ít nhất một tá vấn đề trước khi chúng trở thành những cuộc gọi thâu đêm. Năm phút kiểm tra trước còn hơn 45 phút debug lúc 2 giờ sáng — tôi nói từ kinh nghiệm xương máu.
Tài Liệu Tham Khảo Xử Lý Sự Cố Nhanh
- Port ở trạng thái inactive/notconnect → VLAN không tồn tại trong database. Chạy
show vlan briefvà tạo VLAN đó. - Traffic hoạt động trong VLAN nhưng không đi được giữa các VLAN → Chưa cấu hình inter-VLAN routing hoặc thiếu sub-interface.
- Kết nối gián đoạn giữa các switch → Native VLAN không khớp. Chạy
show interfaces trunktrên cả hai switch và so sánh. - VLAN mới không kết nối được lên upstream → VLAN chưa được cho phép trên trunk. Thêm bằng
switchport trunk allowed vlan add 30(không phảiswitchport trunk allowed vlan 30— lệnh đó sẽ thay thế toàn bộ danh sách allowed). - Không ping được default gateway → Sub-interface bị down hoặc sai encapsulation. Kiểm tra
show interfaces GigabitEthernet0/0.10.
VLAN sẽ không còn đáng sợ nữa khi bạn nắm vững hai điều: mô hình access-vs-trunk và năm kiểu lỗi phổ biến. Cú pháp lệnh thay đổi tùy vendor và nền tảng. Nhưng logic thì không bao giờ đổi — tag được gắn tại trunk port, gỡ ra tại access port, và traffic chỉ vượt qua ranh giới VLAN ở tầng Layer 3.
Hãy đặt native VLAN của bạn thành một VLAN không dùng đến, kiểm tra trunk sau mỗi lần thay đổi, và giữ checklist đó gần bên. Chính bạn trong tương lai — người đang nhận cuộc gọi lúc 2 giờ sáng — sẽ biết ơn điều đó.

