tcpdump là gì: công cụ bắt và đọc gói tin mạng từ dòng lệnh

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.

Sơ đồ quan hệ giữa chương trình tcpdump và thư viện libpcap xử lý gói tin

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:

Ảnh chụp terminal tcpdump hiển thị gói tin HTTPS với cờ P, số seq, ack và cửa sổ win
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 -n nếu muốn giữ dạng số để tra nhanh hơn.
  • Flags [P.] — cờ TCP: P là PSH có dữ liệu đi kèm, dấu chấm là ACK xác nhận. Các cờ khác gồm S bắt tay, F kế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 53 rồ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ị win nhỏ 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ờ R nghĩ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á vlan là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-mode giao 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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

VLC media player là gì: trình phát đa năng cho mọi định dạng

VLC media player là trình phát đa năng mã nguồn mở do dự án VideoLAN phát triển, chạy được trên máy tính lẫn điện thoại. Nhờ đọc được gần như…

Xem thêm

ripgrep là gì? Công cụ tìm kiếm nhanh hơn grep trong terminal

ripgrep (rg) là một công cụ tìm kiếm trong dòng terminal được thiết kế để thay thế grep truyền thống, đặc biệt phù hợp với môi trường phát triển phần…

Xem thêm
Hộp thoại tạo mật khẩu ngẫu nhiên trong KeePass với bộ tạo ký tự tích hợp

KeePass là gì: Quản lý mật khẩu mã hóa mã nguồn mở miễn phí

KeePass là gì: Quản lý mật khẩu mã hóa mã nguồn mở miễn phí KeePass là phần mềm quản lý mật khẩu mã nguồn mở, cho phép lưu trữ hàng…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất