Sử dụng tcpdump và Wireshark để phân tích network traffic hiệu quả

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

Bắt tay vào dùng ngay trong 5 phút

Máy chủ có vấn đề network, không biết traffic đang chạy như thế nào? Mở terminal lên và chạy luôn:

# Bắt tất cả traffic trên interface eth0
sudo tcpdump -i eth0

# Chỉ xem traffic HTTP (port 80) và HTTPS (port 443)
sudo tcpdump -i eth0 'port 80 or port 443'

# Lưu ra file để mở bằng Wireshark sau
sudo tcpdump -i eth0 -w /tmp/capture.pcap

Ba lệnh đó là đủ để thấy traffic đang chạy qua server. Phần lọc và phân tích mới là chỗ mất thời gian — và cũng là chỗ thú vị nhất.

tcpdump — Vũ khí chính trên server không có GUI

Cài đặt

# Ubuntu/Debian
sudo apt install tcpdump -y

# CentOS/RHEL
sudo yum install tcpdump -y

# Kiểm tra interface đang có
sudo tcpdump -D

Các filter thường dùng nhất

tcpdump dùng Berkeley Packet Filter (BPF) syntax — nhìn lạ lúc đầu, nhưng chỉ cần 10 phút là thuộc hết mấy cái hay dùng:

# Lọc theo host (cả src lẫn dst)
sudo tcpdump -i eth0 host 192.168.1.100

# Chỉ xem traffic từ một IP cụ thể
sudo tcpdump -i eth0 src host 192.168.1.100

# Chỉ xem traffic đến một IP
sudo tcpdump -i eth0 dst host 192.168.1.100

# Lọc theo subnet
sudo tcpdump -i eth0 net 192.168.1.0/24

# Kết hợp nhiều điều kiện
sudo tcpdump -i eth0 'host 192.168.1.100 and port 443'

# Loại trừ SSH để không bị noise
sudo tcpdump -i eth0 'not port 22'

Output dễ đọc hơn

# -n: không resolve DNS (nhanh hơn)
# -nn: không resolve cả port name
# -v: verbose (thêm thông tin)
# -vv: rất verbose
# -X: hiển thị cả hex và ASCII
sudo tcpdump -i eth0 -nn -v 'port 80'

# Xem payload dạng ASCII (tốt cho HTTP)
sudo tcpdump -i eth0 -A -nn 'port 80' | head -100

Wireshark — Khi cần phân tích sâu

tcpdump capture, Wireshark phân tích. Workflow mình hay dùng nhất: capture trên server headless bằng tcpdump, copy file pcap về máy local, mở Wireshark. Tách bạch như vậy thì server không tốn tài nguyên chạy GUI, còn mình nhìn thoải mái.

Capture trên server, phân tích trên máy local

# Trên server: capture 60 giây, lưu file
sudo tcpdump -i eth0 -w /tmp/capture_$(date +%Y%m%d_%H%M%S).pcap -G 60 -W 1

# Copy về máy local
scp user@server:/tmp/capture_*.pcap ~/Desktop/

Mở file pcap trong Wireshark, dùng Display Filter để lọc:

# Filter trong Wireshark (Display Filter bar)
http                          # Chỉ HTTP
tcp.port == 443               # HTTPS
ip.addr == 192.168.1.100      # Theo IP
tcp.flags.syn == 1            # Chỉ SYN packets
http.response.code == 500     # HTTP 500 errors
dns                           # Chỉ DNS queries

Các tính năng Wireshark không thể bỏ qua

  • Follow TCP Stream: Click chuột phải vào packet → Follow → TCP Stream. Wireshark ghép toàn bộ conversation client-server lại thành một màn hình đọc được. Debug HTTP request mà dùng cái này thì tiết kiệm cả tiếng.
  • Statistics → Conversations: Một cái nhìn là biết ngay IP nào đang ngốn bandwidth nhiều nhất — rất hữu ích khi bị DDoS nhỏ hoặc có process nào đó đang kéo data bất thường.
  • Statistics → IO Graph: Đồ thị traffic theo thời gian. Dễ tìm spike bất thường hơn nhiều so với ngồi đọc từng dòng log.
  • Analyze → Expert Information: Wireshark tự highlight TCP retransmissions, connection resets, window size issues — không cần biết filter gì, cứ vào đây là thấy ngay có bao nhiêu vấn đề.

Debug thực tế: Intermittent Packet Loss

Lần debug khó nhất mình gặp là intermittent packet loss chỉ xảy ra vào 8-9 giờ tối. Ban ngày ping bình thường. Đến giờ cao điểm thì một số connection bắt đầu lag. Chạy ping -i 0.2 -c 500 thì loss rate chỉ 0.3-0.5% — đủ để user thấy lag nhưng quá thấp để tcpdump cơ bản phát hiện ra gì.

Cách xử lý:

# Capture liên tục, rotate file mỗi 5 phút, giữ tối đa 24 file (2 tiếng)
sudo tcpdump -i eth0 -w /tmp/capture_%H%M.pcap -G 300 -W 24 \
  'not port 22 and not arp'

# Script chạy song song để detect packet loss
ping -i 0.2 -c 1000 192.168.1.1 | grep -E 'packet loss|time='

Có file pcap đúng khung giờ xảy ra vấn đề, mở Wireshark và filter:

# Tìm TCP retransmissions
tcp.analysis.retransmission

# Tìm duplicate ACKs (dấu hiệu packet loss)
tcp.analysis.duplicate_ack

# Tìm tất cả TCP issues
tcp.analysis.flags

Kết quả khá rõ: retransmission rate nhảy từ dưới 1% lên 13-15% đúng lúc traffic spike. Trace lại theo timestamp, phát hiện một con switch trong hệ thống đang drop packets khi buffer đầy. Không phải server, không phải application — là switch. Không có Wireshark thì chắc mò thêm vài ngày nữa.

Nâng cao: Remote Capture qua SSH

Không muốn lưu file trên server? Pipe thẳng qua SSH về Wireshark trên máy local:

# Trên macOS/Linux, mở Wireshark local và capture từ remote server
ssh user@server 'sudo tcpdump -i eth0 -nn -w - not port 22' | wireshark -k -i -

# Hoặc dùng tshark (CLI version của Wireshark) để phân tích ngay trên server
sudo tshark -i eth0 -Y 'http.response.code >= 400' \
  -T fields -e ip.src -e http.response.code -e http.request.uri

Phân tích HTTP errors tự động với tshark

# Export HTTP requests ra CSV để phân tích
sudo tshark -r /tmp/capture.pcap \
  -Y 'http.request' \
  -T fields \
  -e frame.time \
  -e ip.src \
  -e http.request.method \
  -e http.request.uri \
  -E header=y \
  -E separator=, \
  > /tmp/http_requests.csv

# Đếm số request theo method
sudo tshark -r /tmp/capture.pcap \
  -Y 'http.request' \
  -T fields -e http.request.method | sort | uniq -c | sort -rn

Tips thực tế từ kinh nghiệm

1. Giới hạn kích thước capture để tránh đầy disk:

# Giới hạn 100MB, rotate qua 5 file
sudo tcpdump -i eth0 -w /tmp/cap.pcap -C 100 -W 5

2. Chỉ capture header, không capture payload — tiết kiệm space, vẫn đủ dữ liệu cho TCP analysis:

# -s 96: chỉ capture 96 bytes đầu mỗi packet
sudo tcpdump -i eth0 -s 96 -w /tmp/headers_only.pcap

3. Capture trên nhiều interface cùng lúc:

# Dùng 'any' để capture tất cả interfaces
sudo tcpdump -i any -nn -w /tmp/all_interfaces.pcap

4. Phân tích nhanh latency với tshark:

# Xem TCP connection setup time (SYN → SYN-ACK)
sudo tshark -r /tmp/capture.pcap \
  -Y 'tcp.flags.syn==1 and tcp.flags.ack==1' \
  -T fields -e ip.src -e ip.dst -e tcp.time_delta

5. Server dùng NIC offloading (checksum offload) thì tcpdump hay báo “bad checksum” — đây là false positive, không phải lỗi thật. Tắt cảnh báo đi cho đỡ rối:

sudo tcpdump -i eth0 --no-promiscuous-mode -K 'port 80'

Học hai tool này một lần, dùng được cả đời. tcpdump chạy được trên bất kỳ server Linux nào, không cần cài thêm gì, không cần GUI. Wireshark biến đống packet thô thành thứ con người đọc được. Cộng lại, hầu như không có lỗi network nào giấu mãi được.

Share: