Встроенная в Linux или открытая программа для присоединения к группе многоадресной рассылки?
Я использую tcpdump для захвата многоадресных пакетов и мне пришлось кодировать пользовательскую программу для присоединения к многоадресным каналам, чтобы tcpdump "видел" пакеты. Просто интересно, может ли netcat или любое другое приложение выполнять эту функцию?
7 ответов
Вы можете сделать это с помощью 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
bit прослушивает пакеты в фиктивной группе и порте udp, которые не должны получать никаких данных, чтобы не допустить, что socat также выводит все данные на стандартный вывод. Если вместо этого вы хотите направить полезную нагрузку на стандартный вывод, измените эту группу и порт на фактическую группу и порт, на который вы хотите подписаться.
Несколько через запятую ip-add-membership
Директивы могут быть указаны для подписки на несколько групп одновременно. При выходе из socat, похоже, также удаляются подписки IGMP.
В дополнение к socat
Ответ, вот решение в тяжелом весе - smcroute. Это приложение работает как демон и может управляться на лету:
smcroutectl join eth0 239.1.1.27
smcroutectl leave eth0 239.1.1.27
В pimd FRR вы можете сделать:
interface vlan2000
ip address A.B.C.D/24
ip igmp
ip igmp join 239.0.110.219
ip igmp join 239.0.110.220
ip igmp version 2
Используйте часть "Receive" в https://stackoverflow.com/questions/603852/multicast-in-python, опустите определение MCAST_PORT и строку "sock.bind ..." и замените последнюю строку (печать...) с пропуском. Это дает вам программу, аналогичную примеру SOCAT, без чтения фиктивного порта.
Для будущих посетителей этой темы
Почему бы не использоватьip addr add ... autojoin
? Для меня работает следующее, чтобы присоединиться к группе многоадресной рассылки ipv4 или ipv6:
desktop:~ $ sudo ip addr add ff05:feed:dead:beef:feed:dead:beef:beef dev enp4s0 autojoin
desktop:~ $ # or for ipv4: sudo ip addr add 239.42.42.42/32 dev enp4s0 autojoin
desktop:~ $ # optional check that the address is added:
desktop:~ $ ip addr show
desktop:~ $ # to start listening:
desktop:~ $ netcat -6 -l -k -u -p 9000
На отправителе (для ipv6)
pi@blueberry:~ $ echo "Hello multicast" | netcat -w 0 -u ff05:feed:dead:beef:feed:dead:beef:beef 9000
Для этого вы можете использовать omping.
Пример: Чтобы проверить многоадресный трафик между 3 хостами - выполните одну и ту же командную строку на каждом хосте:
omping example.org example.com example.net
Omping по умолчанию использует 192.168.178.79, но вы можете указать ему использовать любой другой многоадресный адрес.
Если вы отслеживаете трафик IGMP, вы видите отчет (присоединитесь) и оставляете сообщения.
В отличие от socat omping также поддерживает IPv6, если вы хотите протестировать MLD вместо IGMP.