最近,我建立了一个新的Ubuntu Server 10.04,并注意到即使加入多播组后,我的UDP服务器也不再能够看到发送到该接口的任何多播数据。我在其他两台Ubuntu 8.04.4 LTS计算机上设置了完全相同的设置,加入相同的多播组后接收数据没有问题。
以太网卡是Broadcom netXtreme II BCM5709,使用的驱动程序是:
b $ ethtool -i eth1
driver: bnx2
version: 2.0.2
firmware-version: 5.0.11 NCSI 2.0.5
bus-info: 0000:01:00.1
我正在使用smcroute管理我的多播注册。
b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71
加入该组后,ip maddr显示新添加的注册。
b$ ip maddr
1: lo
inet 224.0.0.1
inet6 ff02::1
2: eth0
link 33:33:ff:40:c6:ad
link 01:00:5e:00:00:01
link 33:33:00:00:00:01
inet 224.0.0.1
inet6 ff02::1:ff40:c6ad
inet6 ff02::1
3: eth1
link 01:00:5e:25:36:47
link 01:00:5e:25:36:3e
link 01:00:5e:25:36:3d
link 33:33:ff:40:c6:af
link 01:00:5e:00:00:01
link 33:33:00:00:00:01
inet 233.37.54.71 <------- McastGroup.
inet 224.0.0.1
inet6 ff02::1:ff40:c6af
inet6 ff02::1
到目前为止,我可以看到我正在接收该多播组的数据。
b$ sudo tcpdump -i eth1 -s 65534 host 233.37.54.71
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65534 bytes
09:30:09.924337 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:09.947547 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:10.108378 IP 192.164.1.120.58866 > 233.37.54.71.15574: UDP, length 268
09:30:10.196841 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
...
我还可以确认接口正在接收mcast数据包。
b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33
现在是问题所在。当我尝试使用简单的ruby UDP服务器捕获流量时,我收到的数据为零!这是一个简单的服务器,它读取在端口15572上发送的数据并打印前两个字符。这适用于两个8.04.4 Ubuntu服务器,但不适用于10.04服务器。
require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
text, sender = s.recvfrom(2)
puts text
end
如果我将用ruby制作的UDP数据包发送到localhost,则服务器会收到它并打印出前两个字符。所以我知道上面的服务器可以正常工作。
irb(main):001:0> require 'socket'
=> true
irb(main):002:0> s = UDPSocket.new
=> #<UDPSocket:0x7f3ccd6615f0>
irb(main):003:0> s.send("I2 XXX", 0, 'localhost', 15572)
当我检查协议统计信息时,我看到InMcastPkts没有增加。而在同一网络上的其他8.04服务器上,则在10秒内收到了数千个数据包。
b $ netstat -sgu ; sleep 10 ; netstat -sgu
IcmpMsg:
InType3: 11
OutType3: 11
Udp:
446 packets received
4 packets to unknown port received.
0 packet receive errors
461 packets sent
UdpLite:
IpExt:
InMcastPkts: 4654 <--------- Same as below
OutMcastPkts: 3426
InBcastPkts: 9854
InOctets: -1691733021
OutOctets: 51187936
InMcastOctets: 145207
OutMcastOctets: 109680
InBcastOctets: 1246341
IcmpMsg:
InType3: 11
OutType3: 11
Udp:
446 packets received
4 packets to unknown port received.
0 packet receive errors
461 packets sent
UdpLite:
IpExt:
InMcastPkts: 4656 <-------------- Same as above
OutMcastPkts: 3427
InBcastPkts: 9854
InOctets: -1690886265
OutOctets: 51188788
InMcastOctets: 145267
OutMcastOctets: 109712
InBcastOctets: 1246341
如果我尝试将接口强制为混杂模式,则不会发生任何变化。
在这一点上,我被困住了。我已经确认内核配置已启用多播。也许还有其他配置选项我应该检查?
b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y
有什么想法从这里去?
rp_filter
,并/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
,然后它开始工作。