Baru-baru ini saya telah menyiapkan Ubuntu Server 10.04 baru dan menyadari bahwa server UDP saya tidak lagi dapat melihat data multicast dikirim ke antarmuka, bahkan setelah bergabung dengan grup multicast. Saya memiliki pengaturan yang sama persis pada dua mesin Ubuntu 8.04.4 LTS lainnya dan tidak ada masalah dalam menerima data setelah bergabung dengan grup multicast yang sama.
Kartu ethernet adalah Broadcom netXtreme II BCM5709 dan driver yang digunakan adalah:
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
Saya menggunakan smcroute untuk mengelola pendaftaran multicast saya.
b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71
Setelah bergabung dengan grup, ip maddr menunjukkan pendaftaran yang baru ditambahkan.
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
Sejauh ini bagus, saya dapat melihat bahwa saya menerima data untuk grup multicast ini.
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
...
Saya juga dapat mengonfirmasi bahwa antarmuka menerima paket mcast.
b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33
Sekarang, inilah masalahnya. Ketika saya mencoba untuk menangkap lalu lintas menggunakan server UDP ruby sederhana, saya menerima nol data! Inilah server sederhana yang membaca pengiriman data pada port 15572 dan mencetak dua karakter pertama. Ini berfungsi pada dua Server Ubuntu 8.04.4, tetapi tidak pada server 10.04.
require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
text, sender = s.recvfrom(2)
puts text
end
Jika saya mengirim paket UDP dibuat dalam ruby ke localhost, server menerimanya dan mencetak dua karakter pertama. Jadi saya tahu bahwa server di atas berfungsi dengan benar.
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)
Ketika saya memeriksa statistik protokol saya melihat bahwa InMcastPkts tidak meningkat. Sementara di server 8.04 lainnya, di jaringan yang sama, menerima beberapa ribu paket dalam 10 detik.
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
Jika saya mencoba memaksa antarmuka ke mode promisc tidak ada perubahan.
Pada titik ini saya terjebak. Saya telah mengkonfirmasi konfigurasi kernel telah mengaktifkan multicast. Mungkin ada opsi konfigurasi lain yang harus saya periksa?
b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y
Adakah pemikiran ke mana harus pergi dari sini?
rp_filter
dan /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
dan kemudian mulai bekerja.