Введение
tcpdump
— это утилита командной строки, которую можно использовать для захвата и проверки сетевого трафика, входящего и исходящего из системы. Это наиболее часто используемый сетевой администратор инструмент для устранения неполадок в сети и тестирования безопасности.
Несмотря на название, с помощью tcpdump
также можно перехватывать не-TCP-трафик, такой как UDP, ARP или ICMP. Захваченные пакеты могут быть записаны в файл или на стандартный вывод. Одной из самых мощных функций команды tcpdump
является ее способность использовать фильтры и захватывать только те данные, которые вы хотите проанализировать.
В этой статье мы рассмотрим основы использования команды tcpdump
в Linux.
Если вы хотите установить Tcpdump на удаленный сервер, продолжайте читать, в противном случае пропустите первый абзац «Подключение к серверу» и читайте следующий.
Подключение к серверу
Чтобы получить доступ к серверу, вам нужно знать IP-адрес. Вам также потребуется ваше имя пользователя и пароль для аутентификации. Чтобы подключиться к серверу как root, введите следующую команду:
ssh root@IP_DEL_SERVER
Далее вам нужно будет ввести пароль пользователя root.
Если вы не используете пользователя root, вы можете войти под другим именем пользователя с помощью той же команды, а затем изменить root на свое имя пользователя:
ssh nome_utente@IP_DEL_SERVER
Затем вам будет предложено ввести пароль пользователя.
Стандартный порт для подключения по ssh — 22, если ваш сервер использует другой порт, вам нужно будет указать его с помощью параметра -p, затем введите следующую команду:
ssh nome_utente@IP_DEL_SERVER -p PORTA
Установить Tcpdump
tcpdump
установлен по умолчанию в большинстве дистрибутивов Linux и macOS. Чтобы проверить, доступна ли команда tcpdump
для вашего типа системы, используйте следующую команду:
tcpdump --version
Если tcpdump
отсутствует в вашей системе, приведенная выше команда напечатает «tcpdump: команда не найдена». Вы можете легко установить tcpdump
с помощью менеджера пакетов вашего дистрибутива.
Установите Tcpdump на Ubuntu и Debian
sudo apt update && sudo apt install tcpdump
Установите Tcpdump на CentOS и Fedora.
sudo yum install tcpdump
Установите Tcpdump в Arch Linux
sudo pacman -S tcpdump
Затем проверьте правильность установки с помощью следующей команды:
tcpdump --version
Вывод должен выглядеть так:
tcpdump version 4.9.3
libpcap version 1.8.1
OpenSSL 1.1.1d 10 Sep 2019
Получение пакетов с помощью tcpdump
Общий синтаксис команды tcpdump
следующий:
tcpdump [options] [expression]
- Команда
options
позволяет вам управлять поведением команды. - Фильтр
expression
определяет, какие пакеты будут перехвачены.
Команда tcpdump
может быть запущена только пользователем root или пользователями с привилегиями sudo
. Если вы попытаетесь запустить команду от имени непривилегированного пользователя, вы получите сообщение об ошибке: «У вас нет прав для захвата на этом устройстве».
Самый простой вариант использования — вызвать tcpdump
без опций и фильтров:
sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:28:50.627720 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 3036272519:3036272647, ack 288322885, win 1452, length 128
21:28:50.627782 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 128:192, ack 1, win 1452, length 64
21:28:50.627823 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 192:320, ack 1, win 1452, length 128
21:28:50.627863 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 320:384, ack 1, win 1452, length 64...
29 packets captured
45 packets received by filter
10 packets dropped by kernel
tcpdump
продолжит захват пакетов и запись в стандартный вывод, пока не получит сигнал прерывания. Используйте комбинацию Ctrl+C
, чтобы отправить сигнал прерывания и отменить команду.
Для более подробного вывода используйте параметр -v
или -vv
для еще более подробного вывода:
sudo tcpdump -vv
Вы можете указать количество пакетов для захвата с помощью опции -c
. Например, чтобы захватить только десять пакетов, введите:
sudo tcpdump -c 10
После захвата пакетов tcpdump
остановится.
Если интерфейс не указан, tcpdump
использует первый интерфейс, который находит и загружает все пакеты, проходящие через этот интерфейс.
Используйте параметр -D
, чтобы распечатать список всех доступных сетевых интерфейсов, с которых tcpdump может собирать пакеты:
sudo tcpdump -D
Для каждого интерфейса команда выводит имя интерфейса, краткое описание и соответствующий индекс (номер):
1.eth0 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.usbmon2 (USB bus number 2)
Вывод выше показывает, что eth0
— это первый интерфейс, найденный и используемый tcpdump
, когда для команды не указан интерфейс. Второй any
интерфейс — это специальное устройство, позволяющее захватить все активные интерфейсы.
Чтобы указать интерфейс, на котором вы хотите перехватывать трафик, вызовите команду с параметром -i
, за которым следует имя интерфейса или соответствующий индекс. Например, чтобы получить все пакеты со всех интерфейсов, нужно указать any
интерфейс:
sudo tcpdump -i any
По умолчанию tcpdump
выполняет обратное разрешение DNS для IP-адресов и переводит номера портов в имена. Используйте параметр -n
, чтобы отключить перевод:
sudo tcpdump -n
Пропуск поиска DNS позволяет избежать генерации DNS-трафика и делает вывод более читаемым. Рекомендуется использовать эту опцию всякий раз, когда вы вызываете tcpdump
.
Вместо вывода вывода на экран вы можете перенаправить его в файл с помощью операторов перенаправления >
и >>
:
sudo tcpdump -n -i any > file.out
Вы также можете посмотреть данные при сохранении в файл с помощью команды tee
:
sudo tcpdump -n -l | tee file.out
Параметр -l
в приведенной выше команде позволяет tcpdump
буферизовать строку вывода. Если эта опция не используется, вывод не будет выводиться на экран при создании новой строки.
Понимание вывода tcpdump
tcpdump
генерирует информацию для каждого захваченного пакета в новой строке. Каждая строка включает метку времени и информацию об этом пакете, в зависимости от протокола.
Типичный формат строки протокола TCP выглядит следующим образом:
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
Мы идем поле за полем и объясняем следующую строку:
15:47:24.248737 IP 192.168.1.27.22 > 192.168.1.15.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248737
- Временная метка захваченного пакета указана по местному времени и использует следующий формат:hours:minutes:seconds.frac
, гдеfrac
- доли секунды с полуночи.IP
- протокол пакета. В данном случае IP означает Интернет-протокол версии 4 (IPv4).192.168.1.27.22
— исходный IP-адрес и порт, разделенные точкой (.
).192.168.1.15.37445
— IP-адрес и порт назначения, разделенные точкой (.
).
Flags [P.]
— Поле флага TCP. В этом примере [P.]
означает пакет Push Acknowledgment, который используется для подтверждения предыдущего пакета и отправки данных. Другими типичными значениями полей флага являются следующие:
- [.] - ACK (подтверждение)
- [S] - SYN (Начать соединение)
- [P] - PSH (Push-данные)
- [F] - FIN (Завершить соединение)
- [R] - RST (Сброс соединения)
- [S.] - SYN-ACK (пакет SynAcK)
seq 201747193:201747301
— порядковый номер находится вfirst:last
обозначении. Показывает количество данных, содержащихся в пакете. За исключением первого пакета в потоке данных, где эти числа являются абсолютными, все последующие пакеты используют относительные позиции байтов. В этом примере число201747193:201747301
означает, что этот пакет содержит байты от 201747193 до 201747301 потока данных. Используйте параметр-S
для печати абсолютных порядковых номеров.ack 1226568763
Номер подтверждения представляет собой прогрессивный номер последующих данных, ожидаемых от другого конца этого соединения.win 402
— номер окна — это количество байтов, доступных в буфере приема.options [nop,nop,TS val 1051794587 ecr 2679218230]
— параметры TCP.nop
или «no operation» используется для того, чтобы сделать заголовок TCP кратным 4 байтам.TS val
— это временная метка TCP, аecr
— эхо-ответ. Посетите документацию IANA для получения дополнительной информации о параметрах TCP.length 108
- Длина данных полезной нагрузки
Фильтры Tcpdump
Когда tcpdump
вызывается без фильтрации, он захватывает весь трафик и выдает огромное количество выходных данных, что очень затрудняет поиск и анализ интересующих пакетов.
Фильтры — одна из самых мощных функций команды tcpdump
. Они позволяют захватывать только те пакеты, которые соответствуют выражению. Например, при устранении неполадок веб-сервера вы можете использовать фильтры, чтобы получать только HTTP-трафик.
tcpdump
использует синтаксис Berkeley Packet Filter (BPF) для фильтрации захваченных пакетов с использованием различных параметров обработки, таких как протоколы, исходные и целевые IP-адреса и порты и т. д.
В этой статье мы рассмотрим некоторые из наиболее распространенных фильтров. Список всех доступных фильтров см. на справочной странице pcap-filter.
Фильтровать по протоколу
Чтобы ограничить получение определенным протоколом, укажите протокол в качестве фильтра. Например, для захвата только UDP-трафика вы должны использовать:
sudo tcpdump -n udp
Другой способ определить протокол — использовать параметр proto
, за которым следует номер протокола. Следующая команда отфильтрует протокол номер 17 и даст тот же результат, что и выше:
sudo tcpdump -n proto 17
Дополнительные сведения о номерах см. в списке номеров IP-протокола.
Фильтровать по хосту
Чтобы получать только пакеты, относящиеся к определенному хосту, используйте параметр host
:
sudo tcpdump -n host 192.168.1.22
Хост может быть IP-адресом или именем.
Вы также можете отфильтровать выходные данные для определенного диапазона IP-адресов, используя параметр net
. Например, чтобы сбросить только связанные пакеты 10.10.0.0/16
, вам нужно использовать:
sudo tcpdump -n net 10.10
Дверной фильтр
Чтобы ограничить захват только пакетами, поступающими или исходящими из определенного порта, используйте параметр port
. Следующая команда получает пакеты, относящиеся к службе SSH (порт 22), используя эту команду:
sudo tcpdump -n port 22
Параметр portrange
позволяет захватывать трафик на ряде портов:
sudo tcpdump -n portrange 110-150
Фильтровать по месту отправления и назначения
Вы также можете фильтровать пакеты на основе исходного или целевого порта или хоста, используя параметры src
, dst
, src and dst
и src or dst
.
Следующая команда получает пакеты от хоста с IP 192.168.1.22:
sudo tcpdump -n src host 192.168.1.22
Чтобы найти трафик из любого источника на порт 80, вам нужно будет использовать:
sudo tcpdump -n dst port 80
Сложные фильтры
Фильтры можно комбинировать с помощью операторов and
( &&
) or
( ||
) и not
( !
).
Например, чтобы перехватить весь HTTP-трафик, исходящий с исходного IP-адреса 192.168.1.22, вам нужно будет использовать эту команду:
sudo tcpdump -n src 192.168.1.22 and tcp port 80
Вы также можете использовать круглые скобки для группировки и создания более сложных фильтров:
sudo tcpdump -n 'host 192.168.1.22 and (tcp port 80 or tcp port 443)'
Чтобы избежать ошибок синтаксического анализа при использовании специальных символов, заключайте фильтры в одинарные кавычки.
Вот еще один пример команды для захвата всего трафика, кроме SSH, с исходного IP-адреса 192.168.1.22:
sudo tcpdump -n src 192.168.1.22 and not dst port 22
Проверка упаковки
По умолчанию tcpdump
захватывает только заголовки пакетов. Однако иногда может возникнуть необходимость осмотреть содержимое посылок.
tcpdump
позволяет печатать содержимое пакетов в ASCII и HEX.
Опция -A
позволяет утилите tcpdump
печатать каждый пакет в ASCII, а -x
в HEX:
sudo tcpdump -n -A
Чтобы отобразить содержимое пакета как в HEX, так и в ASCII, используйте параметр -X
:
sudo tcpdump -n -X
Чтение и запись снимков в файл
Еще одна полезная функция tcpdump
— запись пакетов в файл. Это полезно при получении большого количества пакетов или когда вы хотите получить пакеты для последующего анализа.
Чтобы начать запись в файл, используйте параметр -w
, за которым следует выходной файл захвата:
sudo tcpdump -n -w data.pcap
Эта команда выше сохранит захват в файле с именем data.pcap
. Вы можете назвать файл по желанию, но обычно используется .pcap
(захват пакетов).
При использовании опции -w
вывод не отображается на экране. tcpdump
записывает необработанные пакеты и создает двоичный файл, который нельзя прочитать в обычном текстовом редакторе.
Чтобы проверить содержимое файла, вызовите tcpdump
с параметром -r
:
sudo tcpdump -r data.pcap
Файл захвата также можно проверить с помощью других инструментов анализа пакетов, таких как Wireshark.
При захвате пакетов в течение длительного периода времени можно включить ротацию файлов. tcpdump
позволяет создавать новые файлы или менять файл дампа в течение заданного интервала времени или фиксированного размера. Следующая команда создает файл размером до 200 МБ, а затем создает еще один файл размером до десяти с file.pcap0
, file.pcap1
и т. д.: перед перезаписью самых старых файлов.
sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap
После создания десяти файлов самые старые файлы будут перезаписаны.
Обратите внимание, что вам нужно запустить tcpdump
только во время устранения неполадок.
Если вы хотите запустить tcpdump
в определенное время, вы можете использовать cronjob. tcpdump
не может остановиться через определенное время. Вы можете использовать команду timeout
, чтобы остановить tcpdump
по истечении определенного периода времени. Например, чтобы выйти через 5 минут, вы должны использовать:
sudo timeout 300 tcpdump -n -w data.pcap &
Амперсанд ( &
) в конце команды заставляет команду выполняться в фоновом режиме.
Вывод
tcpdump
— это инструмент командной строки для анализа и устранения сетевых проблем.
Эта статья показала вам основы использования и синтаксиса tcpdump
. Для получения более подробной документации посетите веб-сайт tcpdump.