Я хочу написать скрипт оболочки 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
будет обрабатывать все эти данные в группе, но я просто собираюсь выбросить их.
Обратите внимание, что из-за моей конкретной среды я не рекомендовал переводить интерфейс в беспорядочный режим. На самом деле это может быть запрещено.
источник
-p
флаг, в стандартных версиях ТСРйитра, получается смешанным режим выключен , так как это по умолчанию. В смешанном режиме он должен видеть весь трафик, включая многоадресный трафик, независимо от того, установлена ли у вас подписка - если вы не находитесь в коммутируемой сети и необходимо, чтобы подписка была установлена, чтобы коммутатор перенаправлял вам трафик.mdump
запуском в другую консоль)tcpdump
ничего не видит.Ответы:
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:
Вариант 2:
Первый вариант потребует либо root, либо, по крайней мере, возможность
CAP_NET_ADMIN
. Второй вариант не требует root, но также предполагает запуск на переднем плане и, следовательно, может быть менее благоприятным для сценариев (хотя отслеживание идентификатора дочернего процесса и очистка его с помощьюtrap
BASH может быть именно тем, что вам нужно.Как только это будет сделано (но прежде чем идти орехи тестирования нашего
tcpdump
/tshark
команды) , убедитесь , что ядро распознает интерфейс, вступив в соответствующую группу IGMP. Если вы чувствуете себя супер фантазией, вы можете сходить с ума, разбирая гекс/proc/net/igmp
, но я бы посоветовал просто бежатьnetstat -gn
.Убедившись, что вы видите интерфейс, подписанный на правильную группу, запустите команду tcpdump:
В качестве альтернативы, если вы не хотите полностью идти по пути tcpdump (или наткнулись на этот ответ, и вам просто интересно увидеть многоадресную рассылку в действии), вы можете использовать
socat
команду выше, чтобы присоединиться и повторить содержимоеSTDOUT
, заменив/dev/null
наSTDOUT
:Затем с другого компьютера используйте одну из следующих двух опций для отправки простых тестовых данных:
Опция 1:
Вариант 2:
Когда вы запустите любую из этих команд, она будет интерактивно ожидать ввода. Просто введите некоторые вещи, нажмите Enter, чтобы отправить, а затем,
CTRL+D
когда вы закончите, чтобы отправитьEOF
сообщение.К этому моменту вы должны были увидеть тест до конца и с помощью нескольких команд создать худшую, самую небезопасную систему чата в мире.
источник