Исследование TCP/IP с помощью TCPdump и Tethereal.
Автор : Vinayak Hegde
Перевод : Иван Песин
Кратчайший обзор TCP/IP
На сегодняшний день TCP/IP является стандартом де факто среди сетевых протоколов. IP (Internet Protocol) обеспечивает функциональность сетевого уровня* (адресация и маршрутизация), тогда как TCP (Transmission Control Protocol) организовывает (виртуальную) сквозную связность. Стек TCP/IP включает в себя множество других полезных протоколов, таких как ICMP (Internet Control Message Protocol), IGMP (Internet Group Management Protocol) и UDP (User Datagram Protocol). Подавляющее большинство современных сетей используют TCP/IP. В наши дни практически все приложения включают в себя некую сетевую функциональность. Следовательно, для каждого программиста становится необходимым наличие хотя бы базовых знаний о TCP/IP.
Процесс передачи информации между компьютерами на основе протокола TCP/IP реализуется через обмен пакетами. На уровне IP блок данных протокола (PDU, Protocol Data Unit) называется пакетом (строго говоря, PDU сетевого уровня, называется "дейтаграмма", хотя иногда, если это не вызывает разночтений, используется и название "пакет". См. также * - Прим.пер.), на уровне TCP -- сегментом, а на уровне сетевого интерфейса (например, ethernet) -- кадром. Тем не менее, термин "пакет" используется как для описания блока данных проходящего сквозь уровни модели TCP/IP, так и для блока данных пересылаемого между компьютерами.
Вот как выглядит кадр Ethernet:
+------------------------------------------------------------------+
| | | | | |
| Заголовок | Заголовок | Заголовок | Инкапсулированые | Концовка |
| Ethernet | IP | TCP | данные | Ethernet |
| | | | | FCS |
+------------------------------------------------------------------+
< 20 байт > < 40 байт >
<---- максимальная длина = 1500 байт ---->
FCS означает контрольная сумма кадра (Frame check sequence)
|
TCPdump и Tethereal
TCPdump -- утилита, которая позволяет перехватывать и записывать пакеты, проходящие через сетевой интерфейс. Это очень удобная маленькая утилита, которая может помочь программисту при поиске ошибок в сетевых приложениях. Однако, в связи с тем, что утилита может перехватывать все пакеты, полученные интерфейсом, она также может быть использована в неблаговидных целях.
Обычно, верхним уровням стека TCP/IP передаются только те пакеты, которые адресованы конкретному сетевому интерфейсу. Все прочие пакеты попросту игнорируются. Если же интерфейс находится в режиме Promiscuous, то верхним уровням передаются абсолютно все пакеты. TCPdump для своей работы переводит интерфейс именно в такой режим.
TCPdump использует библиотеку libpcap (библиотека захвата пакетов -- packet capture library), которая свободно доступна. Библиотека libpcap универсальна и работает с пакетным фильтром BSD, SVR4 Data-link Provider Interface (DLPI) и интерфейсом Linux SOCK_PACKET. Tethereal, который представляет собой версию популярного анализатора трафика ethereal для работы в командной строке, тоже использует библиотеку захвата пакетов pcap. Tethereal -- это мощная утилита для анализа сетевого трафика, обладающая большими возможностями по декодированию пакетов в сравнении с TCPdump. Ethereal -- графическая утилита анализа пакетов, позволяющая просматривать различные флаги и опции в иерархическом виде. Одной из лучших функций утилиты ethereal является возможность соединения фрагментов сообщений двух компьютеров и последующее отображение содержания обмена в виде ASCII-текста.
Форматы пакетов TCP и IP
Представление в формате ASCII из RFC 791
Структура заголовка IP дейтаграммы
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Версия| IHL | Тип сервиса | Общая длинна |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Идентификатор пакета |Флаги| Смещение фрагмента |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Время жизни | Протокол | Контрольная сумма |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Адрес источника |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Адрес назначения |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Опции | Выравнивание |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IHL - длина заголовка (IP Header Length)
|
Представление в формате ASCII из RFC 793
Структура заголовка сегмента TCP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Порт источника | Порт назначения |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Номер в последовательности |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Номер подтверждения |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Сдвиг | |U|A|P|R|S|F| |
| данных| Резерв |R|C|S|S|Y|I| Окно |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Контрольная сумма | Указатель срочности |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Опции | Выравнивание |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Поле данных |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
URG,ACK,PSH,RST,SYN,FIN - Контрольные биты (флаги)
|
Примеры захвата пакетов с помощью TCPdump и Tethereal
Вы можете экспериментировать с программой TCPdump на любом интерфейсе, через который можно управлять сетевыми транзакциями. Чтобы увидеть ваши сетевые интерфейсы введите команду:
За ней последует список сетевых интерфейсов вашей системы, включая "петлевой" [loopback]. Если вы подключены к сети по телефонной линии, то для отладки и экспериментов можно использовать и интерфейс ppp0.
Пример #1
Это фрагмент (из файла tcpdumpppp) записи пакетов, захваченных на интерфейсе ppp0. Флаг -vvv означает выводить много-много информации (very very verbose). Другие ключи управления информативностью: -v и -vv.
#tcpdump -vvv > tcpdumpppp
tcpdump: listening on ppp0
|
Захват пакетов завершается по нажатию CTRL-C.
15:57:58.181078 207.219.33.101.http > 203.94.236.47.33003: P 1:1399(1398) ack 736 win 31856
(DF) [tos 0x10] (ttl 38, id 28827, len 1450)
|
Вот информация, которую можно получить из приведенной записи
- Используется протокол http (порт 80 декодировался как http) (Автор несколько вольно интерпретирует запись. Точнее было бы "Порт источника -- 80", поскольку протокол обмена может быть и не http. - Прим.пер.).
- Локальный IP адрес, назначенный мне моим провайдером после дозвона 203.94.236.47 (можно проверить посмотрев в /var/log/messages).
- Адрес http-сервера -- 207.219.33.101 (Адрес изменен в целях безопасности).
- Время жизни равно 38 переходам.
- Установлен флаг "Не фрагментировать", который запрещает фрагментацию дейтаграммы промежуточным маршрутизаторам.
- Установлен флаг ACK (номер подтверждения - 736).
- Размер окна 31856.
- Порт получателя 33003
Пример #2
Этот пакет был захвачен с сетевой карты (интерфейса, обозначенного eth0)
06:21:11.414863 > pca03.nt.co.in.ssh > pcc03.mum.nt.co.in.4944: P 252143283:252143331(48) ack 2638534821 win 62780 (DF) [tos 0x10]
E^P ^@ X .... @^@ @^F .. N .... ....
.... .... ^@^V ^S P ^O^G f.. .. D ....
P^X .. < .. t ^@^@ k + Y^Q .... .. (
^.. )^G c 3 ^\ v t.. ..^G ^J.. .. t
9.. .. - F.. .... 6.. /. .... 9..
[.. .... G.. .. d
|
Мы разрешили утилите TCPdump отображать IP адреса в символьном виде, если это возможно (-a) (Это сильно замедляет работу утилиты. - Прим.пер.) и явно указали интерфейс, на котором производить захват пакетов. Если мы не укажем опцию (-i), то TCPdump будет захватывать пакеты на всех доступных интерфейсах. Информация, которую мы можем получить из вышеприведенной записи:
- На серверной стороне используется порт ssh (22). В этом можно убедится, просмотрев файл /etc/services.
- Один из битов "Тип Сервиса" (TOS) установлен, потому сети с поддержкой QoS предоставят необходимый пакету тип сервиса.
- Размер окна объявлен равным 62780.
- Длина пакета 48 байт.
Пример #3
Следующий фрагмент представляет собой SYN-пакет (запрос соединения). Пакет захвачен с интерфейса Ethernet.
15:57:56.074928 203.94.236.47.33003 > 216.239.33.101.http: S [tcp sum ok] 937694521:937694521(0) win 5840 (DF)
(ttl 64, id 54537, len 60)
|
Приведенная строка интерпретируется следующим образом:
- Контрольная сумма заголовка верная ([tcp sum ok])
- Установлен флаг SYN (отметка S).
- Количество данных, инкапсулированых в tcp-сегмент, равно 0.
- Опция масштабирования окна установлена в null.
- Максимальный размер сегмента (MSS, Maximum Segment) равен 1460. В среде Ethernet MSS = 1500 - 40 = 1460.
- Длина пакета равна 60 байтам (20 + 40) (обратитесь к вышеприведенной диаграмме)
Пример #4
Вот пример захвата пакетов при помощи tethereal
26 19.624878 localhost.localdomain -> localhost.localdomain TCP 33283 > http [FIN, ACK]
Seq=877643253 Ack=882239950 Win=37296 Len=0
|
Как можно видеть из фрагмента, вывод утилиты tethereal не сильно отличается от вывода TCPdump. В данном пакете установлены биты FIN и ACK (означает запрос на закрытие соединения). Tethereal может быть очень удобен для обнаружения сетевых аномалий при иcпользовании его в режиме с включённым внешним интерфейсом (front-end).
Заключение
Применение TCPdump в основном ориентировано на протокол TCP/IP. В этом ему нет равных. Ethereal намного более разносторонняя программа и понимает множество протоколов. Кроме того, пользовательский интерфейс ethereal очень хорошо проработан, так что даже новичок может понять что за пакет захвачен и какая информация содержится в нем. Хороший интерфейс делает процесс обучения похожим на развлечение.
Ресурсы
- Protocol RFCs
- W. Richard Stevens TCP/IP Illustrated Vol I
- Домашняя страница TCPdump
- Домашняя страница Ethereal
* На протяжении текста автор постоянно обращается к понятию "уровень" и различным названиям протокольного блока данных (PDU) на каждом из уровней. Для облегчения чтения привожу таблицу, в которой показан каждый уровень модели TCP/IP (или DoD) с указанием названия PDU для этого уровня и примером некоторых протоколов, работающих на данном уровне.
Модель TCP/IP (DoD)
+---------------------+-----------------------+--------------------+
| Уровень | Протокольный блок(PDU)| Примеры протоколов |
+---------------------+-----------------------+--------------------+
| Прикладной | | FTP, DNS |
+---------------------+-----------------------+--------------------+
| Транспортный | сегмент (segment) | TCP, UDP |
+---------------------+-----------------------+--------------------+
| Межсетевого взаимод.| дейтаграмма (datagramm)| IP, ICMP, ARP |
+---------------------+-----------------------+--------------------+
| Сетевого интерфейса | кадр (frame) | Ethernet, FDDI |
+---------------------+-----------------------+--------------------+
|
Прим.перев.
Vinayak Hegde
Моя жизнь изменилась с момента открытия для себя Linux. Внезапно компьютеры стали для меня интересны, поскольку на моем Linux я мог пробовать массу вещей. Связано это с легко доступным исходным кодом программ. Мои интересы сосредоточены в области сетей, встроенных систем и языков программирования. Сейчас я работаю в компании Aparna Web services, где мы занимаемся настройкой для учебных заведений/корпораций удаленно-загружаемых рабочих станций под управлением Linux (тонкие клиенты).