tcpdump – це потужний інструмент командного рядка, що використовується для аналізу мережевого трафіку. Він є визнаним стандартом у сфері захоплення та вивчення пакетів TCP/IP.
Цей інструмент може бути надзвичайно корисним під час діагностики мережевих проблем. Захоплені пакети можна зберігати у файл для подальшого аналізу. Рекомендується періодично використовувати tcpdump для моніторингу мережі.
Розбір виводу tcpdump
tcpdump дозволяє аналізувати заголовки пакетів TCP/IP. Програма виводить один рядок для кожного пакета і продовжує працювати, доки користувач не зупинить її натисканням комбінації клавіш Ctrl+C.
Розгляньмо приклад рядка виводу:
20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0
Кожен рядок містить такі дані:
- Мітка часу Unix (20:58:26.765637)
- Протокол (IP)
- IP-адреса або ім’я джерела та номер порту (10.0.0.50.80)
- IP-адреса або ім’я призначення та номер порту (10.0.0.1.53181)
- TCP Flags (Прапори [F.]). Ці прапорці показують стан підключення. Може бути кілька значень, як у прикладі [F.] для FIN-ACK. Можливі значення цього поля:
- S – SYN. Перший етап встановлення з’єднання.
- F – FIN. Закінчення з’єднання.
- . – ACK. Підтвердження успішного отримання пакета.
- P – PUSH. Вказівка одержувачу обробляти пакети без буферизації.
- R – RST. З’єднання перервано.
- Порядковий номер даних в пакеті (seq 1)
- Номер підтвердження (ack 2)
- Розмір вікна (win 453). Кількість байтів, доступних у буфері приймача. Далі йдуть параметри TCP.
- Довжина корисного навантаження даних (length 0)
Установка
У дистрибутивах Linux, що базуються на Debian, tcpdump можна встановити за допомогою APT:
# apt install tcpdump -y
У дистрибутивах на базі RPM для встановлення можна скористатися YUM:
# yum install tcpdump -y
Або DNF, якщо це RHEL 8:
# dnf install tcpdump -y
Параметри команди tcpdump
Для запуску tcpdump потрібні права адміністратора. Інструмент має численні параметри та фільтри. Запуск без параметрів дозволить перехоплювати всі пакети, що проходять через стандартний інтерфейс.
Щоб переглянути перелік доступних мережевих інтерфейсів, які tcpdump може використовувати для перехоплення пакетів, виконайте:
# tcpdump -D
Або:
# Tcpdump --list-interfaces
1.eth0 2.nflog (Linux netfilter log (NFLOG) interface) 3.nfqueue (Linux netfilter queue (NFQUEUE) interface) 4.eth1 5.any (Pseudo-device that captures on all interfaces) 6.lo [Loopback]
Це особливо корисно в системах, де немає команди для перегляду інтерфейсів.
Для захоплення пакетів через конкретний інтерфейс використовуйте прапорець -i з назвою інтерфейсу. Якщо параметр -i не вказано, tcpdump використає перший знайдений мережевий інтерфейс.
# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 1, length 64 01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 4761, seq 1, length 64 01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 2, length 64
Прапорець -v збільшує обсяг інформації, що виводиться про пакети, а -vv надає ще більше деталей.
За замовчуванням tcpdump перетворює IP-адреси на імена хостів, а також використовує назви служб замість номерів портів. Якщо DNS не працює або вам не потрібен пошук імен, використовуйте параметр -n.
# tcpdump -n
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100 04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0 04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36 04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0 04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100
Для захоплення тільки певної кількості рядків, наприклад, 5, використовуйте прапорець -c:
#tcpdump -c 5
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100 04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0 04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36 04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0 04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100 5 packets captured
Типовий вивід tcpdump містить мітки часу Unix. Щоб відобразити пакети з міткою часу, зрозумілою для людини:
# tcpdump -tttt
2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, length 36 2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0 2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 36:72, ack 1, win 37232, length 36 2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0 2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 72:108, ack 1, win 37232, length 36
Вирази фільтрів tcpdump
Вирази фільтрів визначають, які заголовки пакетів будуть показані. Якщо фільтри не використовуються, виводяться всі заголовки. Зазвичай використовуються фільтри: порт, хост, src, dst, tcp, udp, icmp.
Портовий фільтр
Для перегляду пакетів, що надходять на певний порт, використовуйте фільтр портів:
# Tcpdump -i eth1 -c 5 port 80
23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80: Flags [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0 23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971: Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0 23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80: Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0 23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972: Flags [S.E], seq 1363851389, ack 226341106, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
Фільтр хоста
Для захоплення всіх пакетів, що надходять на хост або відправляються з нього, з IP-адресою 10.0.2.15:
# tcpdump host 10.0.2.15
03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36 03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0 03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 36:72, ack 1, win 37232, length 36 03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0 03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 72:108, ack 1, win 37232, length 36
Щоб захопити пакети певного типу протоколу, наприклад, icmp, на інтерфейсі eth1:
# tcpdump -i eth1 icmp
04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 75, length 64 04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 75, length 64 04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 76, length 64 04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 76, length 64 04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 77, length 64
Комбінування виразів фільтрів
Вирази фільтрів можна поєднувати з операторами AND, OR та NOT. Це дозволяє створювати команди для точнішого виділення пакетів:
Для виведення пакетів з певної IP-адреси, призначених для певного порту:
# tcpdump -n -i eth1 src 10.0.0.1 and dst port 80
00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80: Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0 00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0 00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80: Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499: HTTP: GET / HTTP/1.1 00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174 ecr 5983566], length 0
Щоб захопити всі пакети, крім ICMP, використовуйте оператор NOT:
# tcpdump -i eth1 not icmp
Збереження заголовків пакетів у файл
Вивід tcpdump може швидко прокручуватися, тому можна зберегти заголовки пакетів у файл за допомогою прапорця -w. Файли для збереження вихідних даних використовують формат pcap та мають розширення .pcap.
PCAP означає захоплення пакетів. Наступна команда зберігає 10 рядків виводу з інтерфейсу eth1 у файл icmp.pcap.
# tcpdump -i eth1 -c 10 -w icmp.pcap
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 10 packets captured 10 packets received by filter 0 packets dropped by kernel
Щоб прочитати цей файл, скористайтеся прапорцем -r:
tcpdump -r icmp.pcap
reading from file icmp.pcap, link-type EN10MB (Ethernet) 05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 33, length 64 05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 33, length 64 05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 34, length 64 05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 34, length 64 05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 35, length 64
Перегляд деталей пакета
До цього моменту ми бачили лише заголовки пакетів. Щоб переглянути вміст пакетів, використовуйте параметр -A. Це виведе вміст пакета у форматі ASCII, що може допомогти при діагностиці мережі. Також можна використовувати прапор -X для відображення виводу у шістнадцятковому форматі. Це може бути не дуже корисним, якщо з’єднання зашифровано.
# tcpdump -c10 -i eth1 -n -A port 80
23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1 E..'[email protected]@.%. ... ..2...P..M. uE............ .6.}.Q.bGET / HTTP/1.1 Host: 10.0.0.50 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT
Висновок
tcpdump є досить гнучким інструментом. Після розуміння його вихідних даних, різних позначень та фільтрів, його можна використовувати для виявлення проблем у мережі та її захисту.