Hướng dẫn cấu hình Port Mirroring trên vSphere Distributed Switch để bắt gói tin bằng Wireshark

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

Sự cố thực tế: Khi máy ảo lỗi mạng chập chờn và packet capture cục bộ bó tay

Cụm VMware 8 host ESXi chỗ mình vận hành tuần trước gặp một ca khá oái oăm. Máy ảo chạy payment gateway kết nối sang cổng thanh toán ngân hàng thỉnh thoảng lại văng lỗi SSL Handshake Timeout. Tần suất xuất hiện chừng 3–5 phút mỗi giờ, tỉ lệ rớt tầm 4% tổng lượng transaction. Khổ nỗi, anh em chạy curl hay ping kiểm tra thủ công thì mạng vẫn thông suốt, trả về HTTP 200 ngon lành.

Nhiều anh em thường nghĩ ngay đến việc SSH vào máy ảo rồi chạy tcpdump. Thực tế trên môi trường production lại vướng rào cản lớn:

  • VM chạy dạng appliance đóng gói sẵn của bên thứ ba, không có quyền root và không thể cài thêm bất kỳ package nào.
  • Chính sách bảo mật PCI-DSS nghiêm cấm cài phần mềm sniff mạng trực tiếp trên server xử lý thẻ để tránh lộ lọt dữ liệu và quá tải CPU.
  • Cần kiểm tra gói tin thô ở tầng card mạng ảo trước khi bị iptables hoặc firewall nội bộ của OS can thiệp.

Không thể chạm vào máy ảo. Giải pháp khả dĩ duy nhất là trích xuất luồng dữ liệu trực tiếp từ cổng switch ảo của VMware.

Bản chất vấn đề: Vì sao switch ảo chặn việc bắt gói tin chéo VM?

vSwitch hoạt động chuẩn ở Layer 2. Khi máy ảo A gửi packet tới máy ảo B, switch tra bảng MAC address table rồi chuyển tiếp frame thẳng sang port đích. Máy ảo C nằm cùng port group hoàn toàn mù tịt về luồng dữ liệu này, trừ khi đó là gói broadcast hoặc multicast.

Kiến trúc này triệt tiêu nguy cơ đụng độ gói tin và cô lập dữ liệu giữa các tenant. Do đó, muốn máy ảo C bắt được lưu lượng giữa A và B, bạn buộc phải can thiệp vào tầng chuyển mạch của hypervisor.

3 hướng tiếp cận khi cần bắt gói tin trên hạ tầng VMware

Cách 1: Bật Promiscuous Mode trên Port Group

Giải pháp nhanh nhất là đổi Promiscuous Mode từ Reject sang Accept trong phần Security policy của Port Group.

Ưu điểm: Thiết lập mất chưa đầy 1 phút. Máy ảo chạy Wireshark cắm chung port group sẽ hứng được packet.

Nhược điểm: Rủi ro bảo mật rất cao. Bất kỳ máy ảo nào trong port group đó đều có thể nghe lén dữ liệu của nhau. Nghiêm trọng hơn, cách này vô tác dụng nếu máy ảo nguồn và máy ảo sniffer nằm trên hai host ESXi khác nhau.

Cách 2: Dùng lệnh pktcap-uw trên ESXi Shell

VMware tích hợp sẵn công cụ CLI pktcap-uw ngay trong nhân ESXi. Bạn SSH vào host chứa VM rồi bắt gói tin theo switch port ID:

# Liệt kê danh sách port ID trên vSwitch
esxcfg-vswitch -l

# Capture gói tin trên port 50331658 và ghi ra datastore
pktcap-uw --switchport 50331658 --dir 2 -o /vmfs/volumes/datastore1/trace.pcap

Ưu điểm: Bắt gói tin cực sâu ở tầng VMkernel, không phụ thuộc vào cấu hình switch.

Nhược điểm: Phải bật dịch vụ SSH trên ESXi host (thường bị khoá cứng theo security baseline). Thao tác tải file pcap từ datastore về máy cá nhân rất mất thời gian, không đáp ứng được nhu cầu xem live traffic khi cần xử lý sự cố khẩn cấp.

Cách 3: Cấu hình Port Mirroring trên vSphere Distributed Switch (vDS)

Tính năng này tương tự cơ chế SPAN/ERSPAN trên switch Cisco vật lý. vDS tự động nhân bản frame từ vNIC của máy ảo mục tiêu và chuyển sang vNIC của máy ảo sniffer. Hai VM này nằm cùng host hay khác host trong cluster đều hoạt động chính xác.

Triển khai chi tiết: Cấu hình Distributed Port Mirroring trên vDS

Với hệ thống enterprise, đây là phương án tối ưu và an toàn nhất: không mở port SSH trên ESXi, không vi phạm chính sách bảo mật nội bộ và theo dõi được gói tin theo thời gian thực.

Bước 1: Tạo máy ảo Sniffer chuyên dụng

Dựng một VM chạy Ubuntu 22.04 LTS hoặc Windows Server, cài sẵn Wireshark và tshark. Gắn cho VM này 2 card mạng ảo:

  • vNIC 1: Kết nối mạng quản trị bình thường để SSH/RDP vào điều khiển.
  • vNIC 2: Dùng riêng để hứng traffic mirror (tuyệt đối không gán địa chỉ IP).

Trên vSphere Client, tạo một Distributed Port Group mới tên là PG-Sniffer-Capture, gán vào vNIC 2. Tại mục Security của port group này, thiết lập:

  • Promiscuous mode: Accept
  • MAC address changes: Accept
  • Forged transmits: Accept

Bước 2: Xác định Port ID của máy ảo cần theo dõi

Mở vSphere Client > Networking > Chọn vDS đang sử dụng > Chọn Distributed Port Group của máy ảo mục tiêu > Tab Ports. Tìm đúng tên VM và ghi lại giá trị cột Port ID (ví dụ: port 1024 của VM payment-gw, port 2048 của vNIC 2 máy sniffer).

Bước 3: Khởi tạo Port Mirroring Session

  1. Tại giao diện vDS, vào tab Configure > Port Mirroring.
  2. Nhấn New để mở wizard tạo session.
  3. Chọn loại session: Distributed Port Mirroring (hỗ trợ source và destination nằm chéo host ESXi).
  4. Đặt tên session: Mirror-Payment-GW-Trace, gạt trạng thái sang Enabled.
  5. Mục Sources: Điền Port ID của máy mục tiêu (1024), chọn chiều lưu lượng Ingress / Egress để hứng trọn hai chiều gửi và nhận.
  6. Mục Destinations: Điền Port ID vNIC hứng của máy sniffer (2048).
  7. Rà soát lại toàn bộ thông số rồi nhấn Finish.

Nếu cần cấu hình hàng loạt port qua automation, bạn có thể chạy đoạn script PowerCLI chuẩn sau:

# Kết nối vCenter Server
Connect-VIServer -Server vcenter.corp.local -User [email protected] -Password "SecretP@ss!"

# Lấy thông tin Distributed Switch
$vds = Get-VDSwitch -Name "vDS-Core-Cluster"
$vdsView = Get-View $vds

# Khởi tạo thông số mirror session
$configSpec = New-Object VMware.Vim.VMwareDVSConfigSpec
$session = New-Object VMware.Vim.VMwareDVSPortMirroringSessionConfigSpec
$session.key = "TraceSession01"
$session.name = "Live-Debug-Session"
$session.enabled = $true
$session.direction = "both"
$session.sourcePortKey = @("1024")
$session.destinationPortKey = @("2048")
$configSpec.portMirroringConfigSpec += $session

# Đẩy cấu hình trực tiếp vào vDS qua API
$vdsView.ReconfigureDvs_Task($configSpec)

Bước 4: Bắt và bóc tách gói tin trên máy Sniffer

Đăng nhập vào máy sniffer. Giả sử vNIC hứng traffic nhận diện trên Linux là ens224, kiểm tra nhanh xem gói tin đã đổ về chưa:

# Xem nhanh 10 gói tin đầu tiên đổ về card hứng
sudo tshark -i ens224 -c 10

# Bắt toàn bộ lưu lượng cổng 443 và ghi ra file pcap
sudo tcpdump -i ens224 -nn "tcp port 443" -w /tmp/payment_tls.pcap

Mở file payment_tls.pcap bằng Wireshark hoặc soi trực tiếp trên GUI qua card ens224. Dán bộ lọc sau vào thanh search bar:

tcp.port == 443 && (tcp.flags.reset == 1 || tls.record.content_type == 21)

Bộ lọc này cô lập ngay các gói TCP RST (ngắt kết nối bất thường) và TLS Alert (lỗi thỏa thuận chứng chỉ/phiên bản TLS). Ở ca sự cố thực tế của mình, Wireshark bắt được gói TLS Alert (Level: Fatal, Description: Handshake Failure) xuất phát từ IP ngân hàng: họ vừa nâng cấp cipher suite phía họ mà không thông báo trước, khiến thư viện OpenSSL cũ trên máy payment gateway bị từ chối kết nối.

Hai nguyên tắc sống còn khi chạy Port Mirroring

  • Luôn tắt session ngay sau khi trace xong: Mirror traffic nhân đôi băng thông trên vSwitch. Với các VM có lưu lượng từ 2–5 Gbps, treo session liên tục sẽ vắt kiệt băng thông uplink vật lý của ESXi host và gây nghẽn I/O ổ đĩa máy sniffer.
  • Bật Sampling Rate nếu traffic lớn: Khi theo dõi các cụm database hay cache throughput cao, hãy cấu hình thêm Sampling Rate (ví dụ: chỉ nhân bản 1 trên 5 gói) ngay trong cài đặt session vDS để bảo vệ card mạng máy bắt gói tin.
Share: