ip maddr show 是唯一直接读取内核 IGMP/MLD 组播成员表的命令,准确反映 IPv4/IPv6 实际活跃加入状态,支持按接口(dev)、排除回环(^lo)、过滤 IPv4 等精确查询,且输出含 scope、permanent 等关键字段。

直接看内核维护的组播成员表,用 ip maddr show 最准——它反映的是 IGMP/MLD 协议实际加入状态,不是配置文件里写的、也不是应用层“声称”要加入的。
ip maddr show 输出的是内核 netlink 接口当前真实生效的组播组列表,包括 IPv4 和 IPv6,且只显示活跃项(比如 224.0.0.1、ff02::1 这类默认组,或你手动 ip maddress add 过的地址)。
为什么不用 netstat -g?
netstat -g 也显示组播组,但它依赖 /proc/net/ip_mr_cache 或 /proc/net/igmp(IPv4)等内核 proc 接口,部分发行版已弃用,且不包含 IPv6 组(ff02::/16 类地址基本看不到)。而 ip maddr show 是 iproute2 的标准接口,统一支持 IPv4/IPv6,输出字段清晰(接口名、链路层地址、IP 组播地址、scope),更可靠。
如何按接口精确过滤?
加 dev 参数即可,例如只查 eth0:
ip maddr show dev eth0
常见错误是漏掉 dev 直接写 ip maddr show eth0,这会报错:RTNETLINK answers: Invalid argument。必须显式用 dev 关键字。
- 想看所有接口但排除 loopback?加
^lo过滤:ip maddr show | grep -v '^lo' - 只关心 IPv4?加
scope global或用grep 224\.,因为 IPv6 组播地址都以ff开头 - 输出里看到
permanent标记,说明是内核硬编码的默认组(如224.0.0.1),无法用ip maddress del删除
ip maddr show 看不到你加的组?检查三件事
如果执行过 ip maddress add 239.1.1.1 dev eth0 却没出现在 ip maddr show 输出里,大概率是以下原因:
- 没用 root 权限运行
ip maddress add,命令静默失败(无提示,但不生效) - 接口已 down:
ip link show eth0看状态是否为LOWER_UP;down 状态下加组无效 - 防火墙或内核参数阻断:检查
net.ipv4.conf.eth0.mc_forwarding是否为 0(转发用),但接收组播只需net.ipv4.conf.eth0.accept_redirects不影响;真正关键的是net.ipv4.icmp_echo_ignore_broadcasts不相关,别误调
要不要配合 tcpdump 验证?
光看 ip maddr show 只能确认“加入了”,不能确认“收到了”。真要验证数据流是否进来,得抓包:
tcpdump -i eth0 host 239.1.1.1 -nn
注意:-i 必须指定接口,不能用 any;组播地址必须用 host 而非 net(组播地址不是网段);-nn 避免 DNS 解析拖慢捕获。
如果 ip maddr show 有记录但 tcpdump 抓不到包,问题一定在链路层以上:交换机未启用 IGMP snooping、上游路由器没发、或本机 iptables DROP 了 UDP 流量(检查 iptables -S | grep -i multicast)。
真实组播状态只存在于内核 IGMP/MLD 表中,ip maddr show 是唯一直接读取它的命令;其他工具都是间接推导,容易滞后或缺失。











