Ví dụ về sử dụng lệnh tcpdump Image Ví dụ về sử dụng lệnh tcpdump

Bài viết này giới thiệu các bạn về các ví dụ sử dụng tcpdump trên hệ điều hành Linux để bắt gói tin mạng.

1. Giới thiệu về tcpdump

tcpdump là phần mềm bắt gói tin trong mạng làm việc trên hầu hết các phiên bản hệ điều hành Linux. tcpdump cho phép chúng ta bắt và lưu lại các gói tin bắt được, để chúng ta có thể sử dụng phân tích.

Các tùy chọn thường sử dụng trong tcpdump:

  • -X : Hiển thị nội dung của gói theo định dạng ASCII và HEX
  • -XX : Tương tự -X, hiển thị giao diện ethernet
  • -D : Liệt kê các giao diện mạng có sẵn
  • -l : Đầu ra có thể đọc được dòng (để xem khi bạn lưu hoặc gửi đến các lệnh khác)
  • -t : Cung cấp đầu ra dấu thời gian có thể đọc được của con người
  • -q : Ít dài dòng hơn với đầu ra
  • -tttt : Cung cấp đầu ra dấu thời gian tối đa có thể đọc được của con người
  • -i : Bắt lưu lượng của một giao diện cụ thể
  • -vv : Đầu ra cụ thể và chi tiết hơn (nhiều v hơn cho đầu ra nhiều hơn)
  • s : Xác định snaplength(kích thước) của gói tin theo byte. Sử dụng -s0 để có được mọi thứ. Nếu không set size packet dump thành unlimit, thì khi tcpdump ra nó bị phân mảnh
  • -c : Chỉ nhận được x số gói và sau đó dừng lại
  • -S : In số thứ tự tuyệt đối
  • -e : Nhận tiêu đề ethernet
  • -q : Hiển thị ít thông tin giao thức
  • -E : Giải mã lưu lượng IPSEC bằng cách cung cấp khóa mã hóa

2. Bắt các gói có địa chỉ IP

Sử dụng tuỳ chọn -n để hiển thị địa chỉ IP của các máy liên quan. Nếu không dùng tùy chọn này chỉ bắt được các gói tin chứa các địa chỉ DNS thay vì địa chỉ IP.

[root@test1 ~]# tcpdump -n -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:00:26.142627 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 2687137302:2687137490, ack 1774008792, win 314, options [nop,nop,TS val 1747516563 ecr 968843435], length 188
00:00:26.142943 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 188:416, ack 1, win 314, options [nop,nop,TS val 1747516563 ecr 968843435], length 228
00:00:26.143058 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 416:620, ack 1, win 314, options [nop,nop,TS val 1747516563 ecr 968843435], length 204

3. Bắt gói tin từ một giao diện ethernet cụ thể

Chúng ta sử dụng lệnh tpcdump -i để xem giao diện ethernet0:

[root@test1 ~]# tcpdump -n -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
22:47:05.908352 STP 802.1d, Config, Flags [none], bridge-id 83ee.00:1f:c9:9a:41:00.8021, length 42
22:47:07.913250 STP 802.1d, Config, Flags [none], bridge-id 83ee.00:1f:c9:9a:41:00.8021, length 42
22:47:09.918166 STP 802.1d, Config, Flags [none], bridge-id 83ee.00:1f:c9:9a:41:00.8021, length 42
22:47:11.923044 STP 802.1d, Config, Flags [none], bridge-id 83ee.00:1f:c9:9a:41:00.8021, length 42
22:47:13.928063 STP 802.1d, Config, Flags [none], bridge-id 83ee.00:1f:c9:9a:41:00.8021, length 42
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Trong ví dụ trên, tcpdump đã bắt tất cả các luồng gói trong giao diện eth1 và hiển thị ra màn hình.

4. Chỉ bắt N số gói tin

Khi chúng ta thực thi lệnh tcpdump, nó sẽ cung cấp các gói cho đến khi bạn hủy lệnh tcpdump. Sử dụng tùy chọn -c, để có thể chỉ định số lượng gói cần bắt.

[root@test1 ~]# tcpdump -n -c 3 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:48:12.238534 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 2684780298:2684780486, ack 1774000416, win 314, options [nop,nop,TS val 1743182659 ecr 964516274], length 188
22:48:12.238918 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 188:416, ack 1, win 314, options [nop,nop,TS val 1743182659 ecr 964516274], length 228
22:48:12.239012 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 416:620, ack 1, win 314, options [nop,nop,TS val 1743182659 ecr 964516274], length 204
3 packets captured
4 packets received by filter
0 packets dropped by kernel

Ví dụ trên lệnh tcpdump chỉ thu được 3 gói từ giao diện eth0.

5. Hiển thị các gói đã chụp trong ASCII

Sử dụng cú pháp tcpdump sau để in gói tin trong ASCII.

[root@test1 ~]# tcpdump -A -n -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:51:15.498907 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 2684783794:2684783982, ack 1774001936, win 314, options [nop,nop,TS val 1743365919 ecr 964698945], length 188
E.....@.@.A1ga}..N.]........i......:.......
g...9.#A	".9Z..
3?.6obM.R...KC<...H.Q...*....&.[.z.j.0)....;:.;..}jV...0.M.,?,.C....}&'....L.,..fJ....*.S..NYo@.
..0.G..5.B..._.xM..J_.E...,....}..2.l...S.#n78.R.....:..M...k.P..{D..CH..%...zq..8'

6. Hiển thị các gói đã bắt trong HEX và ASCII

Một số người dùng có thể muốn phân tích các gói theo giá trị hex. tcpdump cung cấp một cách để in các gói ở cả định dạng ASCII và HEX.

[root@test1 ~]# tcpdump -XX -n -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:58:11.178870 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 2684790266:2684790454, ack 1774003660, win 314, options [nop,nop,TS val 1743781599 ecr 965113708], length 188
	0x0000:  0016 47a2 bd47 fa16 3ee5 0b94 0800 4510  ..G..G..>.....E.
	0x0010:  00f0 dd4e 4000 4006 4101 6761 7d9c 1b4e  ...N@.@.A.ga}..N
	0x0020:  1b5d 07e2 c185 a006 a5fa 69bd 25cc 8018  .]........i.%...
	0x0030:  013a 1c8b 0000 0101 080a 67ef fedf 3986  .:........g...9.
	0x0040:  776c 2cc0 d250 2503 5567 4310 392b 1ef6  wl,..P%.UgC.9+..
	0x0050:  b310 98b8 b357 8770 dae5 c18b 75e3 4d44  .....W.p....u.MD
22:58:11.179325 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 188:1520, ack 1, win 314, options [nop,nop,TS val 1743781599 ecr 965113708], length 1332
	0x0000:  0016 47a2 bd47 fa16 3ee5 0b94 0800 4510  ..G..G..>.....E.
	0x0010:  0568 dd4f 4000 4006 3c88 6761 7d9c 1b4e  .h.O@.@.<.ga}..N
	0x0020:  1b5d 07e2 c185 a006 a6b6 69bd 25cc 8018  .]........i.%...
	0x0030:  013a 2103 0000 0101 080a 67ef fedf 3986  .:!.......g...9.
	0x0040:  776c 71b7 376a 4c25 b97b 14b5 3e4a cea3  wlq.7jL%.{..>J..
	0x0050:  6883 be9d b9d3 ac5b 9ca0 a5cd 5cfb 50d7  h......[....\.P.

7. Bắt các gói và ghi vào một tệp

Lệnh tcpdump cho phép bạn lưu các gói vào một tệp và sau đó bạn có thể sử dụng tệp gói để phân tích thêm.

[root@test1 ~]# tcpdump -w test.pcap -n -i eth0
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
76 packets captured
78 packets received by filter
0 packets dropped by kernel

Tùy chọn -w ghi các gói vào một tập tin nhất định. Phần mở rộng tệp phải là .pcap, để có thể được đọc bởi bất kỳ bộ phân tích giao thức mạng nào .

8. Đọc các gói từ một tệp đã lưu

Chúng ta có thể đọc tệp pcap đã bắt và xem các gói để phân tích, như hiển thị như sau.

[root@test1 ~]# tcpdump -n -r test.pcap
reading from file test.pcap, link-type EN10MB (Ethernet)
23:38:34.999748 IP 103.97.125.156.terminaldb > 27.78.27.93.49541: Flags [P.], seq 2684799662:2684799786, ack 1774005096, win 314, options [nop,nop,TS val 1746205420 ecr 967533834], length 124
23:38:35.003543 IP 27.78.27.93.49541 > 103.97.125.156.terminaldb: Flags [.], ack 124, win 2046, options [nop,nop,TS val 967533898 ecr 1746205420], length 0
23:38:35.035406 ARP, Request who-has 103.97.125.241 tell 103.97.125.128, length 46
23:38:35.562892 ARP, Request who-has 103.97.125.211 tell 103.97.125.128, length 46
23:38:35.615145 ARP, Request who-has 103.97.125.252 tell 103.97.125.128, length 46
23:38:35.767399 ARP, Request who-has 103.97.125.218 tell 103.97.125.128, length 46
23:38:35.795250 ARP, Request who-has 103.97.125.230 tell 103.97.125.128, length 46
23:38:35.933716 IP 103.97.125.182.52240 > 239.255.255.250.ssdp: UDP, length 173
23:38:36.219322 STP 802.1d, Config, Flags [none], bridge-id 87dc.a0:cf:5b:46:11:80.8029, length 42
23:38:36.460761 ARP, Request who-has 103.97.125.204 tell 103.97.125.128, length 46
23:38:36.466361 ARP, Request who-has 103.97.125.198 tell 103.97.125.128, length 46

9. Bắt các gói với dấu thời gian có thể đọc được

Bắt các gói tin với dấu thời gian có thể đọc được bằng sử dụng lệnh tcpdump -tttt

[root@test1 ~]# tcpdump -n -ttt -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
 00:00:00.000000 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 2687139394:2687139582, ack 1774009588, win 314, options [nop,nop,TS val 1747753556 ecr 969080072], length 188
 00:00:00.000355 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 188:416, ack 1, win 314, options [nop,nop,TS val 1747753556 ecr 969080072], length 228
 00:00:00.000083 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 416:628, ack 1, win 314, options [nop,nop,TS val 1747753556 ecr 969080072], length 212

10. Đọc các gói nhỏ hơn N byte

Chúng ta chỉ có thể nhận các gói nhỏ hơn n số byte bằng cách sử dụng bộ lọc 'less' thông qua lệnh tcpdump

tcpdump -w less_1024.pcap less 1024

Ví dụ 10: Đọc các gói tin dài hơn N byte

Chúng ta chỉ có thể nhận các gói lớn hơn n số byte bằng cách sử dụng bộ lọc 'greater' thông qua lệnh tcpdump

tcpdump -w gerter-1024.pcap greater 1024

11. Chỉ nhận các gói của một loại giao thức cụ thể

Chúng ta có thể nhận các gói dựa trên loại giao thức. Bạn có thể chỉ định một trong các giao thức này: fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp và udp. Ví dụ sau bắt các gói arp qua giao diện eth0.

[root@test1 ~]# tcpdump -n -i eth0 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:11:48.860687 ARP, Request who-has 103.97.125.208 tell 103.97.125.128, length 46
00:11:49.078389 ARP, Request who-has 103.97.125.242 tell 103.97.125.128, length 46
00:11:49.154697 ARP, Request who-has 103.97.125.176 tell 103.97.125.128, length 46
00:11:49.471318 ARP, Request who-has 103.97.125.200 tell 103.97.125.128, length 46
00:11:49.480047 ARP, Request who-has 103.97.125.205 tell 103.97.125.128, length 46

12. Nhận gói dữ liệu trên một cổng cụ thể

Nếu bạn muốn biết tất cả các gói được nhận bởi một cổng cụ thể trên máy, bạn có thể sử dụng lệnh tcpdump như sau.

tcpdump -i eth0 port 22

Số port các bạn có thể thay đổi số port mà các bạn muốn bắt gói tin

13. Bắt gói cho IP và cổng cụ thể

Các gói sẽ có số IP và cổng nguồn và đích. Sử dụng lệnh tcpdump, chúng ta có thể áp dụng các bộ lọc trên IP nguồn hoặc số đích và số cổng.

  • Lệnh sau ghi lại các luồng gói trong eth0, với một IP đích cụ thể và cổng số 22.

    tcpdump -w packet.pcap -i eth0 dst 192.168.2.1 and port 22
    
  • Lệnh sau ghi lại các luồng gói trong eth0, với một IP đầu và IP đích cụ thể và cổng số 22.

    tcpdump -w comm.pcap -i eth0 src 151.101.66.122 and port 22 and dst 192.0.2.76 and port 22
    

14. Bắt các gói truyền TCP giữa hai máy chủ

Nếu hai quá trình khác nhau từ hai máy khác nhau đang giao tiếp qua giao thức tcp, chúng ta có thể bắt các gói bằng cách sử dụng tcpdump như sau.

tcpdump -w communication.pcap -i eth0 dst 27.73.27.77 and port 22

Chúng ta có thể mở tệp communication.pcap bằng bất kỳ công cụ phân tích giao thức mạng (Wireshark,...) để gỡ lỗi mọi sự cố tiềm ẩn.

15: Gói bộ lọc(filter) tcpdump

Trong lệnh tcpdump, chúng ta có thể đưa ra các điều kiện “and”, “or” và “not” để lọc các gói cho phù hợp.

[root@test1 ~]# tcpdump -n -i eth0 not arp and not rarp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:28:17.823309 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 2687165910:2687166098, ack 1774021732, win 314, options [nop,nop,TS val 1749188243 ecr 970512573], length 188
00:28:17.823812 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 188:416, ack 1, win 314, options [nop,nop,TS val 1749188244 ecr 970512573], length 228
00:28:17.823923 IP 103.97.125.142.terminaldb > 27.78.27.99.49541: Flags [P.], seq 416:620, ack 1, win 314, options [nop,nop,TS val 1749188244 ecr 970512573], length 204

16: Remote Monitoring

Chúng ta có thể sử dụng tcpdump hoặc tshark trong ssh, nhưng Wireshark giúp chúng ta dễ dàng phân tích và có cái nhìn tổng quan hơn về flow của các gói tin mạng bắt được. Cú pháp lệnh sau đây cho phép chúng ta có thể xem trực tiếp kết quả từ tcpdump đang chạy trên một máy chủ và chuyển tiếp nó qua pipe về thành đầu vào của Wireshark, cách này giúp chúng ta không cần chờ lưu file pcap và tải về máy xem nữa, cách này khá hữu dụng khi cần bắt gói và phân tích gói tin nhanh nhất có thể, ví dụ khi máy chụ bị DDOS:

ssh user@HOST tcpdump -U -s0 -n -w - -i INTERFACE "FILTER" | wireshark -k -i -

Trong đó các tùy chọn của tcpdump có ý nghĩa:

  • -U: Hướng dẫn tcpdump ghi ngay từng gói, thay vì lưu chúng vào bộ đệm
  • -s0: Hướng dẫn tcpdump thu thập càng nhiều dữ liệu của gói càng tốt
  • -n : Vô hiệu hóa địa chỉ để giải quyết tên
  • -w - : Hướng dẫn tcpdump ghi dữ liệu gói vào thiết bị và xuất ở định dạng PCAP, thay vì ở một số định dạng có thể đọc được của con người
  • -i INTERFACE: Giao diện mạng chúng ta có thể bỏ qua điều này
  • "FILTER": Một biểu thức lọc PCAP. Có thể là not port 22

Tùy chọn Wireshark:

  • -k: Ngay lập tức bắt đầu bắt gói tin
  • -i - : Bắt gói tin từ stdin

Ví dụ: Chúng ta bắt gói tin và chuyển vào máy tính của chúng ta để theo dõi trực tiếp trên Wireshark thực hiện như sau:

ssh root@172.16.1.1 tcpdump -U -s0 -n -w - -i tun0 not port 22 -n | wireshark -k -i -