Програма tcpdump використовується як сніфер – мережний аналізатор, який може використовуватись для налагодження мережних додатків та пошуку несправностей у мережі. Традиційно мережний аналізатор — це дорогий спеціалізований пристрій, але сучасні комп’ютери у змозі виконувати їхні функції в межах окремого процесу. Сніфери відіграють також роль засобів дослідження в мережі — динаміки та взаємодії в мережі. Програма tcpdump працює на канальному рівні і складається з двох компонент: перша працює в ядрі, перехоплює та фільтрує пакети, а друга — діє в адресному просторі користувача й визначає інтерфейс користувача, а також форматує й фільтрує пакети, якщо це не робить ядро.
Користувацька компонента tcpdump взаємодіє з компонентою в ядрі за допомогою бібліотеки libcap (бібліотека для перехоплення пакетів). У системах BSD libcap взаємодіє з пакетним фільтром BPF-BSD packet filter, який аналізує кожний пакет, який проходить повз канальний рівень, і зіставляє його параметри з опціями, заданими користувачем для цього фільтру. Якщо пакет задовольняє критерієві фільтрування, його копія розміщується у виокремленому ядром буфері, який асоціюється з даним фільтром. Коли буфер заповнюється або закінчується заданий користувачем тайм-аут, вміст буфера передається додаткові за допомогою libcap. На рис. 2.6 зазначено, як tсpdump читає неопрацьовані пакети за допомогою BPF, а праворуч, для порівняння, подано ще один додаток, який читає дані із стека TCP/IP, як за звичай. BPF перехоплює пакети на рівні драйверу пристрою, тобто відразу після їхнього зчитування з хосту, на відміну від читання з простого сокету, де можна отримати лише IP-дейтаграми, вже опрацьовані рівнем IP та передані безпосередньо додаткові, оминаючи транспортний рівень (TCP або UDP).
Для використання tсpdump треба отримати дозвіл, за умовчанням tсpdump конфігурується з повноваженнями суперкористувача root. Можна також зробити tсpdump setuid-програмою. Можна викликати tсpdump взагалі без параметрів, тоді вона перехоплюватиме всі мережні пакети та виводитиме інформацію про них. Але краще зазначити певні потрібні атрибути фільтра:
▬ протокол;
▬ хост відправляння та/або призначення;
▬ мережа відправляння та/або призначення;
▬ Ethernet-адресу відправляння та/або призначення;
▬ порти призначення та/або відправляння;
▬ розмір пакета;
▬ пакети, передавані на всю локальну мережу чи то на групу (у Ethernet та у IP);
▬ пакет, використовуваний як шлюз по зазначеним хостом.
Можна також перевірити конкретні біти чи байти у заголовках протоколів. Наприклад, аби добирати лише TCP-сегменти, в яких встановлено біт терміновості, слід використовувати фільтр: tcp [13] & 16, тому що четвертий біт чотирнадцятого байта заголовка TCP — біт терміновості. Фільтр
icmp and not src net localnet
відфільтровує ICMP-пакети, що вони надходять із зовнішньої мережі.
Рисунок 2.6 — Перехоплювання пакетів за допомогою BPF
Інформація, надавана tcpdump, залежить від протоколу. На рис. 2.7 подано трасування сеансу за протоколом SMTP (простий протокол електронної пошти). У першому терміналі (bsd) надсилається електронний лист користувачеві з адресою в домені gte.net, тобто user@gte.net.
Рядки 1...4 описують пошук адреси SMTP-серверу, який обслуговує домен gte.net. У рядку 1 клієнт bsd запитує у серверу імен свого сервіс-провайдера (ns1.ix.netcom.com) ім’я чи імена поштового серверу gte.net. У першому полі знаходиться перший штамп пакета (12:54:32.920881). Оскільки таймер на машині bsd має дозвіл 1мкс, то зазначено шість десяткових знаків. Пакет вийшов з порту 1067 на bsd до порту 53 (domain) на машині nsl. Далі виводиться інформація щодо даних в пакеті. Перше поле (45801) — номер запиту, використовуваний функціями дозволу імен на bsd для зіставляння відповідей та запитів. Знак “+”означає, що функція дозволу задає опитування DNS-сервером інших серверів, якщо в нього не має інформації. Рядок “MX?” показує, що це запит про запис поштового обміну для мережі, ім’я якої стоїть у наступному полі (gte.net) а (25) — це довжина запиту — 25 байтів. Рядок 2 — це відповідь на запит у рядку 1. Число 45801 — номер запиту, до якого належить відповідь. Наступні три поля — кількість записів у відповіді, записів від серверу імен тощо. “371”вказує на кількість байтів у відповіді. “DF” означає, що в IP-заголовку було встановлено біт “Don’t fragment” (не фрагментувати). Перші два рядки ілюструють використання системи DNS для пошуку опрацьовувачів пошти.
1 12:54:32.920881 bsd.1067 > nsl.ix.netcom.com.domain:
45801+ MX? gte.net
2 12:54:33.254981 nsl.ix.netcom.com.domain > bsd.1067:
45801 5/4/9 (371) (DF)
3 12:54:33.256127 bsd.1068 > nsl.ix.netcom.com.domain:
45802+ A? mtapop2.gte.net (33)
4 12:54:33.534962 nsl.ix.netcom.com.domain > bsd.1068:
45802 1/4/4 (202) (DF)
5 12:54:33.535737 bsd.1059 > mtapop2.gte.net.smtp:
S 585494507:585494507 (0) win 16384
<mss 1460,nop,wscale 0,nop,nop,
timestamp 6112 0> (DF)
6 12:54:33.784963 mtapop2.gte.net.smtp > bsd.1059
S 1257159392:1257159392 (0) ack 585494509 win 49152
<mss 1460,nop,wscale 0,nop,nop,
timestamp 7853753 6112> (DF)
7 12:54:33.785012 bsd.1059 > mtapop2.gte.net.smtp:
. ack 1 win 17376 <nop,nop,
timestamp 6112 > 7853753 (DF)
8 12:54:33.235066 mtapop2.gte.net.smtp > bsd.1059
P 1:109(108) ack 1 win 49152
<nop,nop,timestamp 7853754 6112> (DF)
9 12:54:33.235277 bsd.1059 > mtapop2.gte.net.smtp:
P 1:19(18) ack 109 win 17376
<nop,nop,timestamp 6113 7853754> (DF)
14 строк опущено
24 12:54:33.675105 bsd.1059 > mtapop2.gte.net.smtp:
P 663:663(0) ack 486 win 17376
<nop,nop,timestamp 6118 7853758> (DF)
25 12:54:33.685080 mtapop2.gte.net.smtp > bsd.1059
F 486:486(0) ack 663 win 49152
<nop,nop,timestamp 7853758 6117> (DF)
26 12:54:33.685126 bsd.1059 > mtapop2.gte.net.smtp:
. ack 487 win 17376
<nop,nop,timestamp 6118 7853758> (DF)
27 12:54:33.934985 mtapop2.gte.net.smtp > bsd.1059
F 486:486(0) ack 664 win 49152
<nop,nop,timestamp 7853759 6118> (DF)
28 12:54:33.935020 bsd.1059 > mtapop2.gte.net.smtp:
. ack 487 win 17376
<nop,nop,timestamp 6118 7853759> (DF)
Рисунок 2.7 — Трасування SMTP-сеансу з вмиканням обміну
за протоколами DNS та TСP
У двох наступних рядках йде пошук IP-адреси опрацьовувача пошти мережі gte.net. “A” у рядку 3 зазначає, що це запит IP-адреси хосту mtapop2.gte.net. — одного з відомих поштових серверів у США. Рядки 5…28 вміщують деталі обміну за протоколом SMTP. Процедура трибічного квітування розпочинається в рядку 5 і завершується в рядку 7. Перше поле після часового штампу та імен хостів — це поле flags. “S” у рядку 5 зазначає, що у сегменті встановлено прапорця SYN. Інші можливі значення прапорця: “F” (FIN),”U” (URG), “P” (PUSH), “R” (RST) та “.” (немає прапорців). Далі йдуть порядкові номери першого та останнього байтів, а за ними в дужках — кількість байтів даних. Перше число — порядковий номер першого байта в сегменті (SYN або інформаційному), а друге — порядковий номер першого байту плюс кількість байтів у сегменті. За умовчанням подані реальні порядкові номери для SYN-сегментів та зміщення — для наступних сегментів.
У всіх сегментах, окрім першого SYN, є поле АСК, яке зазначає, на який наступний порядковий номер очікує відправляч. Це поле (у вигляді ack nnn) за умовчанням вміщує зміщення відносно порядкового номера, зазначеного в сегменті SYN.
За полем АСК йде поле Window — кількість байтів даних, які готовий прийняти віддалений хост. Зазвичай воно відбиває обсяг вільної пам’яті в буферах з’єднання.
У кутових дужках зазначено опції ТСР. У рядках 8...23 подано діалог поміж програмою senmail на клієнтському боці bsd та SMTP-сервером на машині mtapop2. Рядки 24...28 відбивають процедуру розривання з’єднання. Спочатку bsd надсилає FIN у рядку 24, потім надходить FIN від mtapop2 (рядок 25). У рядку 27 mtapop2 вдруге надсилає FIN, тому що не отримав від bsd підтвердження АСК на свій перший FIN.
Один з недоліків tсpdump — неповна підтримка виведення даних. Часто під час налаштовування мережних додатків треба знати, які дані надсилаються. Цю інформацію можна отримати, задавши опції -s та -x. Опція -s зазначає, скільки даних з пакета треба виводити, а –x — вказує на шістнадцяткову форму виведення даних. За умовчанням tcpdump виводить лише перші 68 байтів, що є достатнім для заголовків більшості протоколів.
Програма tсpdump — це незамінний інструмент для аналізування того, що відбувається у мережі. Якщо знати, що насправді надсилається чи то приймається, значно легше вдається віднайти й виправити помилки у додатках.