我正在使用 CentOS 6.3 服务器订阅 UDP 多播数据,我注意到我的服务器不回答它所连接的交换机发送的 IGMP 查询。
因此,当我打开多播套接字时,我开始接收多播数据,但当我的 IGMP 订阅超时时,这种情况就会停止。服务器不续订其 IGMP 订阅,因此交换机切断多播流。
(为了确保问题不是来自我的任何代码,我正在使用smcroute
打开多播订阅。)
以下是我的服务器任何接口上的 IGMP 通信的屏幕截图:
http://img521.imageshack.us/img521/9953/capture10y.png
正如我们所看到的,我的服务器首先发送 2 个 IGMP 加入,但几分钟后,当交换机发送 IGMP 组成员身份查询时,内核没有应答。
受影响接口的IGMP协议集版本为V2:
[root@localhost ~]# cat /proc/net/igmp
Idx Device : Count Querier Group Users Timer Reporter
1 lo : 0 V2
010000E0 1 0:00000000 0
2 eth0 : 5 V2
FB0000E0 1 0:00000000 1
010000E0 1 0:00000000 0
5 tap0 : 5 V3
FB0000E0 1 0:00000000 0
010000E0 1 0:00000000 0
7 eth1.371: 13 V2
414000E0 1 0:00000000 1
404000E0 1 0:00000000 1
3F4000E0 1 0:00000000 1
504000E0 1 0:00000000 1
524000E0 1 0:00000000 1
494000E0 1 0:00000000 1
4A4000E0 1 0:00000000 1
4B4000E0 1 0:00000000 1
FB0000E0 1 0:00000000 0
010000E0 1 0:00000000 0
rp_filter
在此接口上禁用:
[root@localhost ~]# cat /proc/sys/net/ipv4/conf/eth1.371/rp_filter
0
答案1
我看到了同样的症状——内核显然忽略了IGMP组成员资格查询从路由器 — 在 CentOS 5 服务器上。我将问题归结为“默认拒绝”防火墙配置。
您和我一样,在实施防火墙时可能没有坐下来考虑 IGMP。 CentOSsystem-config-firewall
工具甚至不会询问 IGMP,更不用说为您提供配置防火墙对 IGMP 数据包的响应的方法。
问题是这样的:如果您将防火墙配置为拒绝所有未明确允许的内容,则防火墙将阻止来自 LAN 网关路由器和/或IGMP 感知交换机。内核无法绕过防火墙查看这些数据包,因此如果您不让它们通过,它永远不会响应它们。因此,在一段时间后,交换机/路由器决定您的网络线路上没有人正在侦听此多播流,因此它会停止转发到该线路。
要修复此问题,您需要将以下行添加到文件中/etc/sysconfig/iptables
,位于文件中间的某个位置,位于顶部的定义和REJECT
底部的规则之间:
-A INPUT -p igmp -j ACCEPT
这表示允许所有 IGMP 数据包,不受限制。
说service iptables restart
让新规则生效。
测试我的解决方案是否适合您的快速方法是说service iptables stop
,并查看 IGMP 是否突然开始正常工作。显然,您只能在和平的网络上执行此操作,在这种情况下,暂时删除防火墙不会造成严重的安全风险。