2013-08-22 9 views
5

से अलग नेटवर्क और एक्सेस कैसे बनाएं मेरे पास दो ईथरनेट एडाप्टर के साथ एक लिनक्स डिवाइस (वास्तव में प्रोटोटाइप के लिए एक बीगलबोर्ड) है। क्या मैं चाहता हूँ यह है:एकाधिक ईथरनेट इंटरफेस - सी कोड

  • प्राथमिक ईथरनेट इंटरफेस (eth0) एक ग्राहक के नेटवर्क से जोड़ता है (डीएचसीपी है या सौंपा सकता है एक स्थिर IP)।

  • दूसरा ईथरनेट इंटरफेस (eth1) सीधे किसी अन्य लिनक्स बोर्ड से जुड़ता है।

  • बीगल पर उपयोगकर्ता-स्तरीय सी कार्यक्रमों के रूप में आवश्यक कार्रवाई करने, ग्राहक के नेटवर्क (eth0 पर) के इनकमिंग कनेक्शन के लिए सुन सकते हैं, और संभवतः eth1 पर अन्य डिवाइस से कनेक्ट

  • हम दूसरी डिवाइस चाहते हैं नेटवर्क के बाकी हिस्सों से पूरी तरह छुपाया जा सकता है, ताकि बीगल पर केवल कार्यक्रम ही उससे जुड़ सकें।

मुझे उम्मीद थी कि दो इंटरफेस पूरी तरह से अलग हो सकता है, और मेरे कोड चुन सकते हैं जो इंटरफेस यह सुनने के लिए पर/खुले कनेक्शनों चाहता था। विशिष्ट कोड:

socket_desc = socket(AF_INET, SOCK_STREAM, 0); 

memset(&client_addr, 0, sizeof(client_addr)); 
client_addr.sin_family = AF_INET; 
inet_pton( AF_INET, address, (void *)(&(client_addr.sin_addr.s_addr)) ); 
client_addr.sin_port = htons(port); 

/* Connect to remote on TCP port: */ 
connect(*socket_desc, (struct sockaddr*) &client_addr, sizeof(client_addr)); 
... 

हम कनेक्ट करने के लिए पता और बंदरगाह सेट कर सकते हैं, लेकिन ईथरनेट इंटरफ़ेस नहीं। मुझे this answer मिला। क्या इसका मतलब यह है कि मैं जो हासिल करने की कोशिश कर रहा हूं उसे कर्नेल रूटिंग में छोड़ा जाना चाहिए?

मैं जानता हूँ कि मैं अपनी ही सबनेट पर होने के लिए eth1 सेट कर सकते हैं, लेकिन मैं इस के साथ एक समस्या है: यह देखते हुए कि हम ग्राहक के नेटवर्क के बारे में कुछ भी पता नहीं कैसे मुझे पता है कि जो कुछ भी सबनेट मैं जीता का उपयोग 'करना ग्राहक के नेटवर्क के साथ विरोधाभासी खत्म नहीं? उदाहरण के लिए, मैं यहां 192.168.1.0 का उपयोग करता हूं, इसलिए मैं 1 9 2.168.0.0 पर eth1 डाल सकता हूं ... लेकिन क्या होगा यदि क्लाइंट उस सीमा का उपयोग करता है? हम प्रत्येक तैनाती के लिए eth1 और उसके संलग्न डिवाइस के लिए सेटिंग्स को पुन: कॉन्फ़िगर नहीं करना चाहते हैं, हालांकि हमें eth0 को कॉन्फ़िगर करना पड़ सकता है।

तो क्या ऐसा करने का एक बेहतर तरीका है? या शायद एक आरक्षित आईपी पता श्रेणी मैं eth1 पर सबनेट के लिए उपयोग कर सकता हूं, जो कि ग्राहक के नेटवर्क (उदाहरण के लिए 16 9.254.1.एक्स) के साथ संघर्ष नहीं करने की गारंटी है?

क्षमा करें यह थोड़ा अस्पष्ट है, लेकिन मैं इसे दिनों के लिए गुगल कर रहा हूं और शायद कम से कम भ्रमित हो गया हूं।

संपादित करें - 2013-08-29:

मैं सिर्फ this question जो एक आंशिक उत्तर प्रदान करता है मिल गया है: आप एक विशिष्ट करने के लिए बाध्य करने के लिए SO_BINDTODEVICE साथ setsockopt (...) उपयोग कर सकते हैं डिवाइस/इंटरफेस। ऐसा लगता है, हालांकि मैं अभी भी यह नहीं समझ सकता कि रूटिंग टेबल को कैसे स्थिति में विश्वसनीय तरीके से काम करने के लिए सेट किया जा सकता है, जहां "आंतरिक" नेटवर्क में एक ही आईपी एड्रेस रेंज होता है जो "बाहरी" नेटवर्क eth0 से जुड़ा होता है।

+0

क्या क्लाइंट का नेटवर्क राउटर के पीछे होने की संभावना है, एनएटी का उपयोग करें, और एक डीएचसीपी सर्वर का उपयोग करें जो निजी आईपीवी 4 पते (उदा। 10.x.x.x या 172.16.x.x या 192.168.x.x) को सौंपता है?तो हो सकता है कि आप अपने विज्ञापन-प्रसार (eth1, प्रत्यक्ष कनेक्शन) सबनेट पर गैर-निजी (यानी सार्वजनिक) आईपीवी 4 पते का उपयोग कर सकें? ** [एआरपी प्रवाह समस्या] से सावधान रहें (http://blog.cj2s.de/archives/29-Preventing-ARP-flux-on-Linux.html) ** जब एक लिनक्स सिस्टम में एक से अधिक ईथरनेट इंटरफ़ेस होते हैं (आईपी पता लिनक्स होस्ट से संबंधित है, इंटरफ़ेस नहीं)। – sawdust

+0

यह एक संभावना है ... मुझे 99% यकीन है कि ग्राहक एक निजी नेटवर्क पर होगा, लेकिन पूरी तरह से सुनिश्चित नहीं है! और हाँ, मुझे पहले ही एआरपी प्रवाह समस्या का सामना करना पड़ा था और मेरी arp_ignore सेटिंग सेट कर दी गई थी। – Jeremy

+1

* eth1 * को निष्क्रिय करने के लिए एक ठोस समाधान है * eth0 * क्लाइंट के DHCP सर्वर से अपना आईपी पता प्राप्त करता है। फिर (शेष) निजी आईपी पता श्रेणियों में से चुनें, और एक अप्रयुक्त सबनेट में * eth1 * एक स्थिर आईपी पता असाइन करें। * Eth1 * चालू करें और अपने विज्ञापन हाक सबनेट के लिए एक DHCP सर्वर भी शुरू करें। विज्ञापन नेटवर्क पर अन्य होस्ट तब इसके गतिशील आईपी पते प्राप्त कर सकते हैं। हर किसी के पास अब एक अद्वितीय आईपी पता है और आपके बोर्ड के लिए आसानी से सामना करने के लिए दो सबनेट हैं। – sawdust

उत्तर

1

मुझे एक परियोजना के लिए एक ही आवश्यकता थी और हम एलएक्ससी का उपयोग करके समाप्त हो गए, जहां हम कंटेनर को एक भौतिक इंटरफेस असाइन कर सकते थे, और इसलिए हम उसी आईपी एड्रेस सबनेट्स के साथ कंटेनर रख सकते थे।

इसे http://lxc.sourceforge.net/ पर देखें।

+0

सुझाव के लिए धन्यवाद! हालांकि, मुझे जो चाहिए, उसके लिए थोड़ा जटिल है। मुझे लगता है कि मुझे यह SO_BINDTODEVICE सेटिंग (ऊपर देखें) के साथ काम कर रहा है। – Jeremy

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