Вопрос или проблема
Мне не удается захватить уникаст трафик на интерфейсе br0 (linux bridge) с помощью команды tcpdump -nni any -vvv
. Однако широковещательный трафик захватывается как и ожидалось. Интересно, что уникаст трафик захватывается, если я открою другой терминал и запущу tcpdump -nni br0 -vvv
для захвата трафика именно на интерфейсе br0 одновременно.
Я заметил, что такое поведение наблюдается в версии tcpdump
4.9.3 (версия libpcap 1.8.1), где команда tcpdump -nni any -vvv
не захватывает уникаст трафик на br0. Однако использование версии tcpdump
4.99.5 (libpcap версия 1.10.5 с TPACKET_V3) работает правильно и захватывает уникаст трафик на br0.
Я знаю, что br0 получает весь трафик, который поступает на устройство linux bridge, также смотрите Анатомия Linux bridge.
В случаях, когда MAC-адрес назначения входящего кадра является мультикастом или широковещательным, устройство моста настроено на получение всего трафика, или адрес соответствует одному из локальных интерфейсов, клон кадра также передается вверх в локальном сетевом стеку, вызывая функцию br_pass_frame_up. Эта функция обновляет статистику устройства моста и передает входящий кадр вверх по сетевому стеку, вызывая независимую от устройства функцию netif_receive_skb.
Я подозреваю, что то, что я вижу, может быть связано с версией tcpdump
или его параметрами, но я не могу это подтвердить. Можете ли вы помочь объяснить причину этого поведения?
Согласно man tcpdump
:
“Обратите внимание, что захваты на псевдо-интерфейсе ‘any’ не будут выполняться в режимах промискуитета.”
На практике использование интерфейса ‘any’ (псевдо-) не эквивалентно указанию именованного интерфейса в качестве аргумента.
Это связано с тем, что интерфейс ‘any’ не захватывает трафик, который не используется явно локальной машиной, например, трафик, проходящий через интерфейс, который не предназначен для него.
В результате он может пропустить трафик, который в противном случае был бы захвачен в режиме промискуитета на конкретном именованном интерфейсе.
Ответ или решение
Проблема, которую вы описали, связана с тем, как различные интерфейсы обрабатываются в утилите tcpdump
, особенно при использовании псевдоинтерфейса any
по сравнению с конкретным интерфейсом, таким как br0
.
-
Промискуитетный режим: По умолчанию, при захвате данных на интерфейсе
any
,tcpdump
работает не в промискуитетном режиме. Это означает, что он захватывает только те пакеты, которые предназначены для локального хоста. Таким образом, если трафик не адресован напрямую вашему устройству (например, уникастный трафик, который идет на другой хост), он не будет захвачен. Наоборот, через интерфейсbr0
, если он работает в промискуитетном режиме,tcpdump
может захватывать весь трафик, проходящий через мост, включая пакеты, предназначенные для других устройств. -
Характеристики интерфейсов: Интерфейс
any
представляет собой агрегацию всех доступных интерфейсов на системе, но не обладает свойствами, необходимыми для захвата всех типов трафика в условиях работы моста. Когда вы запускаетеtcpdump -i br0
, захват осуществляется на уровне моста, который обрабатывает все пакеты, проходящие через него, и передает их для обработки. -
Версии tcpdump и libpcap: Как вы заметили, разная версия
tcpdump
ведет себя по-разному в этом аспекте. В версии 4.9.3 и libpcap 1.8.1 происходит ограничение по захвату трафика из-за того, что старые версии libpcap не поддерживают несколько расширенных режимов захвата, таких как TPACKET_V3. В версиях с поддержкой TPACKET_V3 (начиная с 1.10.0) происходит улучшение захвата, что позволяет захватывать больше трафика, включая уникастный, на интерфейсеbr0
, в то время какany
остается ограниченным. -
Рекомендации: Если вы хотите захватывать весь трафик на мосту, рекомендуется использовать команду
tcpdump -i br0 -vvv
. Это даст вам полный доступ к трафику, особенно к уникастным пакетам. Если вы хотите разделить нагрузку или аккумулировать данные с нескольких интерфейсов, вы можете рассмотреть возможность обновления до последних версийtcpdump
иlibpcap
, так как это значительно улучшит ваши возможности захвата.
Таким образом, лучший подход для надежного захвата всех пакетов, включая уникастный трафик, заключается в использовании интерфейса br0
, а не псевдоинтерфейса any
.