Исследование TCP/IP с помощью TCPdump и Tethereal
Автор: (C) Vinayak Hegde
Перевод: (C) Иван Песин


Кратчайший обзор 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 на любом интерфейсе, через который можно управлять сетевыми транзакциями. Чтобы увидеть ваши сетевые интерфейсы введите команду:

#ifconfig -a                            

За ней последует список сетевых интерфейсов вашей системы, включая "петлевой" [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 
<NOP,NOP,TIMESTAMP 2802054 547724602> (DF) [tos 0x10]  (ttl 38, id 28827, len 1450)

Вот информация, которую можно получить из приведенной записи

Пример #2
Этот пакет был захвачен с сетевой карты (интерфейса, обозначенного eth0)

#tcpdump -a -i 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 будет захватывать пакеты на всех доступных интерфейсах. Информация, которую мы можем получить из вышеприведенной записи:

Пример #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 <MSS 0 0,nop,wscale 2801712 1460,sackOK,timestamp> (DF)
(ttl 64, id 54537, len 60)

Приведенная строка интерпретируется следующим образом:

Пример #4
Вот пример захвата пакетов при помощи tethereal

#tethereal -i lo                

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 очень хорошо проработан, так что даже новичок может понять что за пакет захвачен и какая информация содержится в нем. Хороший интерфейс делает процесс обучения похожим на развлечение.

Ресурсы

* На протяжении текста автор постоянно обращается к понятию "уровень" и различным названиям протокольного блока данных (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 (тонкие клиенты).


Copyright © 2003, Vinayak Hegde. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003


Вернуться на главную страницу