Gần đây tôi đã thiết lập Ubuntu Server 10.04 mới và nhận thấy máy chủ UDP của tôi không còn có thể thấy bất kỳ dữ liệu phát đa hướng nào được gửi đến giao diện, ngay cả sau khi tham gia nhóm phát đa hướng. Tôi đã có cùng một thiết lập trên hai máy Ubuntu 8.04.4 LTS khác và không có vấn đề gì khi nhận dữ liệu sau khi tham gia cùng một nhóm phát đa hướng.
Thẻ ethernet là Broadcom netXtreme II BCM5709 và trình điều khiển được sử dụng là:
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
Tôi đang sử dụng smcroute để quản lý đăng ký phát đa hướng của mình.
b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71
Sau khi tham gia nhóm ip maddr cho thấy đăng ký mới được thêm vào.
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
Cho đến nay rất tốt, tôi có thể thấy rằng tôi đang nhận dữ liệu cho nhóm phát đa hướng này.
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
...
Tôi cũng có thể xác nhận rằng giao diện đang nhận các gói mcast.
b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33
Bây giờ đây là vấn đề. Khi tôi cố gắng nắm bắt lưu lượng truy cập bằng máy chủ UDP ruby đơn giản, tôi nhận được dữ liệu bằng không! Đây là một máy chủ đơn giản đọc dữ liệu gửi trên cổng 15572 và in hai ký tự đầu tiên. Điều này hoạt động trên hai Máy chủ Ubuntu 8.04.4, nhưng không phải máy chủ 10.04.
require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
text, sender = s.recvfrom(2)
puts text
end
Nếu tôi gửi một gói UDP được chế tạo bằng ruby đến localhost, máy chủ sẽ nhận được nó và in ra hai ký tự đầu tiên. Vì vậy, tôi biết rằng máy chủ ở trên đang hoạt động chính xác.
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)
Khi tôi kiểm tra số liệu thống kê giao thức, tôi thấy rằng InMcastPkts không tăng. Trong khi trên các máy chủ 8.04 khác, trên cùng một mạng, đã nhận được vài nghìn gói trong 10 giây.
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
Nếu tôi cố buộc giao diện vào chế độ lăng nhăng thì không có gì thay đổi.
Lúc này tôi bị kẹt. Tôi đã xác nhận cấu hình kernel đã kích hoạt phát đa hướng. Có lẽ có các tùy chọn cấu hình khác tôi nên kiểm tra?
b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y
Bất kỳ suy nghĩ về nơi để đi từ đây?
rp_filter
và /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
và sau đó nó bắt đầu làm việc.