2012-12-12 13 views
5

tcmpdump विशिष्ट मल्टीकास्ट ट्रैफ़िक को विशिष्ट समूह और eth2 पर बंदरगाह पर देख सकता है, लेकिन मेरा पायथन प्रोग्राम नहीं कर सकता है। अजगर कार्यक्रम, Ubuntu 12.04 पर चल रहा है:विशिष्ट इंटरफ़ेस पर मल्टीकास्ट डेटा प्राप्त करना

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

# Multicast port is 52122 
sock.bind(('', 52122)) 

# Interface eth2 IP is 1.2.3.4, multicast group is 6.7.8.9 
mreq = socket.inet_aton('6.7.8.9')+socket.inet_aton('1.2.3.4') 
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

while True: 
    print '\nwaiting to receive message' 
    data, address = sock.recvfrom(1024) 
    print data 

जब मैं अन्य प्रोग्राम का उपयोग करने के लिए एक eth2 बहुस्त्र्पीय पैकेट भेजने के लिए, यह काम करता है और पैकेट प्रिंट करता है। लेकिन यह सभी मौजूदा मल्टीकास्ट यातायात को देखने में विफल रहता है। अगर मैं एक ही बंदरगाह और उपरोक्त कार्यक्रम के रूप में समूह पर eth2 पर tcpdump चलाएँ:

sudo tcpdump -i eth2 host 6.7.8.9 and port 52122 

इसे देखता है दोनों पैकेट मैं किसी अन्य प्रोग्राम और सभी मौजूदा बहुस्त्र्पीय यातायात से भेजें। यह आउटपुट दिखता है ...

# Packet sent from my other program 
09:52:51.952714 IP 1.2.3.4.57940 > 6.7.8.9.52122: UDP, length 19 
# Packet send from the outside world 
09:52:52.143339 IP 9.9.9.9.39295 > 6.7.8.9.52122: UDP, length 62 

मेरा प्रोग्राम बाहरी दुनिया से पैकेट क्यों नहीं देख सकता है? इसे ठीक करने के लिए मैं इसे कैसे संशोधित कर सकता हूं (या कुछ और)?

संपादित करें:

मैंने कहा जाना चाहिए था, इंटरफ़ेस इस पर नहीं जा रहा eth2 लेकिन eth2.200 एक VLAN है। (स्थानीय आईपी और टीसीपीडम्प आदेश सभी eth2.200 के साथ चलाए जाते हैं, मैंने अभी इस विषय में इसे आसान बनाने के लिए बदल दिया है।) this answer पर आधारित यह समस्या हो सकती है?

# 2 संपादित करें:

netstat -ng जब कार्यक्रम से पता चलता है चल रहा है eth2.200 224.0.0.1 और 6.7.8.9` की सदस्यता ली।

tshark -i eth2.200 igmp कार्यक्रम शुरू होने पर तीन बार 1.2.3.4 -> 6.7.8.9 IGMP 46 V2 Membership Report/Join group 6.7.8.9 दिखाता है। जब प्रोग्राम प्रक्रिया मारे जाती है, तो यह 1.2.3.4 -> 224.0.0.2 IGMP 46 V2 Leave group 6.7.8.9 दिखाती है। एक कम 1.2.3.1 -> 224.0.0.1 IGMP 60 V2 Membership Query, general भी है, जहां 1.2.3.1 1.2.3.4 का गेटवे है।

सुनिश्चित नहीं हैं कि अगर यह मदद मिलेगी, लेकिन अनुमार्गण तालिका की तरह दिखता है:

Destination  Gateway   Genmask   Flags MSS Window irtt Iface 
0.0.0.0   1.2.5.6   0.0.0.0   UG  0 0   0 eth1 
1.2.3.0   0.0.0.0   255.255.255.240 U   0 0   0 eth2.200 

धन्यवाद!

+1

जब आप अपना प्रोग्राम चलाते हैं तो 'netstat -ng' क्या कहता है? –

+0

क्या आपको 'mreq' पर' struct.pack ("= 4sl", ...) की आवश्यकता नहीं है? रेफरी: [UdpCommunication] (http://wiki.python.org/moin/UdpCommunication)। –

+0

@ निकोलई एनफेटिसोव: चलते समय, eth2 के तहत, यह सूचीबद्ध करता है: 'eth2 1 23.13.16.41', eth_ 2 6.7.8.9', eth_ 1 224.0.0.1'। 23.13.16.41 एक और समूह है जिसे मैंने कुछ समय पहले सदस्यता लेने की कोशिश की थी। – Albeit

उत्तर

7

अंत में! सर्वरफॉल्ट पर this question मिला जो एक ही चीज़ को संबोधित करता है। असल में कर्नेल पैकेट को फ़िल्टर नहीं कर रहा था/क्योंकि यह सोचा था कि सोर्स किए गए पते को धोखा दिया गया था।

मैच के लिए /etc/sysctl.conf में सेटिंग्स परिवर्तित:

net.ipv4.conf.default.rp_filter = 0 
net.ipv4.conf.all.rp_filter = 0 
net.ipv4.ip_forward = 1 

rebooted और सब कुछ काम करता है।

+2

आपके उत्तर ने मुझे निराशा के 2 दिनों के बाद बचाया! :) – tkarls

संबंधित मुद्दे