Recientemente configuré un nuevo Ubuntu Server 10.04 y noté que mi servidor UDP ya no puede ver los datos de multidifusión enviados a la interfaz, incluso después de unirse al grupo de multidifusión. Tengo exactamente la misma configuración en otras dos máquinas Ubuntu 8.04.4 LTS y no hay ningún problema para recibir datos después de unirme al mismo grupo de multidifusión.
La tarjeta ethernet es una Broadcom netXtreme II BCM5709 y el controlador utilizado es:
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
Estoy usando smcroute para administrar mis registros de multidifusión.
b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71
Después de unirse al grupo, ip maddr muestra el registro recién agregado.
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
Hasta ahora todo bien, puedo ver que estoy recibiendo datos para este grupo de multidifusión.
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
...
También puedo confirmar que la interfaz está recibiendo paquetes mcast.
b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33
Ahora aquí está el problema. ¡Cuando trato de capturar el tráfico usando un simple servidor ruby UDP, recibo cero datos! Aquí hay un servidor simple que lee el envío de datos en el puerto 15572 e imprime los dos primeros caracteres. Esto funciona en los dos servidores Ubuntu 8.04.4, pero no en el servidor 10.04.
require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
text, sender = s.recvfrom(2)
puts text
end
Si envío un paquete UDP creado en rubí a localhost, el servidor lo recibe e imprime los dos primeros caracteres. Entonces sé que el servidor anterior funciona correctamente.
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)
Cuando reviso las estadísticas del protocolo, veo que InMcastPkts no está aumentando. Mientras que en los otros servidores 8.04, en la misma red, recibió unos pocos miles de paquetes en 10 segundos.
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
Si trato de forzar la interfaz a modo promisc, nada cambia.
En este punto estoy atascado. He confirmado que la configuración del núcleo tiene habilitada la multidifusión. ¿Quizás hay otras opciones de configuración que debería verificar?
b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y
¿Alguna idea sobre a dónde ir desde aquí?
rp_filter
y /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
y luego empezamos a trabajar.