
tcpdump là công cụ dòng lệnh phổ biến nhất thế giới dùng để bắt và phân tích gói tin mạng. Nó dùng thư viện libpcap để chuyển dữ liệu thô từ card mạng vào máy rồi in ra dưới dạng văn bản dễ đọc, hoặc lưu thành file để mở bằng Wireshark phân tích sâu hơn. Một công cụ gọn nhẹ nhưng chẩn đoán được phần lớn lỗi kết nối, chậm mạng và hỏi DNS.
Bài viết này hướng dẫn cách đọc từng trường của một gói tin, cú pháp lọc hiệu quả và những lỗi thường gặp khi bắt gói tin trong môi trường thật.

tcpdump hoạt động như thế nào
tcpdump được viết bởi Van Jacobson, Sally Floyd, Vern Paxson và Steven McCanne tại Phòng thí nghiệm Berkeley vào năm 1988, với giấy phép BSD. Nó hoạt động theo ba bước: mở card mạng ở chế độ thô, đưa bộ lọc xuống nhân hệ thống, rồi in gói tin ra màn hình.
Bước quan trọng nhất là bộ lọc Berkeley Packet Filter (BPF). Thay vì kéo toàn bộ lưu lượng lên tầng ứng dụng rồi mới lọc, BPF chạy ngay trong nhân, nên các gói tin không quan tâm bị loại ngay tại kernel. Nhờ vậy chi phí chuyển dữ liệu được giảm mạnh, và trên các hệ điều hành Linux hiện đại, BPF còn được biên dịch JIT sang eBPF để chạy nhanh hơn nữa. Chi tiết cơ chế này được mô tả tại trang Berkeley Packet Filter trên Wikipedia.
Quyền bắt gói tin là điểm hay gặp rắc rối nhất. tcpdump cần chạy với quyền root, hoặc gán hai năng lực Linux là CAP_NET_RAW và CAP_NET_ADMIN. Nếu không có, bạn sẽ thấy thông báo thiếu quyền ngay khi mở card mạng.
Đọc hiểu một dòng gói tin
Một dòng kết quả của tcpdump có dạng cố định. Dưới đây là ví dụ thật lấy từ ảnh chụp phiên bản 4.9.3:

2.857291 IP 162.159.130.234.https > 10.0.0.5.38732: Flags [P.], seq 296367:296427, ack 794, win 39, length 60
Từ trái sang phải:
- 2.857291 — dấu thời gian tính bằng giây kể từ khi tcpdump bắt đầu chạy.
- IP — tầng mạng đang được giải mã là IPv4. Mạng IPv6 sẽ hiện là
IP6. - 162.159.130.234.https > 10.0.0.5.38732 — chiều nguồn đến đích. tcpdump tự tra cổng quen thuộc thành tên dịch vụ; thêm tuỳ chọn
-nnếu muốn giữ dạng số để tra nhanh hơn. - Flags [P.] — cờ TCP:
Plà PSH có dữ liệu đi kèm, dấu chấm là ACK xác nhận. Các cờ khác gồmSbắt tay,Fkết thúc,Rđặt lại. - seq 296367:296427 — dãy số byte của gói tin này so với gốc đã xác nhận, cho biết đoạn dữ liệu ở vị trí nào.
- ack 794, win 39 — số thứ tự mà bên kia xác nhận đã nhận, và kích thước cửa sổ nhận. Giá trị cửa sổ nhỏ thường báo hiệu nghẽn cổ chai.
- length 60 — độ dài tải trọng tính bằng byte.
Để xem phần tải trọng dạng văn bản hoặc mã hex, thêm -A, -x hoặc -X. Tuỳ chọn -v mở rộng đầu tin IP với TTL, định danh, cờ phân mảnh và kiểm tra tổng kiểm tra.
Lọc gói tin với BPF
Không lọc trên card 10Gb/s sẽ ngập màn hình và làm tốn CPU. Cú pháp lọc gồm ba loại định tố, có thể ghép bằng and, or, not và ngoặc. Quy tắc đầy đủ nằm trong trang hướng dẫn pcap-filter trên man7.org.
| Mệnh lệnh | Ý nghĩa |
|---|---|
tcpdump -i eth0 host 10.0.0.5 |
Chỉ bắt gói tin liên quan tới một địa chỉ |
tcpdump -i eth0 port 53 |
Chỉ bắt lưu lượng DNS, trên cả TCP và UDP |
tcpdump -i eth0 net 192.168.1.0/24 |
Lọc theo dải mạng con |
tcpdump -c 100 -w ket_qua.pcap |
Dừng sau 100 gói tin và ghi ra file pcap |
tcpdump -r ket_qua.pcap |
Đọc lại file pcap đã ghi |
tcpdump -i eth0 -n 'tcp port 443 and host 10.0.0.5' |
Ghép nhiều điều kiện, giữ nguyên số ở cả tên miền lẫn cổng |
Nếu không chỉ định -i, tcpdump mặc định dùng card mạng có số thứ tự thấp nhất đang hoạt động ngoài loopback, và nhiều khi đó không phải card bạn nghĩ. Xem toàn bộ card bằng tcpdump -D. Quyền cần thiết và mọi tuỳ chọn còn lại được liệt kê đầy đủ trong trang hướng dẫn tcpdump trên man7.org và tài liệu chính thức tại tcpdump.org.
Từ bắt gói tin đến phân tích lỗi
Một quy trình làm việc thực tế đi như sau. Bắt số liệu trong lúc lỗi xảy ra, lưu thành file pcap, rồi mở bằng Wireshark để lọc và theo dõi luồng. Các bài kiểm tra nhanh có giá trị nhất:
- DNS có phản hồi không:
tcpdump -i any port 53rồi xem có dòng phản hồi nào không. Nếu chỉ thấy truy vấn mà không thấy trả lời, vấn đề nằm ở DNS hoặc tường lửa chặn cổng UDP. - TCP có bị nghẽn không: giá trị
winnhỏ và nhiều gói tin lặp lại cùng số thứ tự là dấu hiệu cửa sổ nhận bị thu hẹp, thường do tốc độ đường truyền không khớp với băng thông. - Kết nối có đặt lại liên tục không: thấy nhiều gói cờ
Rnghĩa là bên đối tác chủ động hủy, thường do tường lửa can thiệp hoặc dịch vụ phía sau chưa sẵn sàng.
Ba lỗi phổ biến nhất khi dùng trong thực tế:
- Bật chế độ promiscuous trên switch có VLAN. Chỉ chạm được vào lưu lượng thuộc cổng đó, trừ khi cấu hình mirror trên thiết bị mạng. Ngoài ra từ khoá
vlanlàm lệch vị trí đọc dữ liệu của các điều kiện phía sau, nên phải dùng trước các điều kiện khác. - Bắt trên card ảo hoặc card tăng tốc. Một gói tin có thể xuất hiện nhiều lần, khiến bạn tưởng bị lặp. Dùng
-i anyđể gom về một nguồn. - Bỏ qua độ trễ do bộ đệm.
--immediate-modegiao gói tin ra ngay lập tức, độ trễ thấp nhưng tốn CPU và dễ mất gói; chế độ mặc định dồn gói tin vào bộ đệm để tiết kiệm CPU, đổi lại là giao chậm hơn. Hai chế độ phụ thuộc tình huống, không có lựa chọn nào tốt tuyệt đối.
Các nội dung trên phản ánh hành vi ghi trong phần hỏi đáp chính thức của tcpdump.org, còn phần lịch sử và thông tin phần mềm tại trang tcpdump trên Wikipedia. Cố gắng chỉ bắt trong đúng khoảng thời gian cần điều tra, luôn đặt giới hạn bằng -c, và nhớ xoá các file pcap có dữ liệu nhạy cảm sau khi dùng xong.
