Создание многоадресного соединения для захватов tcpdump

11

Я хочу написать скрипт оболочки Linux, который будет захватывать определенный многоадресный трафик. В частности, я хочу создать файл pcap, который имеет весь трафик для одной конкретной группы / порта многоадресной рассылки.

Вот командная строка, которую я использую для просмотра трафика:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Это работает нормально, если у меня уже есть многоадресная подписка на эту группу. Например, если я запускаю это в другой консоли:

mdump 233.54.12.234 22001 10.13.252.51

tcpdumpувидим пакеты. Если mdumpне работает, tcpdumpничего не видит.

Существует ли стандартный linux-y способ установить эти многоадресные соединения перед запуском захвата? Я мог бы использовать mdumpдля создания этих объединений, но это кажется расточительным, так как mdumpбудет обрабатывать все эти данные в группе, но я просто собираюсь выбросить их.

Обратите внимание, что из-за моей конкретной среды я не рекомендовал переводить интерфейс в беспорядочный режим. На самом деле это может быть запрещено.

Джон Диблинг
источник
1
Если вы не работаете нестандартная версию ТСРйитр, вы будете положить интерфейс в неразборчивый режим - -pфлаг, в стандартных версиях ТСРйитра, получается смешанным режим выключен , так как это по умолчанию. В смешанном режиме он должен видеть весь трафик, включая многоадресный трафик, независимо от того, установлена ​​ли у вас подписка - если вы не находитесь в коммутируемой сети и необходимо, чтобы подписка была установлена, чтобы коммутатор перенаправлял вам трафик.
1
@GuyHarris: спасибо за разъяснения. Я в коммутируемой сети. Без уже установленной подписки (т.е. с mdumpзапуском в другую консоль) tcpdumpничего не видит.
Джон Диблинг
И если они не хотят, чтобы вы работали в смешанном режиме, они, вероятно, также не хотят, чтобы вы (или даже не позволяли вам) настроить «зеркальный порт» на коммутаторе (при условии, что коммутатор даже поддерживает это), чтобы получить копии всего трафика через коммутатор (или весь трафик через определенные порты, если это возможно).
Так что же не так делать со сценарием? Имеет значение то, выполняет ли он свою работу, а не считает ли он ее «обычным способом» - что «необычного» в сценарии?
Режим Promiscious отключен, поскольку его включение, по-видимому, повлияет на другие виртуальные машины на хосте. Это нежелательно. Я могу настроить зеркальный порт на коммутаторе - это 40 Гб aristas - но я не уверен, что понимаю вашу точку зрения.
Джон Диблинг

Ответы:

5

TL; DR - Выберите один:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

socat STDIO UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 > /dev/null


Сначала я собирался сказать «просто используйте ip maddress addи покончите с этим». Проблема ip maddressкасается только групповых адресов канального уровня, а не протокольных групповых адресов ( man 8 ip-maddress).

Это сказанное использование autojoinфлага с адресным глаголом делает трюк просто приятно.

Это поднимает некоторые последующие вопросы, хотя. Я предполагаю, что так как вы будете работать tcpdumpили tsharkу вас есть права root. В случае, если у вас нет номера 22001, порт с высоким номером, и другие утилиты, как socat, также сделают это.

Не верьте мне на слово, хотя. Просто чтобы проверить это, мы можем сгенерировать многоадресные UDP-пакеты с помощью socatили ncat(обычно упакованные через nmap/ nmap-ncat).

На некотором количестве хостов запустите одну из следующих двух комбинаций:

Опция 1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

Вариант 2:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 /dev/null &

Первый вариант потребует либо root, либо, по крайней мере, возможность CAP_NET_ADMIN . Второй вариант не требует root, но также предполагает запуск на переднем плане и, следовательно, может быть менее благоприятным для сценариев (хотя отслеживание идентификатора дочернего процесса и очистка его с помощью trapBASH может быть именно тем, что вам нужно.

Как только это будет сделано (но прежде чем идти орехи тестирования нашего tcpdump/ tsharkкоманды) , убедитесь , что ядро распознает интерфейс, вступив в соответствующую группу IGMP. Если вы чувствуете себя супер фантазией, вы можете сходить с ума, разбирая гекс /proc/net/igmp, но я бы посоветовал просто бежать netstat -gn.

Убедившись, что вы видите интерфейс, подписанный на правильную группу, запустите команду tcpdump:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

В качестве альтернативы, если вы не хотите полностью идти по пути tcpdump (или наткнулись на этот ответ, и вам просто интересно увидеть многоадресную рассылку в действии), вы можете использовать socatкоманду выше, чтобы присоединиться и повторить содержимое STDOUT, заменив /dev/nullна STDOUT:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1

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

Опция 1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

Вариант 2:

ncat  -u 233.54.12.234 22001

Когда вы запустите любую из этих команд, она будет интерактивно ожидать ввода. Просто введите некоторые вещи, нажмите Enter, чтобы отправить, а затем, CTRL+Dкогда вы закончите, чтобы отправить EOFсообщение.

К этому моменту вы должны были увидеть тест до конца и с помощью нескольких команд создать худшую, самую небезопасную систему чата в мире.

Брайан Редберд
источник
1
Ух, прошло 4 года, чтобы получить ответ! Я даже больше этим не занимаюсь, и на самом деле у меня нет возможности проверить, но я все равно приму.
Джон Диблинг
1
Это пригодится прямо сейчас! : D Спасибо, Брайан :)
Quaylar