स्रोत पोर्ट कैसे निर्धारित किए जाते हैं और मैं इसे किसी विशिष्ट पोर्ट का उपयोग करने के लिए कैसे बाध्य कर सकता हूं


26

जब मैं https://www.google.co.uk से जुड़ता हूं तो यह 216.58.198.228:443 में बदल जाता है। फिर मेरे लिए एक कनेक्शन [My IP Address]: 63998 पर खुलता है।

मेरा सवाल यह है कि 63998 पोर्ट कैसे चुना जाता है और क्या यह 63999 होने के लिए मजबूर करने का एक तरीका है।


9
क्या यह 63999 होने के लिए मजबूर करने का एक तरीका है? क्या आपके पास ऐसा करने की कोशिश करने का कोई कारण है?
AL

1
यदि आप कोई एप्लिकेशन लिख रहे हैं, तो आप कोई भी (अप्रयुक्त) स्रोत पोर्ट खोल सकते हैं। लेकिन यह एक अच्छा विचार नहीं है और स्पष्ट नहीं है कि आप ऐसा क्यों चाहते हैं?
pjc50

6
@ pjc50 वास्तव में, यह प्रश्न ऐसा लगता है जैसे यह एक XY समस्या हो सकती है
देव

1
मैंने "स्थानीय" के बजाय "स्रोत" कहने के लिए शीर्षक बदलने के लिए एक संपादन सबमिट किया है, क्योंकि गंतव्य पोर्ट नंबर गंतव्य मशीन के लिए "स्थानीय" हैं, लेकिन प्रारंभिक टीसीपी SYN पैकेट का स्रोत स्पष्ट रूप से सर्जक के सर्जक का है कनेक्शन।
मोंटी हार्डर

जवाबों:


39

स्थानीय पोर्ट कैसे निर्धारित किए जाते हैं

पोर्ट संख्या को टीसीपी कार्यान्वयन सॉफ्टवेयर द्वारा चुना जाता है, जिसमें एपेमेरल पोर्ट नामक पोर्ट संख्याओं की एक श्रृंखला होती है ।

पोर्ट संख्या और उपयोग की जाने वाली सीमा को चुनने के लिए सटीक तंत्र ऑपरेटिंग सिस्टम पर निर्भर है।


क्या यह 63999 होने के लिए मजबूर करने का एक तरीका है।

यह टीसीपी कार्यान्वयन सॉफ्टवेयर के कॉन्फ़िगरेशन को बदलकर किया जा सकता है।

एपर्मेरल पोर्ट्स को विभिन्न ऑपरेटिंग सिस्टमों के लिए कॉन्फ़िगर करने के निर्देश एपेमेरल पोर्ट रेंज को बदलते हुए पाए जा सकते हैं ।

  • संदर्भ के लिए नीचे दिए गए इस उत्तर में लिनक्स और विंडोज के लिए निर्देश शामिल हैं।

हालांकि, सीमा को एकल पोर्ट तक सीमित करना एक अच्छा विचार नहीं है, उदाहरण के लिए 63999

  • वास्तव में विंडोज पर यह संभव नहीं है:

    सेट किए जा सकने वाले पोर्ट की न्यूनतम सीमा 255 है।


पंचांग पोर्ट रेंज

एक टीसीपी / आईपीवी 4 कनेक्शन में दो समापन बिंदु होते हैं, और प्रत्येक समापन बिंदु में एक आईपी पता और एक पोर्ट नंबर होता है। इसलिए, जब कोई क्लाइंट उपयोगकर्ता सर्वर कंप्यूटर से कनेक्ट होता है, तो एक स्थापित कनेक्शन को (सर्वर आईपी, सर्वर पोर्ट, क्लाइंट आईपी, क्लाइंट पोर्ट) के 4-ट्यूपल के रूप में सोचा जा सकता है।

आमतौर पर चार में से तीन को आसानी से जाना जाता है - क्लाइंट मशीन अपने स्वयं के आईपी पते का उपयोग करती है और दूरस्थ सेवा से कनेक्ट होने पर, सर्वर मशीन के आईपी पते और सेवा पोर्ट नंबर की आवश्यकता होती है।

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

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

इसलिए, यदि क्लाइंट प्रोग्राम फिर से जुड़ता है, तो उसे नए कनेक्शन के पक्ष के लिए एक अलग एपर्चर पोर्ट नंबर सौंपा जाएगा।

स्रोत पंचांग पोर्ट रेंज


पंचांग पोर्ट रेंज बदलना

लिनक्स:

लिनक्स आपको केवल फ़ाइल का उपयोग करके पंचांग पोर्ट रेंज को देखने और बदलने की अनुमति देता है /proc/sys/net/ipv4/ip_local_port_range। उदाहरण के लिए, यह कर्नेल 2.2 प्रणाली पर डिफ़ॉल्ट विन्यास दिखाता है:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
1024 4999

इसे पसंदीदा रेंज में बदलने के लिए, आप कर सकते हैं (सुपरयुजर के रूप में):

# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range 

ध्यान दें कि आपको हर बार सिस्टम बूट करने की आवश्यकता होगी, इसलिए सिस्टम स्टार्टअप स्क्रिप्ट में एक पंक्ति जोड़ना सुनिश्चित करें जैसे कि /etc/rc.local आपकी सीमा हमेशा उपयोग की जाती है।

यह भी ध्यान दें कि यदि पर्याप्त कर्नेल मेमोरी उपलब्ध है, तो लिनक्स 2.4 कर्नेल 32768 की सीमा को 61000 के माध्यम से डिफ़ॉल्ट कर देगा, इसलिए नए लिनक्स सिस्टम पर रेंज बदलना आवश्यक नहीं हो सकता है।

अंत में, यह भी ध्यान दें कि आप फ़ाइल सिस्टम sysctlका उपयोग करने के बजाय सेटिंग्स को बदलने के लिए इंटरफ़ेस का उपयोग करने में सक्षम हो सकते हैं /procsysctlपैरामीटर का नाम "net.ipv4.ip_local_port_range" है। /etc/sysctl.confयदि आपके पास यह फ़ाइल है, तो संपादित करें , या sysctlयदि आप इस पैरामीटर का उपयोग करना चाहते हैं , तो स्टार्टअप स्क्रिप्ट को मैन्युअल रूप से कमांड चलाएं sysctl

Windows Vista / Windows Server 2008 और नए:

Microsoft नॉलेजबेस आर्टिकल 929851 के अनुसार, विंडोज विस्टा और विंडोज सर्वर 2008 के अनुसार, विंडोज अब डिफ़ॉल्ट रूप से बड़ी रेंज (49152-65535) का उपयोग करता है । वही लेख यह भी दिखाता है कि आप अपनी इच्छानुसार सीमा को कैसे बदल सकते हैं, लेकिन डिफ़ॉल्ट सीमा अब अधिकांश सर्वरों के लिए पर्याप्त है।

स्रोत पंचांग पोर्ट रेंज बदलना

आप निम्न netshआदेशों का उपयोग करके Windows Vista या Windows Server 2008 कंप्यूटर चला रहे कंप्यूटर पर डायनेमिक पोर्ट श्रेणी देख सकते हैं :

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp 

टिप्पणियाँ:

  • रेंज प्रत्येक परिवहन के लिए और आईपी के प्रत्येक संस्करण के लिए अलग से सेट की गई है।
  • पोर्ट रेंज अब वास्तव में एक शुरुआती बिंदु के साथ और एक समापन बिंदु के साथ एक सीमा है।
  • Microsoft ग्राहक जो Windows Server 2008 चला रहे सर्वर को तैनात करते हैं, अगर आंतरिक नेटवर्क पर फ़ायरवॉल का उपयोग किया जाता है, तो सर्वर के बीच RPC संचार में समस्या हो सकती है।
  • इन मामलों में, हम अनुशंसा करते हैं कि आप फायरवॉल को पुन: कॉन्फ़िगर के गतिशील पोर्ट श्रेणी में सर्वर के बीच यातायात के लिए अनुमति देने के लिए 49152 के माध्यम से 65535
  • यह सीमा प्रसिद्ध बंदरगाहों के अतिरिक्त है जो सेवाओं और अनुप्रयोगों द्वारा उपयोग की जाती हैं।
  • या, सर्वर द्वारा उपयोग की जाने वाली पोर्ट श्रेणी को प्रत्येक सर्वर पर संशोधित किया जा सकता है।

आप इस श्रेणी को netshकमांड का उपयोग करके समायोजित करते हैं , इस प्रकार है:

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

यह कमांड TCP के लिए डायनेमिक पोर्ट रेंज सेट करता है। प्रारंभ पोर्ट संख्या है, और पोर्ट की कुल संख्या सीमा है। निम्नलिखित नमूना आदेश हैं:

netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000

ये नमूना आदेश पोर्ट 10000 पर शुरू करने और पोर्ट 10999(1000 पोर्ट) पर समाप्त होने के लिए डायनेमिक पोर्ट रेंज सेट करते हैं ।

टिप्पणियाँ:

  • सेट किए जा सकने वाले पोर्ट की न्यूनतम सीमा है 255
  • न्यूनतम प्रारंभिक बंदरगाह जो सेट किया जा सकता है 1025
  • अधिकतम अंत पोर्ट (कॉन्फ़िगर की जा रही सीमा के आधार पर) से अधिक नहीं हो सकता है 65535
  • विंडोज सर्वर 2003 के डिफ़ॉल्ट व्यवहार को डुप्लिकेट करने के लिए, 1025स्टार्ट पोर्ट के 3976रूप में उपयोग करें, और फिर टीसीपी और यूडीपी दोनों के लिए सीमा के रूप में उपयोग करें । इसका एक प्रारंभ पोर्ट 1025और के एक अंतिम पोर्ट में होता है 5000

स्रोत Microsoft नॉलेजबेस अनुच्छेद 929851 :

Windows XP और पुराने:

पुराने विंडोज ऑपरेटिंग सिस्टम (विंडोज एक्सपी और पुराने) के लिए, विंडोज अपने एपीमेरल पोर्ट रेंज के लिए 4999 के माध्यम से 1024 की पारंपरिक बीएसडी रेंज का उपयोग करता है। दुर्भाग्य से ऐसा प्रतीत होता है कि आप केवल पंचांग पोर्ट की ऊपरी सीमा निर्धारित कर सकते हैं। यहाँ Microsoft नॉलेजबेस अनुच्छेद 196271 से संबंधित जानकारी दी गई है :

  • रजिस्ट्री संपादक ( Regedt32.exe) शुरू करें ।
  • रजिस्ट्री में निम्न कुंजी का पता लगाएँ:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • "संपादित करें" मेनू पर, "मान जोड़ें" पर क्लिक करें, और फिर निम्न रजिस्ट्री मान जोड़ें:

    मान का नाम: MaxUserPortडेटा प्रकार: REG_DWORDमान: 65534(उदाहरण के लिए)

    मान्य सीमा: 5000-65534(दशमलव) डिफ़ॉल्ट: 0x1388(5000 दशमलव)

    विवरण: यह पैरामीटर उपयोग किए गए अधिकतम पोर्ट नंबर को नियंत्रित करता है जब कोई एप्लिकेशन सिस्टम से किसी भी उपलब्ध उपयोगकर्ता पोर्ट का अनुरोध करता है। आम तौर पर, अल्पकालिक (अर्थात, अल्पकालिक) बंदरगाहों को समावेशी 1024और 5000समावेशी मूल्यों के बीच आवंटित किया जाता है ।

  • रजिस्ट्री संपादक से बाहर निकलें।

नोट: एक अन्य प्रासंगिक KB आलेख ( 812873 ) है जो आपको अपवर्जन रेंज सेट करने की अनुमति देने का दावा करता है, जिसका अर्थ यह हो सकता है कि आप बंदरगाहों को शामिल कर सकते हैं 1024-9999(उदाहरण के लिए) अल्पकालिक पोर्ट रेंज हो 10000-65534। हालांकि, हम इसे काम करने में सक्षम नहीं कर पाए हैं (अक्टूबर 2004 तक)।

स्रोत पंचांग पोर्ट रेंज बदलना


1
कम से कम खिड़कियों के लिए ऐसा लगता है कि पोर्ट रेंज सिस्टम को चौड़ा करना प्रतिबंधित करना संभव है। ज्यादातर मामलों में यह एक बुरा विचार है, विशेष रूप से इसे एक बंदरगाह तक सीमित करना होगा: KB 929851 देखें , कम से कम विंडोज 7 पर काम करने वाले कमांड सूचीबद्ध
सेठ

@ सेठ जी। मैं ओ पी के बाद से यह उल्लेख करने के लिए अपने ओएस का उल्लेख नहीं था अनिच्छुक था और मैं एन ऑपरेटिंग सिस्टम को कवर करने के जवाब विस्तार करने के लिए नहीं करना चाहता था ...
DavidPostill

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

1
वास्तव में, लिनक्स में भी यह बहुत सरल है: बस गूंज "49152 65535"> / proc / sys / net / ipv4 / ip_local_port_range । यह इतना सरल है कि इसे प्रति-कमांड के आधार पर किया जा सकता है ।
MariusMatutiae

2
एपेरमल पोर्ट रेंज को बदलने के बजाय, एप्लिकेशन कॉल करने bindसे पहले सिस्टम कॉल को कॉल करना बेहतर होगा connect। कुछ अनुप्रयोगों में ऐसा करने का विकल्प होता है, अन्य अनुप्रयोग नहीं होते हैं।
कास्परड

9

डेविड पोस्टिल का जवाब बिलकुल सही है। मैं सिर्फ इसे जोड़ना चाहूंगा, इस बात पर जोर देकर कि लिनक्स में अल्पकालिक पोर्ट रेंज को बदलना इतना सरल है, कि ओपी के पास एक सकारात्मक जवाब है।

आप EPR को निम्नानुसार बदलते हैं:

echo "40000 60000" > /proc/sys/net/ipv4/ip_local_port_range 

और आप निम्न स्क्रिप्ट के साथ पोर्ट 50000 (उदाहरण के रूप में) का चयन कर सकते हैं:

OLD_RANGE=$(cat /proc/sys/net/ipv4/ip_local_port_range)
MY_PORT=50000
echo "$MY_PORT $MY_PORT" > /proc/sys/net/ipv4/ip_local_port_range
sudo -u SomeUser SomeApplication  & 
echo $OLD_RANGE" > /proc/sys/net/ipv4/ip_local_port_range 

यहां एक चेतावनी: चूंकि सीमा में एक एकल बंदरगाह है, इसलिए एक और एप्लिकेशन इसे तीसरी और चौथी लाइनों के निष्पादन के बीच आपसे दूर छीन सकता है; इसके अलावा, यहां तक ​​कि अगर कोई दौड़ की स्थिति नहीं है, तो आप बड़े ईपीआर को बहाल करने तक सभी अन्य अनुप्रयोगों को पंगु बना देंगे, यही कारण है कि मैंने जल्द से जल्द मूल सीमा को बहाल कर दिया।

इस प्रकार, यदि ओप्स का ऑपरेटिंग सिस्टम लिनक्स था, तो उत्तर यह होगा कि यह आसानी से किया जा सकता है।

आश्चर्यजनक रूप से, यह बीएसडी पर उतना सीधा नहीं है, जिनमें से कुछ में EPR के लिए रनटाइम कर्नेल सेटिंग भी नहीं है। MacOS X, FreeBSD और OpenBSD को फ़ाइल /etc/sysctl.conf को संशोधित करने की आवश्यकता है , लेकिन उनके पास EPR के लिए अलग-अलग विकल्प हैं।

उपरोक्त और OS के बावजूद, तथ्य यह है कि कुछ किया जा सकता है इसका मतलब यह नहीं है कि यह किया जाना चाहिए : पृथ्वी पर आपको इसकी आवश्यकता क्यों है? मैं एक भी उपयोग के मामले के बारे में नहीं सोच सकता।


लिनक्स उदाहरण के लिए +1।
DavidPostill

हेहे। बीएसडी / ओएस गिरी :) फिर कंपाइल करने की आवश्यकता है
DavidPostill

1
@DavidPostill यह एक प्रमुख बुमेर है ।
MariusMatutiae

आपके कोड उदाहरण में कोई दोष है। आपका टाइप कास्ट बहुत गलत है। इसके अतिरिक्त, यह BIND_PORTवैकल्पिक बनाने के लिए एक अच्छा विचार होगा , जैसे कि कोड अभी भी मूल रूप से उसी तरह से उपयोग किया जा सकता है। मुझे लगता है htons(bind_port_env ? atoi(bind_port_env) : 0)कि वह सही काम करेंगे।
कैस्परल्ड

1

यह जोड़ने लायक है कि लिनक्स कर्नेल भी है

net.ipv4.ip_local_reserved_ports

नॉब जो कुछ विपरीत होता है, लेकिन फिर भी यह बहुत उपयोगी हो सकता है क्योंकि इस तरह से आप सेवाओं के लिए "छिद्र को छिद्र" कर सकते हैं जो विशिष्ट पोर्ट के पोर्ट के अन्यथा विशिष्ट पोर्ट खोलते हैं।

डॉक्स से संक्षिप्त अंश :

उन पोर्ट को निर्दिष्ट करें जो ज्ञात तृतीय-पक्ष एप्लिकेशन के लिए आरक्षित हैं। इन पोर्ट का उपयोग स्वचालित पोर्ट असाइनमेंट (जैसे कनेक्टिंग कॉलिंग) या बाइंड () पोर्ट नंबर 0 के साथ नहीं किया जाएगा। स्पष्ट पोर्ट आवंटन व्यवहार अपरिवर्तित है।

इनपुट और आउटपुट दोनों के लिए उपयोग किया जाने वाला प्रारूप श्रेणियों की अल्पविराम से अलग की गई सूची है (उदाहरण के लिए पोर्ट 1, 2, 3, 4 और 10 के लिए "1,2-4,10-10")। फ़ाइल में लिखना सभी पहले से आरक्षित बंदरगाहों को साफ कर देगा और इनपुट में दी गई सूची के साथ वर्तमान सूची को अपडेट करेगा।

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