Berkeley Packet Filters (BPF)

WiresharkBeginner
Практиковаться сейчас

Введение

Добро пожаловать в лабораторную работу по Berkeley Packet Filters (BPF)!

Представьте, что вы пытаетесь расслышать один конкретный разговор на переполненном, шумном стадионе. Именно так выглядит анализ «сырого» сетевого трафика. Загруженный сервер может обрабатывать тысячи пакетов каждую секунду. Чтобы найти нужные данные, вам требуется высокоточное «сито».

Здесь на помощь приходят Berkeley Packet Filters (BPF). BPF — это глубоко интегрированная и высокоэффективная технология, позволяющая настраивать правила (подобно специализированной рыболовной сети), чтобы улавливать только тот сетевой трафик, который вас интересует, позволяя остальному проходить мимо.

Важно понимать, что фильтрация — это не просто удобство. Это способ снизить уровень шума до того, как он станет проблемой. Без фильтров анализ пакетов быстро превращается в информационную перегрузку. С их помощью вы можете превратить огромный хаотичный поток в конкретный запрос, например: «покажи мне трафик от этого хоста» или «покажи только веб-запросы к этому порту». Эта возможность — одна из главных причин, почему tcpdump остается незаменимым инструментом даже в крупных производственных средах.

В этой лабораторной работе вы будете использовать tcpdump для практики написания правил BPF. Вы научитесь фильтровать хаотичный сетевой поток по конкретным IP-адресам, контролировать направление трафика (отправка или получение) и нацеливаться на определенные порты приложений. К концу работы вы будете знать, как комбинировать эти правила для хирургически точного извлечения нужных событий.

Фильтрация по IP-адресу (хост/сеть)

Самый простой способ фильтрации трафика — сосредоточиться на конкретной машине, идентифицируемой по IP-адресу. Когда вы запускаете tcpdump без фильтров, он без разбора захватывает каждый пакет, который видит. Чтобы указать ему игнорировать всё, кроме трафика, связанного с определенной машиной, используйте ключевое слово host, за которым следует IP-адрес.

Это подходящий момент, чтобы разделить два понятия, которые новички часто путают: интерфейс — это место, где вы «слушаете», а IP-фильтр описывает, какие именно разговоры из этой точки прослушивания вас интересуют. Другими словами, -i lo определяет, где установлен ваш «микрофон», а host 127.0.0.1 определяет, какой именно собеседник в комнате вам нужен.

Чтобы у нас был трафик для наблюдения, в вашей среде уже запущен фоновый скрипт. Он непрерывно отправляет данные на вашу локальную машину, которая всегда имеет внутренний IP-адрес 127.0.0.1 (также известный как localhost).

Давайте захватим 5 пакетов, связанных с этим локальным хостом. Мы будем использовать -i lo для прослушивания локального интерфейса обратной связи (loopback) и -c 5 для автоматической остановки.

Выполните следующую команду в терминале:

sudo tcpdump -i lo -c 5 host 127.0.0.1

На экране отобразится вывод, похожий на этот:

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:15:32.123456 IP localhost.45678 > localhost.http-alt: Flags [S], seq 123456789, win 65495, options [mss 65495,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0
10:15:32.123489 IP localhost.http-alt > localhost.45678: Flags [S.], seq 987654321, ack 123456790, win 65483, options [mss 65495,sackOK,TS val 123456 ecr 123456,nop,wscale 7], length 0
10:15:32.124000 IP localhost > localhost: ICMP echo request, id 1234, seq 1, length 64
...
5 packets captured

Обратите внимание, что в каждом перечисленном пакете присутствует localhost (дружественное имя для 127.0.0.1). Фильтр host работает очень широко: он захватывает пакет независимо от того, отправил ли указанный IP-адрес данные или получил их.

Если вам когда-нибудь понадобится отслеживать целую группу компьютеров, а не один, вы можете заменить ключевое слово host на net (например, net 192.168.1.0/24). Пока что мы ограничимся изучением нашего единственного хоста.

Фильтрация по направлению (источник/назначение)

Знать, что конкретный компьютер участвует в разговоре, полезно, но иногда требуется большая точность. Представьте почтовое отделение: вы можете захотеть просматривать только те письма, которые человек отправляет, полностью игнорируя те, что он получает.

Направление имеет значение, потому что отправляемый и получаемый трафик часто отвечают на разные вопросы расследования. Исходящий трафик может показать, с кем пытается связаться хост, что полезно при поиске вредоносных соединений или утечек данных. Входящий трафик может показать, какие службы подвергаются воздействию, что полезно при расследовании сканирований или атак на сервер.

BPF предоставляет модификаторы src (источник) и dst (назначение), чтобы задать точное направление трафика.

Давайте уточним наш фильтр, чтобы захватывать только те пакеты, которые исходят от 127.0.0.1. Объединив модификатор src с нашим предыдущим ключевым словом host, мы точно укажем tcpdump, что именно искать.

Выполните следующую команду:

sudo tcpdump -i lo -c 3 src host 127.0.0.1

Небольшой совет: запись src 127.0.0.1 тоже сработает, так как слово host подразумевается, но написание src host считается лучшей практикой, так как делает команду невероятно легкой для чтения.

Ваш вывод будет выглядеть так:

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:20:15.555111 IP localhost.54321 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 234567 ecr 234567], length 84
10:20:15.555888 IP localhost.http-alt > localhost.54321: Flags [.], ack 85, win 512, options [nop,nop,TS val 234568 ecr 234567], length 0
10:20:16.111222 IP localhost > localhost: ICMP echo request, id 5678, seq 1, length 64
3 packets captured

Если внимательно посмотреть на вывод, первая часть описания пакета (секция перед символом >) представляет отправителя (источник). Поскольку мы ведем захват на внутреннем интерфейсе обратной связи, с обеих сторон указан localhost, но в реальном сценарии, охватывающем несколько компьютеров, src гарантирует, что вы просматриваете только исходящий трафик с конкретного адреса.

И наоборот, если вы хотите выступить в роли получателя и наблюдать только за входящим трафиком, поступающим на машину, вы просто используете dst host 127.0.0.1.

Фильтрация по порту и протоколу

Фильтрация по IP-адресам позволяет нам найти нужную машину, но современные серверы выполняют множество задач одновременно. Один сервер может одновременно работать как веб-сервер, почтовый сервер и точка безопасного доступа. Эти различные службы разделены с помощью пронумерованных «дверей», называемых портами.

Порты — это не физические разъемы. Это логические номера, используемые операционной системой для разделения множества одновременных разговоров. Именно поэтому «один и тот же хост» не обязательно означает «одно и то же приложение». Одна машина может участвовать во многих несвязанных сетевых действиях, и фильтрация по портам помогает изолировать именно ту службу, которую вы хотите изучить.

Например, обычный веб-трафик почти всегда проходит через порт 80. Чтобы сфокусироваться на конкретной службе и игнорировать остальное, мы используем ключевое слово port.

Наш фоновый скрипт тихо генерирует веб-трафик на порту 8080. Давайте настроим tcpdump на захват только тех данных, которые проходят через эту конкретную «дверь».

Выполните следующую команду:

sudo tcpdump -i lo -c 4 port 8080

Пример вывода:

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:25:10.123456 IP localhost.34567 > localhost.http-alt: Flags [S], seq 1122334455, win 65495, options [mss 65495,sackOK,TS val 345678 ecr 0,nop,wscale 7], length 0
10:25:10.123489 IP localhost.http-alt > localhost.34567: Flags [S.], seq 5544332211, ack 1122334456, win 65483, options [mss 65495,sackOK,TS val 345678 ecr 345678,nop,wscale 7], length 0
10:25:10.123501 IP localhost.34567 > localhost.http-alt: Flags [.], ack 1, win 512, options [nop,nop,TS val 345678 ecr 345678], length 0
10:25:10.124111 IP localhost.34567 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 345679 ecr 345678], length 84
4 packets captured

Возможно, вы помните из предыдущих шагов, что в сети присутствовали пакеты ICMP (ping). Однако в этом выводе их нет. Фильтр port 8080 успешно проигнорировал весь посторонний шум, предоставив чистый обзор только веб-службы.

Помимо портов, вы также можете фильтровать по широким сетевым протоколам, просто указав их название, используя ключевые слова tcp, udp или icmp. Давайте проверим это, захватив только пакеты ICMP (ping) и эффективно проигнорировав активный веб-трафик.

Выполните эту команду:

sudo tcpdump -i lo -c 2 icmp

Пример вывода:

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:28:05.999111 IP localhost > localhost: ICMP echo request, id 9012, seq 1, length 64
10:28:05.999133 IP localhost > localhost: ICMP echo reply, id 9012, seq 1, length 64
2 packets captured

Использование ключевых слов port и протоколов позволяет вам отсечь шум и сосредоточиться именно на том приложении, которое вы исследуете.

Комбинирование фильтров с помощью логики (AND/OR)

Чтобы по-настоящему овладеть Berkeley Packet Filters, мы должны научиться объединять несколько правил вместе. Реальные расследования редко бывают простыми; часто требуется определить очень специфические сценарии.

Здесь BPF начинает казаться не просто списком ключевых слов, а небольшим языком запросов для пакетов. Вы описываете нужный трафик структурированным, логическим способом. Позже в курсе этот образ мышления проявится во многих инструментах: поисковые запросы SIEM, правила обнаружения вторжений и даже журналы запросов в стиле баз данных — всё это опирается на привычку сужать широкий набор данных до точного условия.

BPF позволяет связывать условия с помощью стандартных логических операторов:

  • and (оба правила должны быть истинными)
  • or (хотя бы одно правило должно быть истинным)
  • not (правило должно быть явно ложным)

Важный совет: при использовании таких логических операторов в терминале Linux очень полезно заключать всё выражение BPF в кавычки (например, "port 80 and tcp"). Это гарантирует, что оболочка Linux случайно не перепутает ваши команды фильтрации с системными командами.

Давайте попробуем. Мы хотим захватить трафик, который строго использует протокол TCP и активно направляется к порту назначения 8080.

Выполните следующую команду:

sudo tcpdump -i lo -c 4 "tcp and dst port 8080"

Пример вывода:

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:32:15.111222 IP localhost.45678 > localhost.http-alt: Flags [S], seq 2233445566, win 65495, options [mss 65495,sackOK,TS val 456789 ecr 0,nop,wscale 7], length 0
10:32:15.111255 IP localhost.45678 > localhost.http-alt: Flags [.], ack 3344556678, win 512, options [nop,nop,TS val 456789 ecr 456789], length 0
...
4 packets captured

В этом специализированном результате localhost.http-alt всегда появляется только с правой стороны стрелки >, что доказывает, что мы захватили только пакеты, предназначенные для этого конкретного порта.

Наконец, давайте рассмотрим оператор not. Он невероятно полезен для отсеивания «известного шума», чтобы вы могли сосредоточиться на неизвестном. Представьте, что мы хотим отслеживать весь трафик на интерфейсе обратной связи, кроме нашего шумного веб-трафика на порту 8080.

Выполните эту команду:

sudo tcpdump -i lo -c 2 "not port 8080"

Пример вывода:

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:35:22.333444 IP localhost > localhost: ICMP echo request, id 3456, seq 1, length 64
10:35:22.333466 IP localhost > localhost: ICMP echo reply, id 3456, seq 1, length 64
2 packets captured

Поскольку мы явно приказали tcpdump исключить порт 8080 из результатов, он спокойно захватил фоновые ICMP-пакеты. Стратегически комбинируя and, or и not, вы можете создать невероятно точную «линзу», чтобы видеть в сети именно то, что вам нужно.

Резюме

Поздравляем! Вы успешно сделали шаг в мир продвинутой фильтрации пакетов.

Вы научились просеивать хаотичный сетевой поток, чтобы находить именно то, что вам нужно. Вы практиковались в нацеливании на конкретные компьютеры с помощью ключевого слова host и контролировали направление потока с помощью src и dst. Вы изолировали конкретные приложения, фильтруя по определенному port и протоколу. Самое главное, вы узнали, как объединять все эти элементы вместе с помощью логических операторов (and, or, not) для создания хирургически точных поисковых запросов.

Эти навыки незаменимы. Будь вы системным администратором, выслеживающим подозрительное соединение, или аналитиком безопасности, отслеживающим сложную атаку, освоение Berkeley Packet Filters гарантирует, что вы больше никогда не будете перегружены сетевым шумом. Продолжайте экспериментировать с различными комбинациями!