Skip to main content

tcpdump — мониторим сеть

  • Home
  • Linux
  • tcpdump — мониторим сеть
tcpdump

Довольно часто возникает необходимость узнать работоспособность сети. Или просто в общеобразовательных целях — узнать как взаимодействуют между собой объекты сети. Или с целью исследовать где сидит страшный bug :). И вот именно для этих целей в unix-ы рулят. Потому что все толковое написано для никсов и уже потом портировано под винду.
Вот об одной такой утилите мы сегодня и поговорим — tcpdump.

tcpdump (от TCP и англ. dump — свалка, сбрасывать) — утилита UNIX, позволяющая перехватывать и анализировать сетевой трафик, проходящий через компьютер, на котором запущена данная программа.

Основные назначения tcpdump:

  • Отладка сетевых приложений.
  • Отладка сети и сетевой конфигурации в целом.

Как работает Tcpdump

Tcpdump выводит заголовки пакетов проходящих через сетевой интерфейс, которые совпадают с булевым выражением. Он может также быть запущен с ключем -w, который заставляет сохранять данные пактов в файл для дальнейшего исследования, и/или с ключем -r, который заставляет читать сохраненные пакеты из файла, вместо чтения пакетов из сетевого интерфейса. В любом случае, tcpdump будут обработаны только те пакеты, которые совпадают с выражением.

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

Описание некоторых из ключей

  • -c count Выйти после получения определенного количества пакетов.
  • -C file_size Перед записью «сырого» пакета в файл, происходит проверка на превышение размером файла лимита, указанного в file_size. Если размер файла больше, то файл закрывается и открывается новый. Новый файл будет иметь имя определенное в ключе -w, со стоящим в конце числом 2, которое будет увеличиваться в следующих именах файлов. file_size определяет размер в миллионах байт (1,000,000), а не мегабайтах (1,048,576).
  • -F file Использовать file для ввода фильтрующего выражения. Выражение, указанное в командной строке, будет игнорироваться.
  • -i interface Собирать пакеты только на определенном интерфейсе. Если не указан — берется минимальный по номеру интерфейс (исключая loopback). Для Linux-ядер 2.2 и более новых, возможно указать ‘any’, тогда будет происходить сбор на всех интерфейсах, но они не будут переведены в режим promiscuous.
  • -n Не преобразовывать адрес хоста в имя. Может быть использовано, если необходимо избегать DNS-запросов.
  • -nn Не преобразовывать протокол и номер порта в их имена.
  • -N Не выводить доменную часть имени хоста. Например, при данном ключе будет выводится «nic» вместо «nic.ddn.mil»
  • -p Не переводить интерфейс в режим promiscuous. Следует заметить, что интерфейс может быть в режиме promiscuous по другим причинам.
  • -r file Читать пакеты из file (который, был создан с ключем -w). Если file указан как «-«, то используется стандартный ввод.
  • -t Не выводить временной штамп (timestamp) в каждой строке дампа (dump).
  • -tt Выводит не форматированный временной штамп в каждой строке дампа.
  • -ttt Выводить разницу (в микросекундах) между текущей и предыдущей строками дампа.
  • -tttt Выводить временной штамп вместе с датой в формате по-умолчанию в каждой строке дампа.
  • -v (Чуть более) подробный вывод. Для еще более подробного вывода используются: -vv и -vvv.
  • -w file Писать «сырые» пакеты в file перед тем как произвести их разбор и вывести. Они могут быть позднее выведены с ключем -r. Если file указан как «-«, то используется стандартный вывод.
  • -x Печатать каждый пакет (без заголовков уровня соединения) в шестнадцатиричном виде.
  • -X Помимо шестнадцатиричного вида выводить их ASCII-значения.

Фильтрующее выражение

Выражение выбирает какие пакеты будут выбираться из общего потока. Если оно не указано, то будут выбираться и выводится все пакеты идущие через интерфейс. Иначе, будут обработаны только те пакеты, для которых проверка с выражением выдаст значение «истина» (true).

Выражение состоит из одного или более примитивов. Примитивы обычно состоят из ID (имя или номер) следующего за одним или более классификаторами.

Три вида классификаторов:

  • type Говорят к какому виду относить ID. Возможный значения host, net или port.
    Пример: ‘host foo‘, ‘net 128.3‘, ‘port 20‘. Если классификатор type не указан, то подразумевается host.
  • dir Определяет конкретное направление передачи «к» и/или «от» ID. Возможны значения src, dst, src or dst and src and dst.
    Пример, ‘src foo‘, ‘dst net 128.3‘, ‘src or dst port ftp-data‘. Если не указан, то подразумевается src or dst. Для соединений нулевого (‘null’) уровня (к примеру, протокол точка-точка, такой как slip) указанием направления могут быть классификаторы inbound и outbound.
  • proto Ограничивает совпадение конкретным протоколом. Возможные протоколы: ether, fddi, tr, ip, ip6, arp, rarp, decnet, tcp и udp.
    Пример, ‘ether src foo‘, ‘arp net 128.3‘, ‘tcp port 21‘. Если классификатор proto не указан, то подразумеваются все перечисленные типы протоколов. Например, ‘src foo означает ‘(ip or arp or rarp) src foo’, ‘net bar’ означает ‘(ip or arp or rarp) net bar’, а ‘port 53’ означает ‘(tcp or udp) port 53’.

В добавок, существует несколько специальных примитивов — ключевых слов: gateway, broadcast, less, greater и арифметические выражения.

Более сложные фильтрующие выражения могут быть построены с помощью слов and, or и not, объединяющих примитивы. Пример, ‘host foo and not port ftp and not port ftp-data’. Чтобы уменьшить количество вводимой информации, идентичные списки классификаторов могут быть опущены. Пример, ‘tcp dst port ftp or ftp-data or domain’ это тоже самое, что и ‘tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain’

Некоторые из допустимых примитивов (за более полным списком в man tcpdump):

  • dst host host
    Истина, если поле «назначение» пакета -это host, который может быть адресом или именем
  • src host host
    Истина, если поле «источник» пакета — это host.
  • host host
    Истина, если или поле «назначение», или поле «источник» пакета — это host. Любое из описанный выше выражений может быть приписано к ключевому слову ip, arp, rarp, или ip6, как в ‘ip host host’, что эквивалентно ‘ether proto \ip and host host’. Если host — это имя с несколькими IP адресам, то проверяется совпадение по каждому адресу.
  • net net mask netmask
    Истина, если IP адрес входит в сеть с указанной сетевой маской. Может быть классифицировано с dst или src.
  • net net/len
    Истина, если IP адрес входит в сеть с указанной сетевой маской, заданной количеством бит. Может быть классифицировано с dst или src.
  • dst port port
    Истина, если пакет протоколов ip/tcp, ip/udp, ip6/tcp или ip6/udp, и порт-назначения имеет значение указанное в port. Порт может быть числом или именем, используемым в /etc/services. Если используется число или неоднозначное имя, то проверяется только номер порта (пример, ‘dst port 513’ будет выводить трафик и для tcp/login и для udp/who, а ‘port domain’ будет выводить трафик и для tcp/domain и для udp/domain).
  • src port port
    Истина, если пакет имеет порт-источник — port
  • port port
    Истина, если или порт-назначение, или порт-источник в пакете — port. Любое из описанных выше выражений может быть приписано к ключевому слову tcp или udp, как в ‘tcp src port port’, проверяющее совпадения только для TCP-пакетов.
  • less length
    Истина, если пакет имеет длину меньше или равную length. Это эквивалентно len <= length.
  • greater length
    Истина, если пакет имеет длину больше или равную length. Это эквивалентно len >= length.
  • ip proto protocol
    Истина, если пакет — это IP-пакет протокола, указанного в protocol. Протокол может быть числом или одним из имен icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, или tcp. Заметим, что идентификаторы tcp, udp и icmp — ключевые слова и должны быть «заэкскейпены» через обратный слэш (\).

Прежде чем переходит к примерам рассмотрим, что может нам выдать tcpdump при выполнении.
Типичные результаты работы tcpdump -ttt:

Первое поле — поле времени, т. к. запуск осуществлялся с ключом «-ttt«, то это разница в микросекундах между этим пакетом и предыдущим.
Потом идет IP-адрес (или имя) отправителя пакета, через точку может указываться порт. После знака «>», указывается получатель пакета (или его имя) и также порт. Затем будет идти либо сразу служебная информация идущая в пакете, либо протокол (у нас это icmp). В служебной информации может быть указано либо состояние флагов в пакете, либо расшифрованная информация («192.168.2.13 udp port 3631 unreachable» или DNS-запрос об хосте).

Конкретные примеры

Вот теперь в потоке пакетов можно разобраться.

Здесь, кстати будет бегать не только DNS-трафик. А вообще весь, который идет по UDP. Исправить это можно следующим:

Related Posts

Clear Filters

Всегда существовала проблема занимаемого места. Раньше это волновало ибо размеры жестких дисков были просто «огроменных» размеров, например 200Мб или 10Гб (естественно были и меньше). Сейчас же, когда стоимость одного Гб стоит почти ничего, казалось бы этот вопрос должен был отойти на задний план. Но он все также волнует пользователей. А для тех, кто выбрал линукс, это вообще дело чести — пилить свою систему до идеального состояния. Вот поэтому и возникает закономерный вопрос — зачем какой то пакет будет занимать мои 100Мб, если он абсолютно не нужен и я найду этим мегабайтам лучшее применение? Или если уж на то пошло, приводить все в порядок, не будем ограничиваться только занимаемым местом. Мы пойдём ещё дальше и найдём все, что можно подшаманить, подкрутить, подправить.

У вас есть отдельно стоящий сервер? Ходите на него через ssh? Пароль в целях безопасности больше 10 символов? В день заходите на сервер n-ное количество раз? Реально задолбало вводить каждый раз пароль на вход? Меня тоже 🙂
А выход как всегда прост до безобразия, потому что все уже придумано до нас.

Плагин Presto для yum. Слыхали про такой? Если нет тогда вы просто обязаны узнать про него, установить и пользоватся. Хотя, наверное, многие из вас уже давно им пользуется. Но для тех кто еще не в курсе — читаем в продолжении про что такое плагин Presto (нет это не короткометражный мультфильм от студии Pixar 😀 )

Обновление это и важно и нужно. И дыры закрывает и новые фишки добавляет. Есть только одно НО для обновлений — это их размер. Тем у кого интернет канал широкий — тому это может и все равно, а вот остальным будет очень даже кстати.

Было как то дело и здесь я описывал Как проапгрейдить Fedora 9 до Fedora 10. Процес аналогичный, но если в прошлый раз я обновился через полгода, а может и позже, после выхода нового релиза, то в этот раз я решил сделать это пораньше. Специально, что бы был «экстрим». И он был.

Чудес было много.