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
也可以完成任务。
不过不要相信我。为了进行测试,我们可以使用socat
或ncat
(通常通过nmap
/ 打包nmap-ncat
)生成多播UDP数据包。
在某些数量的主机上运行的一个下面的两个组合:
选项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用户,但也希望在前台运行,因此可能不利于脚本编写(尽管跟踪子进程ID并用trap
BASH 清除它可能正是您要的内容。
一旦完成(但在进行测试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
消息后输入。
此时,您应该已经看到了端到端测试,并使用一些命令构建了世界上最糟糕,最不安全的聊天系统。
-p
旗,在tcpdump的标准版本,打开混杂模式关闭,因为它是在默认情况下。在混杂模式下,无论您是否已建立订阅,它都应查看所有流量,包括多播流量-除非您位于交换网络上,并且必须建立订阅才能使交换机将流量转发给您。