लिनक्स कर्नेल मल्टीकास्ट यूडीपी पैकेट से नहीं गुजर रहा है


35

हाल ही में मैंने एक नया उबंटू सर्वर 10.04 स्थापित किया है और देखा है कि मेरा यूडीपी सर्वर अब मल्टीकास्ट समूह में शामिल होने के बाद भी इंटरफ़ेस पर भेजे गए किसी भी मल्टीकास्ट डेटा को देखने में सक्षम नहीं है। मुझे दो अन्य उबंटू 8.04.4 एलटीएस मशीनों पर सटीक एक ही सेट मिला है और एक ही मल्टीकास्ट समूह में शामिल होने के बाद डेटा प्राप्त करने में कोई समस्या नहीं है।

ईथरनेट कार्ड एक ब्रॉडकॉम 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

समूह में शामिल होने के बाद आईपी मैड्रिड नए जोड़े गए पंजीकरण को दिखाता है।

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
...

मैं यह भी पुष्टि कर सकता हूं कि इंटरफ़ेस को मॉस्क पैकेट मिल रहा है।

b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33

अब यहाँ समस्या है। जब मैं एक सरल रूबी यूडीपी सर्वर का उपयोग करके ट्रैफ़िक को पकड़ने की कोशिश करता हूं तो मुझे शून्य डेटा प्राप्त होता है! यहां एक सरल सर्वर है जो पोर्ट 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

अगर मैं रूबी में तैयार किए गए एक यूडीपी पैकेट को लोकलहोस्ट पर भेजता हूं, तो सर्वर इसे प्राप्त करता है और पहले दो पात्रों को प्रिंट करता है। इसलिए मुझे पता है कि ऊपर दिया गया सर्वर सही तरीके से काम कर रहा है।

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

अगर मैं इंटरफेस को प्रोमिस मोड में लाने की कोशिश करता हूं तो कुछ भी नहीं बदलता है।

इस बिंदु पर मैं फंस गया हूं। मैंने पुष्टि की है कि कर्नेल विन्यास में मल्टीकास्ट सक्षम है। शायद अन्य विन्यास विकल्प हैं जिनकी मुझे जाँच करनी चाहिए?

b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y

यहाँ से कहाँ जाना है पर कोई विचार?


जाओ पता लगाओ। मैं एक नया प्रश्न दर्ज करने के लिए जाता हूं, संबंधित एल्गोरिदम मुझे खुशी से दिखाता है कि यह प्रश्न मौजूद है, लेकिन इसका कोई सार्थक जवाब नहीं है। बू :(।
VxJasonxV

मुझे यकीन नहीं है कि मैं वास्तव में इनाम देने जा रहा हूं। एक सहकर्मी ने समस्या पाई, और मुझे पता चला कि यह कैसे हुआ यह कैसे हुआ। मैं इनाम देने के बारे में सुझाव देने के लिए तैयार हूं।
VxJasonxV

तुम अभी भी चारों ओर? मेरे पास आपके लिए कुछ प्रश्न हैं।
VxJasonxV

मुझे भी यही समस्या है। प्रिय buecking, आप इसे हल?

जिन लोगों को यह समस्या थी - इस प्रश्न के सभी उत्तर पढ़ें, क्योंकि 2-3 ओ / एस सेटिंग्स हैं जिन्हें ठीक करने की आवश्यकता है। हम बदल कर इस समस्या का समाधान rp_filterऔर /proc/sys/net/ipv4/icmp_echo_ignore_broadcastsऔर फिर इसे काम करना शुरू किया।
सैम गोल्डबर्ग

जवाबों:


35

हमारे उदाहरण में, हमारी समस्या को एससीएक्टल मापदंडों द्वारा हल किया गया था, जो कि मैकीज से अलग है।

कृपया ध्यान दें कि मैं ओपी (buecking) के लिए नहीं बोलता, मैं इस समस्या पर मूल विवरण (उपयोगकर्तालैंड में कोई मल्टीकास्ट ट्रैफ़िक नहीं) से संबंधित होने के कारण आया था।

हमारे पास एक ऐसा एप्लिकेशन है जो चार मल्टीकास्ट एड्रेस पर भेजे गए डेटा को पढ़ता है, और एक मल्टी पोर्ट जो कि आमतौर पर प्राप्त सर्वर पर एक इंटरफेस से जुड़ा होता है, से एक अनूठा पोर्ट प्रति मल्टीकास्ट एड्रेस होता है।

हम इस सॉफ़्टवेयर को एक ग्राहक साइट पर तैनात करने का प्रयास कर रहे थे जब यह रहस्यमय तरीके से बिना किसी ज्ञात कारण के साथ विफल हो गया। इस सॉफ़्टवेयर को डीबग करने के प्रयासों के परिणामस्वरूप हर सिस्टम कॉल का निरीक्षण किया गया, आखिरकार वे सभी ने हमें एक ही बात बताई:

हमारा सॉफ्टवेयर डेटा माँगता है, और OS कभी कोई प्रदान नहीं करता है।

मल्टीकास्ट पैकेट काउंटर बढ़ा, tcpdump ने बॉक्स / विशिष्ट इंटरफ़ेस तक पहुंचने वाले ट्रैफ़िक को दिखाया, फिर भी हम इसके बारे में कुछ नहीं कर सके। SELinux अक्षम किया गया था, iptables चल रहा था लेकिन किसी भी तालिका में कोई नियम नहीं था।

स्टम्प्ड, हम थे।

चारों ओर बेतरतीब ढंग से प्रहार करते हुए, हमने कर्नेल मापदंडों के बारे में सोचना शुरू कर दिया, जो sysctl संभालता है, लेकिन कोई भी प्रलेखित विशेषता या तो विशेष रूप से प्रासंगिक नहीं थी, या यदि उन्हें मल्टीकास्ट ट्रैफ़िक के साथ करना था, तो वे सक्षम थे। ओह, और ifconfig ने फीचर लाइन (अप, ब्रॉडकास्ट, रनिंग, मल्टीकास्ट) में "MULTICAST" की सूची बनाई। जिज्ञासा से बाहर हमने देखा /etc/sysctl.conf। 'लो और निहारना, इस ग्राहक की आधार छवि में कुछ अतिरिक्त लाइनें थीं, जो इसे सबसे नीचे जोड़ा गया।

हमारे मामले में, ग्राहक ने सेट किया था net.ipv4.all.rp_filter = 1। rp_filter रूट पाथ फ़िल्टर है, जो (जैसा कि मैं इसे समझता हूं) उन सभी ट्रैफ़िक को अस्वीकार करता है जो संभवतः इस बॉक्स तक नहीं पहुंच सकते थे। नेटवर्क सबनेट hopping, सोचा जा रहा है कि स्रोत आईपी खराब हो रहा है।

खैर, यह सर्वर 192.168.1 / 24 सबनेट पर था और मल्टीकास्ट ट्रैफ़िक के लिए उपकरण का स्रोत आईपी पता 10. * नेटवर्क में कहीं था। इस प्रकार, फ़िल्टर सर्वर को ट्रैफ़िक के साथ कुछ भी सार्थक करने से रोक रहा था।

ग्राहक द्वारा अनुमोदित ट्वीक की एक जोड़ी; net.ipv4.eth0.rp_filter = 1और net.ipv4.eth1.rp_filter = 0हम खुशी से भाग रहे थे।


2
यह काम किया! rp_filterहमारे 10 जीबी नेटवर्क इंटरफेस के लिए हमारे यूडीपी बहुस्त्र्पीय पैकेट के सभी डंपिंग था। फिल्टर बंद करने से सब कुछ बह जाता है।
क्रिस जेक

जब हम उबंटू रिसीवर पर ट्यून डिवाइस पर एएमटी मल्टीकास्ट पर स्ट्रीमिंग की स्थापना कर रहे थे, और हम पैकेट को tcpdump के माध्यम से डिवाइस पर पहुंचाते हुए देख सकते थे, लेकिन एप्लिकेशन अभी स्ट्रीम नहीं करना चाहता। इस पोस्ट ने हमें बचाया!
सॉफ्टवेयर इंजीनियर

2
14.04 पर चल रहा है, यह केवल मेरे लिए काम करने के बाद मैंने भी सेट किया net.ipv4.all.rp_filter = 0। विशेष रूप से, मल्टीकास्ट डेटा एथ 2 पर आने के साथ, मुझे दोनों को सेट करना पड़ा net.ipv4.eth2.rp_filter = 0और net.ipv4.all.rp_filter = 0
टी-हॉक

4

टीएल / डीआर यह भी सुनिश्चित करें कि आपका मल्टिकास्ट एक वलान से नहीं आता है। tcpdump -eयदि वे करते हैं तो यह निर्धारित करने में मदद करेगा।

सभी निष्पक्षता में, किसी को उन चीजों की एक चेकलिस्ट के साथ एक पेज बनाना चाहिए जो मल्टीकास्ट को उपयोगकर्ताभूमि तक पहुंचने से रोक सकता है। मैं उस के साथ कुछ दिनों के लिए संघर्ष कर रहा हूं, और स्वाभाविक रूप से कुछ भी नहीं जो मुझे वेब पर मिल सकता है।

न केवल मैं पैकेट देख सकता था tcpdump, मैं वास्तव में अन्य मल्टीकास्ट पैकेट प्राप्त कर सकता था, अन्य उत्पादकों के लिए, बस एक अलग इंटरफ़ेस पर। मैं जिस परीक्षण के लिए मल्टीटास्ट प्राप्त कर सकता हूं उसका उपयोग करते हुए कमांड समाप्त हुई:

$ GRP=224.x.x.x # set me to the group
$ PORT=yyyy # set me to the receiving port
$ IFACE=mmmm # set me to the name or IP address of the interface
$ strace -f socat -  UDP4-DATAGRAM:$GRP:$PORT,ip-add-membership=$GRP:$IFACE,bind=0.0.0.0:$PORT,multicast-loop=0

straceयहाँ इसका कारण यह है कि मैं वास्तव socatमें स्टैडआउट के लिए पैकेट का प्रिंट आउट नहीं बना सका , लेकिन straceआउटपुट में आप स्पष्ट रूप से देख सकते हैं socatकि बाध्य सॉकेट से वास्तविक डेटा प्राप्त हो रहा है (यह प्रारंभिक selectकॉल के एक जोड़े के बाद ही म्यूट होगा )

  • rp_filtersysctl - लागू नहीं होता है, सिस्टम एक ही आईपी नेटवर्क पर हैं (मैं उन्हें 0सभी को एक ही सेट करता हूं , ऐसा लगता है कि 1अब डिफ़ॉल्ट सेटिंग है, कम से कम उबंटू के लिए)।
  • फ़ायरवॉल / आदि - प्राप्त करने की प्रणाली फ़ायरवॉल मुक्त है (मुझे नहीं लगता कि पैकेट tcpdump में दिखाई देंगे यदि वे फ़ायरवॉल थे, लेकिन मुझे लगता है कि अगर फ़ायरवॉल मजाकिया है तो यह संभव है)
  • आईपी ​​/ मल्टीकास्ट रूटिंग और कई इंटरफेस - मैं स्पष्ट रूप से सही इंटरफ़ेस पर समूह में शामिल हो गया
  • निराला नेटवर्क हार्डवेयर - यह मेरा आखिरी उपाय था, लेकिन कुछ लैपटॉप को इंटेल एनयूसी में बदलने से कोई फायदा नहीं हुआ। यह वह जगह है जहां मैंने अपनी कोहनी चबाना शुरू कर दिया और एसई को यह पोस्ट करना शुरू कर दिया।
  • मेरे मामले में समस्या विशेष हार्डवेयर द्वारा वीएलएएन का उपयोग था जो उन मल्टीकास्ट पैकेट का उत्पादन कर रहा था। यह देखने के लिए कि क्या यह आपका मुद्दा है, -eझंडे को शामिल करना सुनिश्चित करें tcpdumpऔर vlan टैग की जाँच करें। उपयोगकर्ता को उन पैकेटों को प्राप्त करने में सक्षम होने से पहले एक इंटरफ़ेस को सही वलान में कॉन्फ़िगर करना आवश्यक होगा। मेरे लिए वास्तव में यह था कि मल्टीकास्ट निर्माता पिंग नहीं करेंगे, लेकिन एआरपी कैश में भी नहीं जाएंगे, हालांकि मैं स्पष्ट रूप से एआरपी उत्तर देख सकता था।

वीएलएएन के साथ इसे चलाने के लिए यह लिंक मल्टीकास्ट रूटिंग को कॉन्फ़िगर करने में मददगार हो सकता है। (दुख की बात है कि मैं इसके लिए नया हूं इसलिए प्रतिष्ठा मुझे एक उत्तर जोड़ने की अनुमति नहीं देती है। इसलिए यह संपादन है।)

यहाँ है कि मैंने क्या किया (यदि आवश्यक हो तो sudo का उपयोग करें):

ip link add link eth0 name eth0_100 type vlan id 100
ip addr add 192.168.100.2/24 brd 192.168.100.255 dev eth0_100
ip link set dev eth0_100 up
ip maddr add 01:00:5e:01:01:01 dev eth0_100
route -n add -net 224.0.0.0 netmask 240.0.0.0 dev eth0_100

यदि vlan id 100 के साथ vlan ट्रैफ़िक के लिए बनाया गया है तो यह एक अतिरिक्त इंटरफ़ेस है। vlan ip अनावश्यक हो सकता है। फिर नए इंटरफ़ेस के लिए एक मल्टीकास्ट एड्रेस कॉन्फ़िगर किया गया है (01: 00: 5e: 01: 01: 01 239.1.1.1 के लिए लिंक लेयर एड्रेस है) और सभी आने वाले मल्टीकास्ट ट्रैफिक eth0_100 के लिए बाध्य है। मैंने ऊपर दिए गए जवाबों में सभी संभव कदम (चेक iptables, rp_filter आदि) भी किए।


@ जीरो: मल्टीकास्ट मार्ग को जोड़ना आउटगोइंग मल्टीकास्ट है, आने वाली मल्टीकास्ट नहीं। जब तक आप कुछ कायरतापूर्ण कार्य नहीं कर रहे हों, आपको सीधे तौर पर इंटरफेस पर मल्टीकास्ट आईपी एड्रेस को बाँधना नहीं चाहिए।
पावेल वेसेलोव

2

आप इन सेटिंग्स को आज़मा कर देख सकते हैं:

proc

echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

sysctl.conf

sed -i -e 's|^net.ipv4.icmp_echo_ignore_broadcasts =.*|net.ipv4.icmp_echo_ignore_broadcasts = 0|g' /etc/sysctl.conf

इनका उपयोग आरएचईएल में मल्टीकास्टिंग को सक्षम करने के लिए किया गया है।

आप यह सुनिश्चित करना चाह सकते हैं कि आपका फ़ायरवॉल परस्पर ट्रैफ़िक की अनुमति दे रहा है; फिर से आरएचईएल के साथ मैंने निम्नलिखित को सक्षम किया है:

# allow anything in on multicast addresses
-A INPUT -s 224.0.0.0/4 -j ACCEPT
-A INPUT -p igmp -d 224.0.0.0/4 -j ACCEPT
# needed for multicast ping responses
-A INPUT -p icmp --icmp-type 0 -j ACCEPT

"प्रसारण" विकल्प "मल्टीकास्ट" पर भी लागू होते हैं?
राडवल्ड

0

क्या आप एक प्रबंधित स्विच का उपयोग कर रहे हैं? कुछ के पास 'ब्रॉडकास्ट स्टॉर्म' या अन्य मल्टीकास्ट मुद्दों को रोकने के लिए विकल्प हैं, जो उन्हें कुछ प्रकार के पैकेट को रोकने का कारण बनेंगे। मैं आपके स्विच प्रलेखन पर एक नज़र डालने का सुझाव दूंगा।


0
s.bind("", 15572)

इसके बारे में सुनिश्चित ""? बाँधने के लिए मल्टीकास्ट आईपी-एड्रेस का उपयोग क्यों नहीं किया जाता है?


खाली होस्ट पतों का आमतौर पर "सभी इंटरफेस" होता है।
VxJasonxV
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.