Centos 6.3 服务器忽略 IGMP 查询

Centos 6.3 服务器忽略 IGMP 查询

我正在使用 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 是否突然开始正常工作。显然,您只能在和平的网络上执行此操作,在这种情况下,暂时删除防火墙不会造成严重的安全风险。

相关内容