Я использую tcpdump для захвата многоадресных пакетов и мне пришлось кодировать пользовательскую программу для присоединения к многоадресным каналам, чтобы tcpdump "видел" пакеты. Просто интересно, может ли netcat или любое другое приложение выполнять эту функцию?
4 ответа
Вы можете сделать это с помощью команды ip maddr add
.
СИНТАКСИС
ip maddr [ add | del ] MULTIADDR dev STRING
ОПИСАНИЕ
Он присоединяет / отсоединяет многоадресный адрес статического канального уровня для прослушивания интерфейса. Обратите внимание, что невозможно статически присоединиться к группам многоадресного протокола. Эта команда управляет только адресами канального уровня.
address LLADDRESS (default)
the link layer multicast address.
dev NAME
the device to join/leave this multicast address.
ПРИМЕРЫ
Пример для проводного соединения:
ip maddr add ff02::fb dev eth0
Пример для беспроводного соединения:
ip maddr add 224.0.0.251 dev wlan0
Можно использовать socat для подписки на группы. Это хорошо работает для подписки L2 и L3:
socat STDIO UDP4-DATAGRAM:239.101.1.68:8889,\
ip-add-membership=239.0.1.68:10.100.201.1
Это подпишется на группу 239.0.1.68
используя интерфейс с адресом 10.100.201.1
. UDP4-DATAGRAM:239.101.1.68:8889
бит прослушивает пакеты в фиктивной группе и порте udp, которые не должны получать никаких данных, чтобы не допустить, чтобы socat также выводил все на стандартный вывод. Если вместо этого вы хотите направить полезную нагрузку на стандартный вывод, измените эту группу и порт на фактическую группу и порт, на который вы хотите подписаться.
Можно указать несколько разделенных запятыми директив ip-add-membership
для одновременной подписки на несколько групп. При выходе из socat, похоже, также удаляются подписки IGMP.
В дополнение к ответу socat
, есть решение в тяжелом весе - smcroute. Это приложение работает как демон и может управляться на лету:
smcroutectl join eth0 239.1.1.27
smcroutectl leave eth0 239.1.1.27
Используйте часть "Receive" в https://stackoverflow.com/questions/603852/multicast-in-python, опустите определение MCAST_PORT и строку «sock.bind ...» и замените последнюю строку (печать. ..) с пропуском. Это дает вам программу, аналогичную примеру SOCAT, без чтения фиктивного порта.