ip maddr show 是查看内核实际加入组播组的首选命令,它直接读取 netlink 接口,准确反映 igmp/mld 协议当前生效状态,包含接口名、mac 地址、ip 组播地址及作用域,且仅显示真正加入的条目。

直接看内核实际加入的组播组,用 ip maddr show 最准——它反映的是 IGMP/MLD 协议当前生效的状态,不是配置文件里写了什么,也不是应用层“声称”自己加入了哪个组。
为什么 ip maddr show 是首选
很多用户误以为 ifconfig 或 netstat -g 能完整反映多播状态,其实它们各有局限:ifconfig 只显示接口是否标有 MULTICAST 标志,不体现具体加入哪些组;netstat -g 依赖 /proc/net/igmp(IPv4)或 /proc/net/igmp6(IPv6),但某些内核版本或容器环境可能缺失该接口,且不包含作用域、链路层地址等关键字段。ip maddr show 直接读取内核 netlink 接口,输出含接口名、MAC 地址、IP 组播地址、作用域(如 global、link-local),且默认只显示“已真正加入”的条目。
常见输出示例:
lo inet 224.0.0.1 eth0 inet 224.0.0.1 eth0 inet 239.1.1.1 eth0 inet6 ff02::1 eth0 inet6 ff02::fb
-
224.0.0.1和ff02::1是所有主机默认加入的本地子网组播组 -
239.1.1.1和ff02::fb通常由应用(如 avahi-daemon)主动加入
ip maddr show 的实用过滤技巧
查单个接口:用 ip maddr show dev eth0,避免被 lo 或其他闲置接口干扰
只看 IPv4:加 -4 参数,即 ip maddr show -4
只看 IPv6:用 -6,即 ip maddr show -6
想确认某组播地址是否真被加入:管道 grep,例如 ip maddr show | grep 239.1.1.1
注意:ip maddr show 不支持正则或模糊匹配,grep 是最轻量可靠的筛选方式。
对比 netstat -g 的适用场景与坑
netstat -g 输出结构不同,分 IPv4 和 IPv6 两块,每行含“接口名 + 组播地址 + 成员数”,但它有几个硬限制:
- 需要 root 权限才能看到完整列表(普通用户可能只看到部分或空输出)
- 在 systemd-networkd 或某些容器网络命名空间中,
/proc/net/igmp*可能为空,导致netstat -g返回空白 - 不显示 MAC 地址和作用域,无法判断是 link-local 还是 global 级别加入
- 如果某个进程退出但内核未及时清理 IGMP 成员,
netstat -g可能残留旧条目,而ip maddr show始终与内核实时状态一致
验证多播组是否真正生效的关键点
仅看到组播地址出现在 ip maddr show 输出,不代表流量一定能收进来。还需检查:
- 接口是否 UP:
ip link show eth0 | grep "state UP",DOWN 状态下即使加入组也无效 - 防火墙是否放行 IGMP 和 UDP 流量:
iptables -L INPUT -n | grep -E "(224\.|IGMP|UDP)" - 路由器是否收到 IGMP Report:用
tcpdump -i eth0 igmp看是否有 type=0x11(Membership Report)发出 - RPF 检查是否失败:跨网段接收时,
ip mroute show可查组播路由表,若为空或提示no route,说明转发路径不通
真正决定多播能否工作的,从来不是“配没配”,而是“内核有没有把组播地址挂到对应接口的链路层接收列表里”——ip maddr show 显示的就是这个最终结果,其余都是辅助验证环节。











