मैं अपने आवेदन के लिए बंदरगाहों को कैसे आरक्षित करूं?


29

मैं अपने कस्टम एप्लिकेशन के लिए पोर्ट की सूची कैसे आरक्षित करूं?

विशिष्ट होने के लिए, मैं जो उत्पाद बना रहा हूं उसमें बहुत सारी प्रक्रियाएं हैं और उनके बीच बहुत अधिक अंतर है।

मुझे जो समस्या हो रही है, वह है - हर एक बार एक समय में - ओएस मेरे बंदरगाहों को चुरा लेता है। यह दुर्लभ है, लेकिन ऐसा होता है।

ऐसा इसलिए हो सकता है क्योंकि एक अलग एप्लिकेशन ने ":: बाइंड" का उपयोग किया है जिसमें कोई पोर्ट निर्दिष्ट नहीं है।

या कभी-कभी मेरे स्वयं के अनुप्रयोग पोर्ट को चोरी करते हैं जब मैं एक अनबाउंड सॉकेट के साथ ":: कनेक्ट" कहता हूं। जैसा कि मैन पेज से देखा गया है:

यदि सॉकेट पहले से ही एक स्थानीय पते से जुड़ा हुआ नहीं है, तो कनेक्ट करें () इसे एक पते पर बाँध देगा, जो कि सॉकेट के पते का परिवार AF_UNIX नहीं है, एक अप्रयुक्त स्थानीय पता है।

तो मेरा सवाल है, क्या मैं उन बंदरगाहों को आरक्षित कर सकता हूं जिनकी मुझे आवश्यकता है ताकि ओएस उनका उपयोग न करे? क्या इसे / etc / सेवाओं के साथ पूरा किया जा सकता है? या कोई अलग तरीका है?


1
क्या आप इसके बजाय AF_UNIX सॉकेट का उपयोग कर सकते हैं?
एलेक्स

2
अधिक चिंता का विषय है कि आपका अपना आवेदन 'चोरी करने वाले बंदरगाह' क्यों है?
EightBitTony

अगर मुझे अपने सॉफ़्टवेयर के माध्यम से जाने और प्रत्येक कनेक्शन के क्लाइंट पक्ष को एक विशिष्ट पोर्ट से बाँधने की आवश्यकता है, तो मैं बहस कर रहा था। मेरे लिए इसे अपडेट करना काफी काम है क्योंकि मेरे अनुप्रयोगों में बहुत सारे कनेक्शन पथ हैं। जब तक मुझे ऐसा करने का समय नहीं मिल जाता, तब तक OS में पोर्ट्स को रोकना एक अच्छा स्टॉप गैप सॉल्यूशन होता।
माइकल बेकर

मुझे यकीन नहीं है कि अगर SELinuxएनफोर्सिंग मोड आपकी आवश्यकता को पूरा कर सकता है, तो मैं अभी भी उस पर सीख रहा हूं। तो बस एक अनुमान है, हो सकता है कि आप अपने बंदरगाहों SELinuxको आरक्षित करने के लिए अपनी नीति को परिभाषित कर सकें , जैसे my_server_port_t tcp 1111, 2222, 3333, 4444-4600। यदि आपका एप्लिकेशन हर जगह चलेगा (सर्वर एप्लिकेशन नहीं), तो मुझे डर है कि आप नियंत्रित नहीं कर सकते हैं कि SELinuxचालू है या बंद।
लियूयान

"चोरी" करने से मेरा मानना ​​है कि आपके द्वारा आवेदन करने से पहले 3rd पार्टी ऐप आपके चुने हुए पोर्ट नंबर पर बाध्यकारी है, क्योंकि 3rd पार्टी ऐप ने 0 से बांधने का अनुरोध किया है और OS ने बेतरतीब ढंग से आपके चुने हुए पोर्ट नंबर को असाइन किया है 3 पार्टी ऐप। यदि हां, तो देखें unix.stackexchange.com/a/38724/27865
मार्क Lakata

जवाबों:


14

तकनीकी रूप से, "आरक्षित बंदरगाह" जैसी कोई चीज नहीं है।

टीसीपी / यूडीपी में, पोर्ट को "आरक्षित" करने का एकमात्र तरीका वास्तव में इसके लिए bind()एक सॉकेट है। एक बाध्य पोर्ट का उपयोग अन्य अनुप्रयोगों द्वारा नहीं किया जाएगा; एक अप्रयुक्त बंदरगाह, अच्छी तरह से अप्रयुक्त है, इसलिए अन्य अनुप्रयोग इसका उपयोग करने के लिए स्वतंत्र हैं।

यदि आप सर्वर सॉफ़्टवेयर लिख रहे हैं, तो आप अपनी सॉकेट्स को विशिष्ट पोर्ट में बाँध सकते हैं जितनी जल्दी आप कोड कोड में चाहते हैं। पोर्ट नंबरों को कॉन्फ़िगर करने योग्य बनाएं, या कम से कम उन्हें स्पष्ट रूप से प्रलेखन में बताएं, ताकि सिस्टम एडमिनिस्ट्रेटर जल्दी से झड़पों की पहचान कर सके और परस्पर विरोधी एप्लिकेशन को अलग-अलग सर्वर में ले जा सके।


1
इसके अलावा, यदि संभव हो तो अच्छी तरह से ज्ञात / आरक्षित बंदरगाहों का उपयोग करने से बचें।
एइटबिटोनी

कभी-कभी आरक्षित बंदरगाह होते हैं। यह अच्छी सामान्य सलाह है लेकिन लिनक्स पर सही उत्तर नहीं है।
जेसन न्यूटन

18

यह सुनिश्चित करने के लिए कि कर्नेल आपको 49000 और 49001 ग्राहकों को नहीं देगा, जैसा कि आप उन्हें लिनक्स पर अपने सर्वर के लिए उपयोग करना चाहते हैं।

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

इसे ड्रॉप करें /etc/sysctl.confऔर फिर चलाएं sysctl -p

ध्यान दें कि यह अप्रयुक्त है।

संदर्भ


मैंने यह कोशिश की, लेकिन इसने अपने स्वयं के अनुप्रयोग को बंदरगाहों का उपयोग करने से रोक दिया! पोर्ट नंबरों को नामों के साथ परिभाषित करने के बारे में क्या /etc/services?

@ user134197 यदि आप स्पष्ट रूप से अपने बाइंड अनुरोध में गैर शून्य पोर्ट नंबर का उपयोग नहीं करते हैं, तो यह उन पोर्ट का उपयोग करने से आपके अपने आवेदन को नहीं रोकना चाहिए। इससे मेरा काम बनता है।
मार्क लकाटा

15

दरअसल, उपरोक्त उत्तर पूरी तरह से सही नहीं है। Sysctls net.inet.ip.portrange.first और net.inet.ip.portrange.last उन पोर्ट की रेंज निर्दिष्ट करता है, जिन्हें ओएस यादृच्छिक बंदरगाहों के लिए आवंटित कर सकता है। आप यह सुनिश्चित करना चाहेंगे कि आपके आवेदन के लिए आरक्षित बंदरगाहों की सीमा इन चरों के भीतर न पड़े।

FreeBSD हैंडबुक में एक नज़र डालें, अनुभाग: 12.14। ट्यूनिंग कर्नेल सीमाएँ । लेकिन यही मूल आधार लिनक्स पर भी लागू होना चाहिए।


इसके अलावा, यह लिंक सहायता का हो सकता है: stackoverflow.com/questions/913501/…
मैट

3
मुझे लगता है कि लिनक्स में इसे कहा जाता हैnet.ipv4.ip_local_port_range
ब्रायन गॉर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.