Kürzlich habe ich einen neuen Ubuntu Server 10.04 eingerichtet und festgestellt, dass mein UDP-Server keine Multicast-Daten mehr sehen kann, die an die Schnittstelle gesendet wurden, selbst nachdem er der Multicast-Gruppe beigetreten ist. Ich habe genau das gleiche Setup auf zwei anderen Ubuntu 8.04.4 LTS-Maschinen und es gibt kein Problem, Daten zu empfangen, nachdem ich derselben Multicast-Gruppe beigetreten bin.
Die Ethernet-Karte ist eine Broadcom netXtreme II BCM5709 und der verwendete Treiber ist:
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
Ich verwalte meine Multicast-Registrierungen mit smcroute.
b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71
Nach dem Beitritt zur Gruppe zeigt ip maddr die neu hinzugefügte Registrierung an.
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
Soweit so gut, kann ich sehen, dass ich Daten für diese Multicast-Gruppe erhalte.
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
...
Ich kann auch bestätigen, dass die Schnittstelle Mcast-Pakete empfängt.
b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33
Hier ist das Problem. Wenn ich versuche, den Datenverkehr mit einem einfachen Ruby-UDP-Server zu erfassen, erhalte ich keine Daten! Hier ist ein einfacher Server, der die an Port 15572 gesendeten Daten liest und die ersten beiden Zeichen druckt. Dies funktioniert auf den beiden 8.04.4 Ubuntu Servern, nicht jedoch auf dem 10.04 Server.
require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
text, sender = s.recvfrom(2)
puts text
end
Wenn ich ein in Ruby erstelltes UDP-Paket an localhost sende, empfängt der Server es und druckt die ersten beiden Zeichen aus. Ich weiß also, dass der Server oben richtig funktioniert.
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)
Wenn ich die Protokollstatistik überprüfe, sehe ich, dass InMcastPkts nicht zunimmt. Auf den anderen 8.04-Servern im selben Netzwerk wurden innerhalb von 10 Sekunden einige Tausend Pakete empfangen.
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
Wenn ich versuche, die Benutzeroberfläche in den Promisc-Modus zu versetzen, ändert sich nichts.
An diesem Punkt stecke ich fest. Ich habe bestätigt, dass in der Kernel-Konfiguration Multicast aktiviert ist. Vielleicht gibt es andere Konfigurationsoptionen, die ich überprüfen sollte?
b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y
Irgendwelche Gedanken darüber, wohin man von hier aus gehen soll?
rp_filter
und /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
und es begann dann zu arbeiten.