최근에 새로운 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
이제 문제가 있습니다. 간단한 루비 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
루비로 제작 된 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
인터페이스를 promisc 모드로 강제 설정하면 아무 변화가 없습니다.
이 시점에서 나는 붙어 있습니다. 커널 설정에 멀티 캐스트가 활성화되어 있음을 확인했습니다. 확인해야 할 다른 구성 옵션이 있습니까?
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
한 다음 작동하기 시작했습니다.