tcpdump
tcpdump (от TCP и англ. dump — свалка, сбрасывать) — утилита UNIX (есть клон для Windows), позволяющая перехватывать и анализировать сетевой трафик, проходящий через компьютер, на котором запущена данная программа.
Tcpdump | |
---|---|
| |
Тип | анализатор трафика |
Написана на | Си[1] |
Операционная система | Linux и Microsoft Windows |
Последняя версия |
|
Читаемые форматы файлов | PCAP[d], Extended TCPDUMP's style capture (little-endian)[d] и Extended TCPDUMP's style capture (big-endian)[d] |
Создаваемые форматы файлов | Extended TCPDUMP's style capture (little-endian)[d] и Extended TCPDUMP's style capture (big-endian)[d] |
Лицензия | модифицированная лицензия BSD[d][3] |
Сайт | tcpdump.org |
Для выполнения программы требуется наличие прав суперпользователя и прямой доступ к устройству (так, например, запуск из Jail во FreeBSD невозможен).
Основные назначения tcpdump:
- Отладка сетевых приложений.
- Отладка сети и сетевой конфигурации в целом.
Описание:
SYN | S | Флаг, который используется при запросе на соединение. |
---|---|---|
ACK | . | Используется при подтверждении пришедшего пакета. |
FIN | F | Флаг устанавливается при нормальном закрытии соединения. |
URGENT | U | Этот флаг нужен при передаче экстренных данных — например, при посылке Ctrl+C в telnet-соединении. |
PUSH | P | Как правило, данный флаг устанавливается при передаче пользовательских данных. |
RESET | R | Немедленный разрыв соединения. |
Заполнитель | none | В случае, если в пакете отсутствует какой-либо флаг используется данный заполнитель. |
Ключи
ключ | описание |
---|---|
-a | Преобразовывает сетевые и широковещательные адреса в доменные имена. |
-e | Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров. |
-F файл | Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться. |
-i | Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию — eth0, для выбора всех интерфейсов — any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo. |
-l | Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:
shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log |
-N | Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит 'net' вместо 'net.library.org' |
-n | Отображает IP-адрес вместо имени хоста. |
-nn | Отображает номер порта вместо используемого им протокола. |
-p | Не переводит интерфейс в режим приема всех пакетов (promiscuous mode). |
-q | Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных. |
-r | Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w. |
-S | Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number — ISN) в относительные. |
-s число | Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet). |
-t | Не отображает метку времени в каждой строке. |
-T тип | Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb. |
-tt | Отображает неформатированную метку времени в каждой строке. |
-tttt | Показывает время вместе с датой. |
-v | Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков) |
-vv | Вывод ещё более полной информации, в основном касается NFS и SMB. |
-vvv | Вывод максимально подробной информации. |
-w файл | Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w - |
-x | Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s |
-xx | То же, что и предыдущий параметр -x, но включает в себя заголовок канального уровня |
-X | Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения. |
-XX | То же, что и предыдущий параметр -X, но включает заголовок канального уровня. |
-с число | tcpdump завершит работу после получения указанного числа пакетов. |
-U | Собранные пакеты будут сразу складываться в файл, а иначе копиться в памяти до тех пор, пока она не закончится |
Примеры
Если tcpdump запустить без параметров, он будет выводить информацию обо всех сетевых пакетах. С помощью параметра -i
можно указать сетевой интерфейс, с которого следует принимать данные:
# tcpdump -i eth2
Чтобы узнать получаемые или отправляемые пакеты от определенного хоста, необходимо его имя или IP-адрес указать после ключевого слова host
:
# tcpdump host nameofserver
Следующим образом можно узнать о пакетах которыми обмениваются nameofserverA и nameofserverB:
# tcpdump host nameofserverA and nameofserverB
Для отслеживания только исходящих пакетов от какого-либо узла нужно указать следующее:
# tcpdump src host nameofserver
Только входящие пакеты:
# tcpdump dst host nameofserver
Порт отправителя и порт получателя соответственно:
# tcpdump dst port 80
# tcpdump src port 22
Чтобы отслеживать один из протоколов TCP, UDP, ICMP, его название следует указать в команде.
Использование операторов and
(&&
), or
(||
) и not
(!
) позволяет задавать фильтры любой сложности. Приоритет операторв: инверсия, затем and
, после — or
.
Пример фильтра, отслеживающего только UDP-пакеты, приходящие из внешней сети:
# tcpdump udp and not src net localnet
Программная реализация
Программа состоит из двух основных частей: части захвата пакетов (обращение к библиотеке, libpcap (Unix) или pcap (Windows)) и части отображения захваченных пакетов (которая на уровне исходного кода является модульной и для поддержки нового протокола достаточно добавить новый модуль).
Часть захвата пакетов (при запуске) передаёт «выражение выбора пакетов» (идущее после всех параметров командной строки) напрямую библиотеке захвата пакетов, которая проверяет выражение на синтаксис, компилирует его (во внутренний формат данных), а затем копирует во внутренний буфер программы сетевые пакеты, проходящие через выбранный интерфейс и удовлетворяющие условиям в выражении.
Часть отображения пакетов выбирает захваченные пакеты по одному из буфера, заполняемого библиотекой, и выводит их (в воспринимаемом человеком виде) на стандартный вывод построчно, в соответствии с заданным (в командной строке) уровнем детальности.
Если задан подробный вывод пакетов, программа проверяет для каждого сетевого пакета, имеется ли у неё модуль расшифровки данных, и, в случае наличия, соответствующей подпрограммой извлекает (и отображает) тип пакета в протоколе или передаваемые в пакете параметры.
Кроссплатформенность
Изначально программа tcpdump была разработана для UNIX-подобных систем, позже — портирована на другие системы.
Для Windows в настоящее время известны:
- tcpdump для Windows — коммерческая реализация, в виде одного файла tcpdump.exe
- WinDump — реализация с открытым кодом, требующая установки библиотеки WinPcap (свободное ПО).
См. также
- Анализатор трафика
- Wireshark, Tshark