Как проверять входящие и исходящие подключения с помощью Tcpdump в Linux

12 set 2022 8 min di lettura
Как проверять входящие и исходящие подключения с помощью Tcpdump в Linux
Indice dei contenuti

Введение

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.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.