Bạn có một file pcap từ tcpdump hoặc Wireshark. Bây giờ bạn cần tìm câu trả lời từ đó. Nếu bạn đang SSH vào server từ xa hoặc làm việc trong CI pipeline, thì Wireshark GUI không phải lựa chọn khả thi. tshark lấp đầy khoảng trống đó — đây là giao diện CLI cho toàn bộ engine phân tích của Wireshark. Khi đã nắm được cú pháp trích xuất trường dữ liệu, các bản ghi gói tin thô sẽ trở thành dữ liệu có cấu trúc mà bạn có thể truy vấn trực tiếp từ shell.
Tôi đã dùng công cụ này để điều tra sự cố trên môi trường production — phân tích bản ghi từ nhiều node cùng lúc, kể cả các file hơn 100MB. Nó xử lý mà không hề phàn nàn.
So sánh các phương pháp: tshark vs tcpdump vs Scripted Dissection
Khi phân tích file pcap có sẵn, bạn có ba lựa chọn thực tế:
Lựa chọn 1: Đọc lại với tcpdump
Phát lại pcap qua tcpdump -r file.pcap nhẹ và có sẵn ở khắp nơi. Nhưng output của tcpdump là văn bản theo từng dòng với khả năng nhận biết giao thức hạn chế — phù hợp để xem nhanh, không hữu ích khi cần trích xuất các trường cụ thể hay tính byte theo từng giao thức.
Lựa chọn 2: Phân tích byte thô bằng Python (scapy / dpkt)
scapy cho bạn toàn quyền kiểm soát bằng Python. Lặp qua từng gói tin, xây dựng bất kỳ thống kê nào bạn muốn. Nhược điểm là có thật: chi phí cài đặt, hiệu suất chậm với file trên 50MB, và bạn sẽ phải tái triển khai việc phân tích giao thức mà Wireshark đã xử lý đúng — kể cả các edge case bạn chưa từng nghĩ đến.
Lựa chọn 3: tshark với trích xuất trường dữ liệu
tshark đi kèm với Wireshark và hỗ trợ hơn 3000 giao thức ngay từ đầu. Lọc bằng display filter (cú pháp giống GUI của Wireshark), trích xuất các trường có tên thành cột phân tách bằng tab, và pipe output sang awk, sort hoặc Python. Đây là con đường nhanh nhất từ file pcap đến câu trả lời cụ thể.
Ưu và nhược điểm
Điểm mạnh của tshark
- Engine phân tích Wireshark đầy đủ — phân tích giao thức chính xác, bao gồm TLS handshake, HTTP/2, DNS over TCP, v.v.
- Cú pháp display filter biểu đạt phong phú và được tài liệu hóa tốt
- Tên trường ổn định và dễ đoán (
ip.src,tcp.dstport,http.request.uri) - Lệnh thống kê tích hợp (flag
-z) giúp bỏ qua toàn bộ xử lý bên ngoài - Hoạt động trên cả interface trực tiếp lẫn file pcap có sẵn với các flag tương tự
Điểm yếu của tshark
- Footprint nhị phân lớn — Wireshark kéo theo Qt và hàng chục thư viện dissector
- Bộ nhớ tăng cao với các bản ghi rất lớn khi xây dựng bảng conversation
- Các flag thống kê
-zcó cú pháp không nhất quán giữa các phiên bản chính - Không được cài đặt mặc định trên các image server tối giản
Khi nào nên dùng tcpdump thay thế
Kiểm tra nhanh một bản ghi hoặc xác nhận gói tin đã đến host? tcpdump gõ nhanh hơn và luôn có sẵn. Hãy dùng tshark khi bạn có câu hỏi cụ thể: “Có bao nhiêu DNS query trả về NXDOMAIN?” hoặc “IP nào gửi nhiều byte nhất?”
Cài đặt được khuyến nghị
Cài tshark trên máy phân tích — bạn không cần cài trên node bắt gói tin, chỉ cần copy file pcap về:
# Debian / Ubuntu
sudo apt install tshark -y
# RHEL / Rocky / AlmaLinux
sudo dnf install wireshark-cli -y
# Arch
sudo pacman -S wireshark-cli
Trình cài đặt Debian hỏi liệu người dùng không phải root có thể bắt gói tin không. Chọn có, rồi thêm bản thân vào nhóm:
sudo usermod -aG wireshark $USER
newgrp wireshark
Kiểm tra phiên bản bạn đang có — tên trường đôi khi thay đổi giữa các phiên bản chính:
tshark --version | head -1
Hướng dẫn thực hiện
Bước 1: Kiểm tra nhanh file pcap
Trước khi lọc, hãy bắt đầu bằng kiểm tra nhanh:
# Đếm tổng số gói tin
tshark -r capture.pcap 2>/dev/null | wc -l
# In 20 gói tin đầu tiên với tóm tắt giao thức
tshark -r capture.pcap -c 20
2>/dev/null loại bỏ banner interface/version gây rối trong script. Thêm nó vào mọi lệnh tshark bạn dùng pipe.
Bước 2: Lọc theo giao thức với display filter
Display filter dùng cú pháp giống thanh filter của Wireshark. Điểm khác biệt then chốt so với cú pháp BPF của tcpdump: display filter hoạt động trên các trường giao thức đã được giải mã, không phải byte thô. Điều đó có nghĩa là bạn có thể lọc trên dns.flags.rcode thay vì cố khớp byte tại các offset cụ thể.
# Chỉ lưu lượng DNS
tshark -r capture.pcap -Y 'dns' 2>/dev/null
# HTTP request (không phải response)
tshark -r capture.pcap -Y 'http.request' 2>/dev/null
# Gói TCP RST — hữu ích để phát hiện kết nối bị từ chối
tshark -r capture.pcap -Y 'tcp.flags.reset == 1' 2>/dev/null
# DNS query trả về NXDOMAIN
tshark -r capture.pcap -Y 'dns.flags.rcode == 3' 2>/dev/null
# Lưu lượng giữa hai host cụ thể
tshark -r capture.pcap -Y 'ip.addr == 10.0.1.5 and ip.addr == 10.0.1.1' 2>/dev/null
Bước 3: Trích xuất các trường cụ thể thành cột
Flag -T fields kết hợp với -e fieldname cho bạn output phân tách bằng tab sẵn sàng cho awk, sort hoặc Python. Không cần phân tích thủ công — chỉ trích xuất cột từ dữ liệu giao thức đã giải mã.
# Trích xuất IP nguồn, IP đích và cổng đích cho mọi gói TCP
tshark -r capture.pcap -Y 'tcp' -T fields \
-e ip.src \
-e ip.dst \
-e tcp.dstport \
2>/dev/null
# Trích xuất tên DNS query và mã phản hồi
tshark -r capture.pcap -Y 'dns' -T fields \
-e dns.qry.name \
-e dns.flags.rcode \
2>/dev/null
# Trích xuất HTTP method, host và URI cho mọi HTTP request
tshark -r capture.pcap -Y 'http.request' -T fields \
-e http.request.method \
-e http.host \
-e http.request.uri \
2>/dev/null
Không biết tên trường chính xác? Trong Wireshark, di chuột qua một trường trong khung chi tiết gói tin — tên sẽ hiển thị ở thanh trạng thái phía dưới. Hoặc tìm kiếm trực tiếp trong registry trường:
tshark -G fields 2>/dev/null | grep -i 'user.agent'
Bước 4: Tạo thống kê lưu lượng với -z
Flag -z kích hoạt các module thống kê tích hợp của tshark. Chúng nhanh hơn việc pipe output trường ra công cụ bên ngoài vì mọi thứ chạy trong một lần duyệt — không có output trung gian, không có thêm tiến trình shell.
# Phân cấp giao thức — tỷ lệ phần trăm theo giao thức
tshark -r capture.pcap -z io,phs -q 2>/dev/null
# Top IP có lưu lượng lớn nhất (bytes đã truyền)
tshark -r capture.pcap -z conv,ip -q 2>/dev/null | sort -k 6 -rn | head -20
# Tóm tắt DNS query/response
tshark -r capture.pcap -z dns,tree -q 2>/dev/null
# HTTP request method và mã phản hồi
tshark -r capture.pcap -z http,tree -q 2>/dev/null
# Tóm tắt kết nối TCP (số lượng SYN/FIN/RST theo từng cặp)
tshark -r capture.pcap -z conv,tcp -q 2>/dev/null
Flag -q loại bỏ output theo từng gói tin để bạn chỉ thấy bảng thống kê.
Bước 5: Kết hợp trích xuất trường với công cụ Unix để tạo thống kê tùy chỉnh
Thống kê tích hợp không bao phủ mọi câu hỏi. Khi cần câu trả lời tùy chỉnh, pipe output trường qua các công cụ Unix chuẩn:
# Đếm DNS query theo domain, sắp xếp theo tần suất
tshark -r capture.pcap -Y 'dns.flags.response == 0' -T fields \
-e dns.qry.name 2>/dev/null \
| sort | uniq -c | sort -rn | head -20
# Tìm các cổng đích được kết nối nhiều nhất
tshark -r capture.pcap -Y 'tcp.flags.syn == 1 and tcp.flags.ack == 0' \
-T fields -e tcp.dstport 2>/dev/null \
| sort | uniq -c | sort -rn
# Trích xuất toàn bộ chuỗi HTTP User-Agent (hữu ích để phát hiện bot)
tshark -r capture.pcap -Y 'http.user_agent' -T fields \
-e http.user_agent 2>/dev/null \
| sort -u
Bước 6: Xuất gói tin đã lọc sang file pcap mới
Đôi khi bạn cần một phần của bản ghi — để chia sẻ với đồng nghiệp hoặc đưa vào công cụ khác mà không cần di chuyển file 500MB:
# Lưu chỉ lưu lượng DNS vào file mới
tshark -r capture.pcap -Y 'dns' -w dns_only.pcap 2>/dev/null
# Lưu lưu lượng đến/từ một host cụ thể
tshark -r capture.pcap -Y 'ip.addr == 192.168.1.100' -w host_traffic.pcap 2>/dev/null
Script thực tế: tóm tắt nhanh pcap
Đây là shell script tôi thường dùng để phân loại sự cố. Truyền file pcap vào và nhận ngay tổng quan trong vòng 10 giây:
#!/bin/bash
# Cách dùng: ./pcap-summary.sh capture.pcap
FILE="${1:-capture.pcap}"
echo "=== Số gói tin ==="
tshark -r "$FILE" 2>/dev/null | wc -l
echo "=== Phân tích giao thức ==="
tshark -r "$FILE" -z io,phs -q 2>/dev/null
echo "=== Top 10 IP gửi nhiều nhất ==="
tshark -r "$FILE" -z conv,ip -q 2>/dev/null \
| tail -n +8 | sort -k6 -rn | head -10
echo "=== DNS thất bại (NXDOMAIN) ==="
tshark -r "$FILE" -Y 'dns.flags.rcode == 3' -T fields \
-e dns.qry.name 2>/dev/null | sort | uniq -c | sort -rn
echo "=== Nguồn gói TCP RST ==="
tshark -r "$FILE" -Y 'tcp.flags.reset == 1' -T fields \
-e ip.src -e tcp.srcport 2>/dev/null | sort | uniq -c | sort -rn | head -10
Trên các dịch vụ lưu lượng cao, file pcap nhanh chóng tăng đến hàng gigabyte. Hai điều tạo ra sự khác biệt lớn nhất: giữ display filter càng chặt càng tốt (càng hẹp, tshark càng ít phải duyệt qua), và luôn ghép -z với -q. Không có -q, output theo từng gói tin sẽ tràn ngập terminal cùng với bảng thống kê.
Một số điều cần lưu ý
- Trường đa giá trị: Một gói tin có thể trả về nhiều giá trị cho
dns.qry.namenếu nó chứa nhiều câu hỏi. tshark mặc định phân tách chúng bằng dấu phẩy — dùng-E separator=\nnếu bạn cần mỗi giá trị trên một dòng. - Lưu lượng mã hóa: tshark có thể giải mã TLS nếu bạn cung cấp file session key:
-o tls.keylog_file:/path/to/sslkeylog.log. ĐặtSSLKEYLOGFILEtrong trình duyệt hoặc ứng dụng để tạo file này. - File lớn: Với bản ghi trên 1GB, hãy chia nhỏ bằng
editcap -c 100000 big.pcap split/out.pcaptrước, rồi xử lý từng phần song song.
