Введение
В этой лабораторной работе вы изучите основы анализа сетевого трафика в системе Linux с использованием мощного инструмента командной строки tcpdump. Основная цель — захват и проверка Ethernet-кадров на канальном уровне, что даст практический опыт понимания структуры данных для передачи по локальной сети. Вы приобретете практические навыки в идентификации и интерпретации низкоуровневых сетевых коммуникаций.
Вы начнете с подготовки вашей среды, которая включает установку tcpdump и определение вашего активного сетевого интерфейса. Затем вы инициируете захват пакетов в реальном времени для мониторинга сетевой активности. Чтобы понять различные шаблоны связи, вы сгенерируете как одноадресный (unicast) трафик с помощью команды ping, так и широковещательный (broadcast) трафик через ARP. Изучая захваченный вывод, вы научитесь анализировать заголовки Ethernet-кадров и различать одноадресные и широковещательные MAC-адреса.
Установка tcpdump и определение сетевого интерфейса
На этом этапе вы подготовите свою среду для сетевого анализа. Это включает два ключевых действия: установку tcpdump, мощного сниффера пакетов командной строки, и определение имени вашего основного сетевого интерфейса. Сниффер пакетов позволяет "видеть" данные, передаваемые по сети, а tcpdump должен знать, какое конкретное сетевое соединение отслеживать.
Сначала убедимся, что tcpdump установлен. Хотя это стандартный инструмент, хорошей практикой является подтверждение его наличия. Мы будем использовать менеджер пакетов apt. Команда sudo apt update синхронизирует ваш список пакетов с репозиториями программного обеспечения, а sudo apt install tcpdump -y устанавливает инструмент, где -y автоматически подтверждает установку.
Выполните следующие команды в вашем терминале:
sudo apt update
sudo apt install tcpdump -y
После завершения установки вы можете проверить ее, проверив версию tcpdump.
tcpdump --version
Вы должны увидеть вывод, похожий на этот, подтверждающий, что инструмент готов к использованию. Номера версий могут отличаться.
tcpdump version 4.99.x
libpcap version 1.10.x
OpenSSL 3.0.x [Date]
Далее вам нужно найти имя сетевого интерфейса, который вы будете отслеживать. Компьютер может иметь несколько интерфейсов (например, для проводной Ethernet, Wi-Fi или виртуальных сетей). Мы будем использовать команду ip addr для вывода списка всех доступных сетевых интерфейсов и их конфигураций.
Выполните эту команду:
ip addr
Вывод покажет несколько интерфейсов. Вам нужно найти ваш основной активный интерфейс. Он часто называется eth0 или enp0s3. Ищите запись, которая имеет адрес inet (ваш IP-адрес) и находится в состоянии UP.
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:01:be:b3 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 172.16.50.8/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
valid_lft 1892159786sec preferred_lft 1892159786sec
inet6 fe80::216:3eff:fe01:beb3/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:8a:88:cd:da brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
В приведенном выше примере имя интерфейса — eth0. Запишите имя вашего конкретного интерфейса, так как оно понадобится вам на следующем шаге.
Запуск широкополосного захвата и наблюдение за трафиком
На этом этапе вы начнете захват сетевого трафика в реальном времени. Основной единицей данных на канальном уровне (Уровень 2) является Ethernet-кадр. Каждый кадр действует как цифровой конверт, содержащий не только отправляемые данные, но и важную адресную информацию, такую как исходный и конечный MAC-адреса. Мы будем использовать tcpdump с опцией -e для явного просмотра этих деталей Уровня 2. Этот первоначальный захват будет нефильтрованным, чтобы дать вам представление обо всей активности в вашей сети.
Теперь давайте начнем процесс захвата. Вам понадобится имя интерфейса, которое вы определили на предыдущем шаге (например, eth0). Захват сетевых пакетов требует административных привилегий, поэтому мы используем sudo. Мы также добавим флаг -n, чтобы tcpdump не преобразовывал IP-адреса в имена хостов, и -q для более чистого вывода.
В вашем терминале выполните команду tcpdump. Не забудьте заменить eth0 на фактическое имя вашего интерфейса.
## Замените eth0 на фактическое имя вашего интерфейса из Шага 1
sudo tcpdump -i eth0 -e -n -q
Разберем эту команду:
sudo: Выполняет команду с правами суперпользователя, которые необходимы для доступа к сетевым интерфейсам таким образом.tcpdump: Сам инструмент захвата пакетов.-i eth0: Флаг-iуказывает сетевой iнтерфейс для прослушивания.-e: Эта опция имеет решающее значение для нашей лабораторной работы. Она указываетtcpdumpвыводить заголовок канального уровня (Ethernet) для каждого пакета, который включает исходный и конечный MAC-адреса.-n: Предотвращает разрешение имен хостов, отображая необработанные IP-адреса.-q: Режим "тихий" (quiet), который уменьшает объем специфичного для протокола вывода.
После выполнения команды tcpdump начнет прослушивание. Вы увидите начальное сообщение, а затем ваш терминал начнет отображать любые захваченные пакеты. В зависимости от вашей сети вы можете увидеть много трафика, который не имеет отношения к тому, что мы хотим сделать. Это может включать ARP-запросы, фоновые службы и т. д.
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:00.123456 ARP, Request who-has 172.16.50.1 tell 172.16.50.254, length 28
10:24:01.567890 IP6 fe80::... > ff02::...: ICMP6, router advertisement, length 80
Дайте команде поработать несколько секунд, чтобы понаблюдать за активностью, затем остановите захват, нажав Ctrl+C. Это демонстрирует сложность поиска конкретной информации в загруженной среде.
Уточнение захвата с помощью фильтра ICMP
Как вы видели на предыдущем шаге, нефильтрованный захват может быть "шумным". Чтобы сосредоточиться на конкретном трафике, который мы хотим проанализировать, мы можем использовать фильтр захвата. Поскольку мы будем использовать команду ping, которая использует протокол ICMP, мы скажем tcpdump только захватывать ICMP-пакеты. Мы также добавим флаг -n, чтобы tcpdump не преобразовывал IP-адреса в имена хостов, и -q, чтобы сделать вывод более чистым. Это значительно упрощает анализ вывода.
Теперь снова запустите tcpdump, но на этот раз добавьте фильтр icmp и новые флаги.
## Замените eth0 на фактическое имя вашего интерфейса из Шага 1
sudo tcpdump -i eth0 -e -n -q 'icmp'
Часть 'icmp' команды — это фильтр. Она инструктирует tcpdump игнорировать все пакеты, кроме тех, которые используют протокол ICMP.
После выполнения этой команды tcpdump снова начнет прослушивание, но терминал теперь должен быть тихим, так как он ожидает именно ICMP-трафик.
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
Важно: Оставьте этот терминал запущенным! tcpdump должен оставаться активным для захвата трафика, который мы сгенерируем на следующем шаге. Вам нужно будет открыть новую вкладку или окно терминала для последующих команд. Вы можете сделать это, нажав значок + на панели терминала.
Генерация одноадресного трафика с помощью 'ping' и анализ заголовков кадров
На этом шаге вы будете генерировать и наблюдать одноадресный (unicast) трафик. Одноадресная передача — это метод связи "один к одному", при котором кадр отправляется от одного источника к одному получателю в сети. Для этого вы будете использовать распространенную утилиту ping, которая отправляет пакеты ICMP (Internet Control Message Protocol) на целевой хост для проверки подключения. Эти пакеты инкапсулируются в Ethernet-кадры для передачи.
Пока tcpdump (с фильтром icmp) продолжает работать в вашем первом терминале, вам нужно сгенерировать некоторую сетевую активность.
Откройте новый терминал, нажав значок + на панели терминала. В этом новом терминале используйте команду ping для отправки нескольких пакетов на google.com. Мы будем использовать опцию -c 4, чтобы отправить ровно четыре пакета, а затем остановиться.
ping -c 4 google.com
Во втором терминале вы увидите вывод, похожий на этот, показывающий ответы от сервера Google:
PING google.com (142.250.191.174) 56(84) bytes of data.
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=1 ttl=115 time=1.58 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=2 ttl=115 time=1.55 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=3 ttl=115 time=1.62 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=4 ttl=115 time=1.51 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.510/1.565/1.621/0.040 ms
Теперь вернитесь в первый терминал, где запущен tcpdump. Вы увидите несколько новых строк вывода, которые были захвачены во время выполнения команды ping.
Давайте проанализируем один из исходящих пакетов "echo request". Он будет выглядеть примерно так (MAC-адреса и IP-адреса будут отличаться в вашей системе):
10:25:01.123456 00:16:3e:01:be:b3 > de:ad:be:ef:00:01, ethertype IPv4 (0x0800), length 98: 172.16.50.8 > 142.250.191.174: ICMP echo request, id 123, seq 1, length 64
Вот что означает эта строка:
10:25:01.123456: Временная метка момента захвата кадра.00:16:3e:01:be:b3: Исходный MAC-адрес (MAC вашей виртуальной машины).>: Разделитель, указывающий направление трафика (от источника к получателю).de:ad:be:ef:00:01: MAC-адрес назначения. Обратите внимание, что это, скорее всего, шлюз (маршрутизатор) вашей локальной сети, а не сервер Google. Ваша виртуальная машина отправляет кадр на шлюз, который затем перенаправляет его в Интернет.ethertype IPv4: Это поле указывает, что полезная нагрузка Ethernet-кадра является IP-пакетом версии 4.172.16.50.8 > 142.250.191.174: Это информация Уровня 3 (IP), показывающая исходный и конечный IP-адреса.ICMP echo request: Это идентифицирует пакет как часть запросаping.
Вы также увидите соответствующие ответные пакеты "echo reply". Обратите внимание, как исходный и конечный MAC-адреса поменялись местами.
Наконец, вернитесь в терминал tcpdump и нажмите Ctrl+C, чтобы остановить захват.
Генерация широковещательного трафика через ARP и идентификация широковещательного MAC-адреса
На этом шаге вы сравните одноадресный трафик с широковещательным (broadcast) трафиком. В то время как одноадресная передача — это сообщение "один к одному", широковещательная передача — это сообщение "один ко всем", отправляемое каждому устройству в сегменте локальной сети. Основным примером этого является протокол разрешения адресов (ARP), который используется для обнаружения MAC-адреса, связанного с определенным IP-адресом. Для этого устройство отправляет широковещательный кадр с вопросом: "У кого есть этот IP-адрес?".
Сначала запустим новый захват tcpdump. На этот раз мы добавим фильтр, чтобы отображать только ARP-пакеты. Мы также будем использовать флаг -n, чтобы tcpdump не преобразовывал IP-адреса в имена хостов, и -q, чтобы сделать вывод более чистым.
В терминале выполните следующую команду, не забыв заменить eth0 на имя вашего интерфейса из Шага 1.
## Замените eth0 на фактическое имя вашего интерфейса
sudo tcpdump -i eth0 -e -n -q 'arp'
tcpdump теперь прослушивает, но только ARP-трафик.
Далее нам нужно инициировать ARP-запрос. Надежный способ сделать это — очистить ARP-кэш вашей системы, а затем попытаться связаться с другим устройством в локальной сети, например, с вашим шлюзом (маршрутизатором). Очистка кэша заставит вашу систему повторно обнаружить MAC-адрес шлюза с помощью ARP.
Откройте новый терминал. Сначала найдите IP-адрес вашего шлюза с помощью команды ip route.
ip route | grep default
Вывод покажет ваш маршрут по умолчанию, а IP-адрес, указанный после "via", является вашим шлюзом.
default via 172.16.50.1 dev eth0
Примечание: IP-адрес вашего шлюза, скорее всего, будет другим. Крайне важно использовать IP-адрес из этой команды в последующих шагах. Распространенной ошибкой является использование другого IP-адреса, такого как
172.17.0.1, который часто является шлюзом для локальной сети Docker и не даст правильного результата для этого упражнения.
В этом примере шлюзом является 172.16.50.1. Теперь очистите ваш ARP-кэш с помощью команды ip neigh flush. Это удалит известные сопоставления MAC-адресов, заставляя вашу систему снова использовать ARP для их поиска.
sudo ip -s -s neigh flush dev eth0
Вы можете увидеть вывод, подтверждающий удаление записей. Наконец, выполните ping к шлюзу один раз, чтобы инициировать ARP-запрос.
## Замените 172.16.50.1 на фактический IP-адрес вашего шлюза
ping -c 1 172.16.50.1
Теперь вернитесь в первый терминал, где запущен tcpdump. Вы увидите сгенерированный ARP-трафик. Найдите строку "Request":
10:30:01.123456 00:16:3e:01:be:b3 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: ARP, Request who-has 172.16.50.1 tell 172.16.50.8, length 28
Давайте проанализируем этот широковещательный кадр:
00:16:3e:01:be:b3: Исходный MAC-адрес (ваша виртуальная машина).ff:ff:ff:ff:ff:ff: Это специальный широковещательный MAC-адрес. Когда коммутатор видит кадр с этим адресом назначения, он перенаправляет его через все свои порты всем подключенным устройствам.ethertype ARP: Это указывает, что полезная нагрузка кадра является ARP-пакетом.ARP, Request who-has 172.16.50.1 tell 172.16.50.8: Это само ARP-сообщение, широковещательный вопрос всей сети о MAC-адресе172.16.50.1.
Вы также увидите пакет "Reply", который является одноадресным кадром, отправленным напрямую от шлюза на MAC-адрес вашей виртуальной машины.
Теперь вы можете остановить захват tcpdump, нажав Ctrl+C в его терминале.
Резюме
В этой лабораторной работе вы изучили фундаментальный процесс анализа Ethernet-кадров с помощью tcpdump в среде Linux. Вы начали с подготовки вашей системы, которая включала установку утилиты tcpdump с помощью пакетного менеджера apt и идентификацию вашего основного сетевого интерфейса с помощью команды ip addr. Затем вы научились инициировать захват пакетов, сначала выполнив незафильтрованный захват для наблюдения за всем сетевым трафиком и понимания необходимости фильтрации. После остановки первоначального захвата вы научились применять фильтр icmp с помощью команды sudo tcpdump -i eth0 -e -n -q 'icmp', чтобы сосредоточиться конкретно на трафике, который вы хотели проанализировать.
Затем лабораторная работа провела вас через генерацию и анализ двух основных типов сетевого трафика. Вы использовали команду ping для создания одноадресного трафика и проанализировали отфильтрованный вывод tcpdump, чтобы идентифицировать конкретные MAC-адреса источника и назначения в заголовках Ethernet-кадров. Впоследствии вы сгенерировали широковещательный трафик, инициировав ARP-запрос с отдельным, отфильтрованным по arp захватом, и научились распознавать отличительный широковещательный MAC-адрес ff:ff:ff:ff:ff:ff, который обозначает кадр, предназначенный для всех устройств в сегменте локальной сети.



