Hướng dẫn lệnh Linux tcpdump cho người mới bắt đầu (8 ví dụ)

theanh

Administrator
Nhân viên
Mỗi khi bạn mở một trang web trên máy tính, các gói dữ liệu được gửi và nhận trên giao diện mạng của bạn. Đôi khi, việc phân tích các gói này trở nên quan trọng vì nhiều lý do. Rất may, Linux cung cấp một tiện ích dòng lệnh để đổ thông tin liên quan đến các gói dữ liệu này vào đầu ra.

Trong bài viết này, chúng ta sẽ thảo luận về những điều cơ bản của công cụ đang được đề cập - tcpdump. Nhưng trước khi làm điều đó, cần đề cập rằng tất cả các ví dụ ở đây đã được thử nghiệm trên máy Ubuntu 18.04 LTS và trên Debian 10, nhưng nó cũng sẽ hoạt động trên các bản phân phối Linux khác như CentOS, Fedora, Gentoo và Arch Linux.

Lệnh tcpdump của Linux​

Lệnh tcpdump trong Linux cho phép bạn đổ lưu lượng trên mạng. Sau đây là cú pháp tóm tắt của nó:
Mã:
tcpdump [OPTIONS]
Đây là cú pháp chi tiết:
Mã:
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
 [ -c count ]
 [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
 [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
 [ --number ] [ -Q in|out|inout ]
 [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
 [ -W filecount ]
 [ -E spi@ipaddr algo:secret,... ]
 [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
 [ --time-stamp-precision=tstamp_precision ]
 [ --immediate-mode ] [ --version ]
 [ expression ]
Và đây là cách trang hướng dẫn của công cụ giải thích về nó:
Mã:
Tcpdump in ra mô tả về nội dung của các gói trên giao diện mạng khớp với 
biểu thức boolean; mô tả được đặt trước bởi dấu thời gian, theo mặc định là giờ, 
phút, giây và một phần giây kể từ nửa đêm. 

Nó cũng có thể được chạy với cờ -w, khiến nó lưu dữ liệu gói vào một tệp để 
phân tích sau, và/hoặc với cờ -r, khiến nó đọc từ một tệp gói đã lưu thay vì 
đọc các gói từ giao diện mạng. Nó cũng có thể được chạy với cờ -V, khiến
nó đọc danh sách các tệp gói đã lưu. 

Trong mọi trường hợp, chỉ những gói khớp với biểu thức mới được tcpdump xử lý.
Sau đây là một số ví dụ theo kiểu Hỏi & Đáp sẽ giúp bạn hiểu rõ hơn về cách lệnh tcpdump hoạt động.

Câu hỏi 1. Làm thế nào để sử dụng tcpdump?​

Trước khi sử dụng tcpdump để đánh hơi các gói dữ liệu, lý tưởng nhất là bạn nên biết giao diện mạng nào bạn muốn công cụ này hoạt động. Để biết danh sách các giao diện mạng khả dụng trên hệ thống, hãy sử dụng tùy chọn dòng lệnh -D với tcpdump.
Mã:
tcpdump -D
Đây là cách trang hướng dẫn giải thích tùy chọn này:
Mã:
In danh sách các giao diện mạng khả dụng trên hệ thống và trên đó tcpdump có thể bắt 
các gói tin. Đối với mỗi giao diện mạng, một số và tên giao diện, có thể theo sau là một 
mô tả văn bản về giao diện, sẽ được in. Tên hoặc số giao diện có thể được cung cấp cho cờ 
-i để chỉ định giao diện để bắt.

Điều này có thể hữu ích trên các hệ thống không có lệnh để liệt kê chúng (ví dụ: hệ thống Windows hoặc hệ thống 
UNIX không có ifconfig -a); số này có thể hữu ích trên Windows 2000 và các hệ thống mới hơn, 
trong đó tên giao diện là một chuỗi khá phức tạp.

Cờ -D sẽ không được hỗ trợ nếu tcpdump được xây dựng bằng phiên bản libpcap cũ hơn 
thiếu hàm pcap_findalldevs().
Ví dụ, trong trường hợp của tôi, đầu ra sau được tạo ra:
Mã:
1.wlx18a6f713679b [Đang hoạt động, Đang chạy]
2.any (Thiết bị giả chụp trên tất cả các giao diện) [Đang hoạt động, Đang chạy]
3.lo [Đang hoạt động, Đang chạy, Vòng lặp]
4.enp3s0 [Đang hoạt động]
5.nflog (Giao diện nhật ký bộ lọc mạng Linux (NFLOG))
6.nfqueue (Giao diện hàng đợi bộ lọc mạng Linux (NFQUEUE))
7.usbmon1 (Số bus USB 1)
8.usbmon2 (Số bus USB 2)
9.usbmon3 (USB bus số 3)
10.usbmon4 (USB bus số 4)
Bây giờ bạn đã có danh sách các giao diện, bạn có thể chọn một giao diện và truyền tên của giao diện đó làm đầu vào cho tùy chọn dòng lệnh -i của tcpdump. Ví dụ:
Mã:
tcpdump -i wlx18a6f713679b
Sau đây là một phần đầu ra do lệnh này tạo ra trong trường hợp của tôi:
Mã:
tcpdump: đầu ra chi tiết bị ẩn, sử dụng -v hoặc -vv để giải mã giao thức đầy đủ
[B]đang lắng nghe trên wlx18a6f713679b[/b], loại liên kết EN10MB (Ethernet), kích thước chụp 262144 byte
11:53:11.408964 IP 192.168.2.132.52898 > 239.255.255.250.3702: UDP, độ dài 656
11:53:11.409492 IP himanshu.57383 > one.one.one.one.domain: 8572+ [1au] PTR? 250.255.255.239.in-addr.arpa. (57)
11:53:11.409588 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, độ dài 174
11:53:11.409954 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 1 [2q] PTR (QU)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QU)? _googlecast._tcp.local. (94)
11:53:11.499220 IP one.one.one.one.domain > himanshu.57383: 8572 NXDomain 0/1/1 (114)
11:53:11.499950 IP himanshu.34201 > one.one.one.domain: 12068+ [1au] PTR? 132.2.168.192.in-addr.arpa. (55)
11:53:11.591291 IP one.one.one.one.domain > himanshu.34201: 12068 NXDomain* 0/1/2 (278)
11:53:11.592195 IP himanshu.55501 > một.một.một.một.tên miền: 31630+ [1au] PTR? 1.1.1.1.in-addr.arpa. (49)
11:53:11.842603 IP himanshu.57253 > một.một.một.tên miền: 16905+ [1au] PTR? 140.2.168.192.in-addr.arpa. (55)
11:53:11.951226 IP himanshu.52662 > một.một.một.tên miền: 52377+ [1au] PTR? 251.0.0.224.in-addr.arpa. (53)
11:53:12.428931 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, độ dài 174
11:53:12.437905 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 2 [2q] PTR (QM)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QM)? _googlecast._tcp.local. (94)
11:53:12.438730 IP6 fe80::eccc:59f2:fc78:9e07.52899 > ff02::c.3702: UDP, độ dài 656
11:53:12.439017 IP himanshu.33194 > one.one.one.one.domain: 15679+ [1au] PTR? c.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.f.f.ip6.arpa. (101)
11:53:12.572386 IP one.one.one.one.domain > himanshu.33194: 15679 NXDomain 0/1/1 (165)
11:53:12.642129 IP 192.168.2.11.mdns > 224.0.0.251.mdns: 0*- [0q] 1/0/3 PTR Google-Home-Mini-e3a3ae72a03e3d1c60d24653d4666ca6._googlecast._tcp.local. (356)
...
...

Câu hỏi 2. Làm thế nào để tcpdump thoát sau khi nhận được một số lượng gói tin nhất định?​

Có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -c. Ví dụ, nếu bạn muốn tcpdump chỉ hiển thị thông tin liên quan đến 10 gói tin, thì bạn có thể thực hiện theo cách sau:
Mã:
tcpdump -c 10
Ví dụ, trong trường hợp của tôi, tôi đã thực hiện lệnh sau:
Mã:
tcpdump -c 10 -i wlx18a6f713679b
Sau đây là đầu ra được tạo ra:



Vì vậy, bạn có thể thấy 10 gói tin đã được bắt.

Câu hỏi 3. Làm thế nào để tcpdump hiển thị tiêu đề cấp liên kết trong đầu ra?​

Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -e. Ví dụ:
Mã:
tcpdump -e -i wlx18a6f713679b
Và đây là kết quả đầu ra được tạo ra:
Mã:
đang lắng nghe trên wlx18a6f713679b, loại liên kết EN10MB (Ethernet), kích thước chụp 262144 byte
12:14:07.951396 3c:a8:2a:a7:7b:c1 (oui Không xác định) > Phát sóng, loại ether IPv4 (0x0800), độ dài 197: 192.168.2.55.17500 > 255.255.255.255.17500: UDP, độ dài 155
12:14:07.952111 3c:a8:2a:a7:7b:c1 (oui Không xác định) > Phát sóng, ethertype IPv4 (0x0800), độ dài 197: 192.168.2.55.17500 > 192.168.2.255.17500: UDP, độ dài 155
...
...
Vì vậy, bạn có thể thấy rằng các tiêu đề cấp liên kết đã được tạo ra trong đầu ra.

Câu hỏi 4. Làm thế nào để tcpdump hiển thị địa chỉ IP nước ngoài dưới dạng số?​

Có thể thực hiện việc này bằng tùy chọn dòng lệnh -f.
Mã:
tcpdump -f -i [INTERFACE]
Việc tcpdump hiển thị địa chỉ IPv4 `nước ngoài' dưới dạng số thay vì biểu tượng có những lợi thế trong một số tình huống nhất định. Một ví dụ như vậy được đề cập trong trang hướng dẫn của công cụ:
Mã:
tùy chọn này nhằm mục đích khắc phục tổn thương não nghiêm trọng trong máy chủ NIS của Sun — thường thì nó sẽ treo 
mãi mãi khi dịch các số internet không phải cục bộ

Câu hỏi 5. Làm thế nào để tcpdump tạo ra số gói tin ở đầu ra?​

Để làm cho tcpdump tạo ra số gói tin ở đầu ra, hãy sử dụng tùy chọn dòng lệnh --number.

Ví dụ, tôi đã thực hiện lệnh sau:
Mã:
tcpdump --number -i wlx18a6f713679b
Và đây là một phần đầu ra đã được tạo ra:
Mã:
đang lắng nghe trên wlx18a6f713679b, loại liên kết EN10MB (Ethernet), kích thước chụp 262144 byte
 1 12:38:35.522944 ARP, Yêu cầu who-has 192.168.2.196 tell _gateway, độ dài 46
 2 12:38:35.523265 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ff02::16: HBH ICMP6, báo cáo trình nghe đa hướng v2, 1 bản ghi nhóm, độ dài 28
 3 12:38:35.523578 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ip6-allrouters: ICMP6, router solicitation, length 16
 4 12:38:35.523861 ARP, Request who-has 192.168.2.15 tell 192.168.2.170, length 28
...
...
...
Vì vậy, bạn có thể thấy mỗi dòng bây giờ bắt đầu bằng một số.

Câu hỏi 6. Làm thế nào để tcpdump in ra đầu ra ngắn hơn?​

Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -q. Sau đây là cách trang hướng dẫn của công cụ giải thích:
Mã:
Đầu ra nhanh (yên lặng?). In ít thông tin giao thức hơn để các dòng đầu ra ngắn hơn.
Sau đây là một ví dụ về tùy chọn này:



Vì vậy, bạn có thể thấy ít thông tin hơn được tạo ra trong đầu ra lần này.

Câu hỏi 7. Làm thế nào để bỏ qua thông tin dấu thời gian khỏi đầu ra tcpdump?​

Sử dụng tùy chọn dòng lệnh -t cho việc này. Sau đây là một lệnh ví dụ:
Mã:
tcpdump -t -i wlx18a6f713679b
Và sau đây là đầu ra của nó:
Mã:
lắng nghe trên wlx18a6f713679b, loại liên kết EN10MB (Ethernet), kích thước chụp 262144 byte
IP himanshu.56992 > mails11.telegram.org.https: Cờ [.], ack 3090054317, win 965, tùy chọn [nop,nop,TS val 226976758 ecr 3781653930], độ dài 0
IP himanshu.41122 > one.one.one.one.domain: 12755+ [1au] PTR? 22.171.154.149.in-addr.arpa. (56)
IP mails11.telegram.org.https > himanshu.56824: Flags [.], ack 273652159, win 1001, options [nop,nop,TS val 3781656472 ecr 226966324], length 0
ARP, Request who-has 192.168.2.48 tell _gateway, length 46
ARP, Request who-has 192.168.2.135 tell _gateway, length 46
...
...
Vì vậy, bạn có thể thấy thông tin dấu thời gian (thường nằm ở đầu mỗi dòng) hiện không có trong đầu ra.

Câu hỏi 8. Làm thế nào để tcpdump tạo ra đầu ra chi tiết?​

Bạn có thể sử dụng tùy chọn dòng lệnh -v trong trường hợp này. Sau đây là cách trang hướng dẫn của công cụ giải thích tùy chọn này:
Mã:
tcpdump -v -i [GIAO DIỆN]
Mã:
Khi phân tích cú pháp và in, hãy tạo đầu ra (chi tiết hơn một chút). Ví dụ, thời gian tồn tại,
nhận dạng, tổng chiều dài và các tùy chọn trong một gói IP được in ra. Ngoài ra, hãy bật thêm 
kiểm tra tính toàn vẹn của gói như xác minh tổng kiểm tra tiêu đề IP và ICMP.

Khi ghi vào tệp bằng tùy chọn -w, hãy báo cáo, cứ sau 10 giây, số lượng gói đã chụp

Kết luận​

Chúng ta vừa mới khám phá bề nổi ở đây vì lệnh tcpdump cung cấp rất nhiều tùy chọn dòng lệnh. Sau khi thực hành xong các tùy chọn này, bạn có thể truy cập trang hướng dẫn của công cụ để tìm hiểu thêm về nó.
 
Back
Bên trên