Поиск по сайту:

Учебник по команде Linux tcpdump для начинающих (8 примеров)


На этой странице

  1. Команда Linux tcpdump
  2. Q1. Как использовать tcpdump?
  3. Вопрос 2. Как заставить tcpdump выйти после получения заданного количества пакетов?
  4. Вопрос 3. Как заставить tcpdump отображать заголовок уровня ссылки на выходе?
  5. Q4. Как заставить tcpdump отображать внешние IP-адреса численно?
  6. В5. Как заставить tcpdump выводить номера пакетов на выходе?
  7. Q6. Как заставить tcpdump печатать более короткий вывод?
  8. Q7. Как опустить информацию о временной метке из вывода tcpdump?
  9. Q8. Как заставить tcpdump производить подробный вывод?
  10. Заключение

Каждый раз, когда вы открываете веб-страницу на своем компьютере, пакеты данных отправляются и принимаются через ваш сетевой интерфейс. Иногда анализ этих пакетов становится важным по многим причинам. К счастью, Linux предлагает утилиту командной строки, которая выводит информацию, связанную с этими пакетами данных, в вывод.

В этой статье мы обсудим основы рассматриваемого инструмента — tcpdump. Но прежде чем мы это сделаем, стоит упомянуть, что все приведенные здесь примеры были протестированы на компьютере с Ubuntu 18.04 LTS и на Debian 10, но они будут работать и в других дистрибутивах Linux, таких как CentOS, Fedora, Gentoo и Arch Linux.

Команда tcpdump в Linux

Команда tcpdump в Linux позволяет сбрасывать сетевой трафик. Ниже приведен его синтаксис вкратце:

tcpdump [OPTIONS]

Вот подробный синтаксис:

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 algo:secret,...  ]
               [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
               [ --time-stamp-precision=tstamp_precision ]
               [ --immediate-mode ] [ --version ]
               [ expression ]

И вот как это объясняет справочная страница инструментов:

Tcpdump prints out a description of the contents of packets on a network interface that match the 
boolean expression; the description is preceded by a time stamp, printed, by default, as hours,
minutes, seconds, and fractions of a second  since  midnight.  

It can  also  be  run with the -w flag, which causes it to save the packet data to a file for
later analysis, and/or with the -r flag, which causes it to read from a saved packet file rather
than to read packets from a network interface.  It can also be run with the -V  flag,  which causes
it to read a list of saved packet files.

In all cases, only packets that match expression will be processed by tcpdump.

Ниже приведены несколько примеров в стиле вопросов и ответов, которые должны дать вам лучшее представление о том, как работает команда tcpdump.

Q1. Как использовать tcpdump?

Прежде чем использовать tcpdump для перехвата пакетов данных, вы должны в идеале знать, на каком сетевом интерфейсе вы хотите, чтобы этот инструмент работал. Чтобы получить список сетевых интерфейсов, доступных в системе, используйте параметр командной строки -D с tcpdump.

tcpdump -D

Вот как справочная страница объясняет эту опцию:

Print the list of the network interfaces available on the system and on which tcpdump can capture 
packets. For each network interface, a number and an interface name, possibly followed by a text
description of the interface, is printed. The interface name or the number can be supplied to the
-i flag to specify an interface on which to capture.

This can be useful on systems that don't have a command to list them (e.g., Windows systems, or
UNIX systems lacking  ifconfig -a); the number can be useful on Windows 2000 and later systems,
where the interface name is a somewhat complex string.

The  -D  flag  will not be supported if tcpdump was built with an older version of libpcap that
lacks the pcap_findalldevs() function.

Например, в моем случае был получен следующий вывод:

1.wlx18a6f713679b [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.enp3s0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
9.usbmon3 (USB bus number 3)
10.usbmon4 (USB bus number 4)

Теперь, когда у вас есть список интерфейсов, вы можете выбрать один из них и передать его имя в качестве входных данных для параметра командной строки -i tcpdump. Например:

tcpdump -i wlx18a6f713679b

Ниже приведена часть вывода этой команды в моем случае:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
11:53:11.408964 IP 192.168.2.132.52898 > 239.255.255.250.3702: UDP, length 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, length 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.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 > one.one.one.one.domain: 31630+ [1au] PTR? 1.1.1.1.in-addr.arpa. (49)
11:53:11.842603 IP himanshu.57253 > one.one.one.one.domain: 16905+ [1au] PTR? 140.2.168.192.in-addr.arpa. (55)
11:53:11.951226 IP himanshu.52662 > one.one.one.one.domain: 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, length 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, length 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.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)
...
...

Q2. Как заставить tcpdump выйти после получения заданного количества пакетов?

Этого можно добиться с помощью параметра командной строки -c. Например, если вы хотите, чтобы tcpdump отображал только информацию, относящуюся к 10 пакетам, вы можете сделать это следующим образом:

tcpdump -c 10

Например, в моем случае я выполнил следующую команду:

tcpdump -c 10 -i wlx18a6f713679b

Ниже приведен результат, который был произведен:

Таким образом, вы можете видеть, что было захвачено 10 пакетов.

Q3. Как заставить tcpdump отображать заголовок уровня ссылки на выходе?

Это можно сделать с помощью параметра командной строки -e. Например:

tcpdump -e -i wlx18a6f713679b

И вот результат:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
12:14:07.951396 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 255.255.255.255.17500: UDP, length 155
12:14:07.952111 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 192.168.2.255.17500: UDP, length 155
...
...

Таким образом, вы можете видеть, что в выходных данных были созданы заголовки на уровне ссылок.

Q4. Как заставить tcpdump отображать внешние IP-адреса численно?

Этого можно добиться с помощью параметра командной строки -f.

tcpdump -f -i [INTERFACE]

Отображение tcpdump внешних IPv4-адресов численно, а не символически, имеет свои преимущества в определенных ситуациях. Один такой пример упоминается на справочной странице инструментов:

this option is intended to get around serious brain damage in Sun's NIS server — usually it hangs 
forever translating non-local internet numbers

Q5. Как заставить tcpdump выводить номера пакетов на выходе?

Чтобы заставить tcpdump выдавать номера пакетов на выходе, используйте параметр командной строки --number.

Например, я выполнил следующую команду:

tcpdump --number -i wlx18a6f713679b

И вот часть вывода, который был произведен:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
    1  12:38:35.522944 ARP, Request who-has 192.168.2.196 tell _gateway, length 46
    2  12:38:35.523265 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 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
...
...
...

Итак, вы можете видеть, что каждая строка теперь начинается с числа.

Q6. Как заставить tcpdump печатать более короткий вывод?

Это можно сделать с помощью параметра командной строки -q. Вот как это объясняет справочная страница инструментов:

Quick (quiet?) output.  Print less protocol information so output lines are shorter.

Ниже приведен пример этого варианта:

Таким образом, вы можете видеть, что на этот раз на выходе было получено меньше информации.

Q7. Как опустить информацию о временной метке из вывода tcpdump?

Для этого используйте параметр командной строки -t. Вот пример команды:

tcpdump -t -i wlx18a6f713679b

И вот его вывод:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
IP himanshu.56992 > mails11.telegram.org.https: Flags [.], ack 3090054317, win 965, options [nop,nop,TS val 226976758 ecr 3781653930], length 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
...
...

Таким образом, вы можете видеть, что информация о метке времени (которая обычно находится в начале каждой строки) сейчас отсутствует в выводе.

Q8. Как заставить tcpdump производить подробный вывод?

В этом случае вы можете использовать параметр командной строки -v. Ниже показано, как справочная страница инструментов объясняет эту опцию:

tcpdump -v -i [INTERFACE]
When parsing and printing, produce (slightly more) verbose output. For example, the time to live,
identification, total length and options in an IP packet are printed. Also enables additional
packet integrity checks such as verifying the IP and ICMP header checksum.

When writing to a file with the -w option, report, every 10 seconds, the number of packets captured

Заключение

Мы только коснулись поверхности, так как команда tcpdump предлагает множество параметров командной строки. После того, как вы закончите практиковать их, вы можете перейти на справочную страницу инструментов, чтобы узнать больше об этом.