SSD Nodes Learn Hosting plans →
गाइड Matt Connorलेखक: Matt Connor

Linux में पोर्ट क्या हैं और services कैसे listen करती हैं

पोर्ट सर्वर पर ट्रैफिक को सही सर्विस तक पहुँचाते हैं। ss कमांड का उपयोग करके यह जानें कि कौन सी सर्विस किस पोर्ट पर सक्रिय है और local व public पोर्ट में अंतर कैसे पहचानें।

पोर्ट वास्तव में क्या है

पोर्ट एक नंबर है जो एक सर्वर को एक साथ कई सेवाएं चलाने की अनुमति देता है, बिना उनके ट्रैफिक के आपस में मिले। आपके VPS का एक IP address होता है, लेकिन उस पर एक ही समय में वेब सर्वर, SSH सर्वर और डेटाबेस चल सकते हैं। जब कोई पैकेट आता है, तो ऑपरेटिंग सिस्टम को यह जानना होता है कि वह किसके लिए है। पोर्ट नंबर ही इसका उत्तर है। HTTPS ट्रैफिक सामान्यतः पोर्ट 443 पर जाता है, और SSH पोर्ट 22 पर। IP address पैकेट को आपके सर्वर तक पहुँचाता है; पोर्ट उसे उस सर्वर पर सही प्रोग्राम तक पहुँचाता है।

पोर्ट एक 16-bit नंबर है: 16 bits से 0 से 65535 तक की संख्याएँ मिलती हैं, और 0 आरक्षित है, इसलिए व्यवहार में पोर्ट 1 से 65535 तक होते हैं। 1024 से नीचे के पोर्ट "well-known" पोर्ट कहलाते हैं, और डिफ़ॉल्ट रूप से Linux केवल root (या CAP_NET_BIND_SERVICE क्षमता प्राप्त प्रोग्राम) को ही उन्हें खोलने की अनुमति देता है, यही कारण है कि मानक सेवाएं वहीं रहती हैं: SSH के लिए 22, HTTP के लिए 80, HTTPS के लिए 443, DNS के लिए 53। net.ipv4.ip_unprivileged_port_start sysctl उस सीमा को बदल सकता है, लेकिन यह डिफ़ॉल्ट रूप से 1024 पर सेट होता है। 1024 से ऊपर की कोई भी संख्या सामान्य प्रोग्राम्स के लिए उपलब्ध होती है।

दो प्रकार के पोर्ट होते हैं, TCP और UDP, और एक में पोर्ट नंबर दूसरे के समान नंबर से अलग होता है। TCP एक connection-based प्रोटोकॉल है जिसका उपयोग अधिकांश सेवाएं जैसे SSH, HTTP और डेटाबेस करती हैं। UDP connectionless है और इसका उपयोग DNS और कुछ VPN जैसी चीजों के लिए किया जाता है। जब आप फायरवॉल खोलते हैं, तो आप आमतौर पर बताते हैं कि कौन सा उपयोग करना है, उदाहरण के लिए 22/tcp।

Listening का अर्थ है कि कोई प्रोग्राम किसी port पर प्रतीक्षा कर रहा है

जो प्रोग्राम connections प्राप्त करना चाहता है, वह kernel से किसी port पर "listen" करने का अनुरोध करता है। उस क्षण से वह port मशीन पर खुल जाता है और firewall के अधीन रहते हुए, प्रोग्राम वहां आने वाले किसी भी अनुरोध का उत्तर देता है। जिस port पर कुछ भी listening नहीं है, वह connections को सीधे अस्वीकार कर देता है। इसलिए किसी भी security check में पहला प्रश्न यह होता है: क्या listen कर रहा है, और कहाँ।

इसका उत्तर देने के लिए command ss है:

sudo ss -tlnp

इन flags का अर्थ है TCP (t), केवल listening sockets (l), numeric ports (n, ताकि आप 22 देखें, न कि ssh), और owning process (p)। एक सामान्य परिणाम:

State   Recv-Q  Local Address:Port   Process
LISTEN  0       0.0.0.0:22           sshd
LISTEN  0       127.0.0.1:5432       postgres
LISTEN  0       [::]:80              nginx

Process column आपको बताता है कि कौन सा प्रोग्राम किस port का स्वामी है, और इसी तरह आप उस चीज़ का पता लगाते हैं जिसे आप गलती से चालू छोड़ गए थे।

Local Address कॉलम वह हिस्सा है जो मायने रखता है

प्रत्येक पोर्ट के सामने दिए गए पते को ध्यान से पढ़ें, क्योंकि यह तय करता है कि सेवा तक कौन पहुँच सकता है। आप लगातार तीन स्थितियाँ देखेंगे।

0.0.0.0:22 का अर्थ है "इस मशीन के हर IPv4 पते पर सुनें," जिसमें इसका पब्लिक पता भी शामिल है। यदि फायरवॉल अनुमति दे, तो सेवा इंटरनेट से IPv4 के माध्यम से पहुँच योग्य है।

[::]:80 का अर्थ IPv6 के लिए भी यही है: हर IPv6 पते पर सुनें, जिसमें पब्लिक भी शामिल है। कई प्रोग्राम डिफ़ॉल्ट रूप से यहाँ bind होते हैं, और Linux पर एक :: सॉकेट अक्सर IPv4 को भी स्वीकार कर लेता है।

127.0.0.1:5432 का अर्थ है "केवल loopback पर सुनें।" 127.0.0.1 वह पता है जिसका उपयोग मशीन खुद से बात करने के लिए करती है, और कर्नल की डिफ़ॉल्ट सेटिंग्स के तहत यह कहीं और से routable नहीं होता है। यहाँ bind की गई सेवा केवल उसी सर्वर से पहुँच योग्य होती है, इंटरनेट से नहीं, भले ही आपका फायरवॉल उस पोर्ट की अनुमति दे दे। ऊपर दी गई Postgres लाइन डिफ़ॉल्ट रूप से सुरक्षित है। इसका अपवाद route_localnet नामक एक कर्नल सेटिंग है: यह डिफ़ॉल्ट रूप से बंद होती है, लेकिन कुछ टूल्स इसे चालू कर देते हैं (जैसे Kubernetes का kube-proxy), और इसके साथ सही routing या NAT नियमों के होने पर, loopback ट्रैफिक बाहर से आ सकता है। sysctl -a | grep route_localnet को हर लाइन पर = 0 दिखाना चाहिए।

व्यावहारिक नियम इससे सीधे निकलता है: एक डेटाबेस, कैश, या एडमिन पैनल जिसका उपयोग केवल आपके अपने एप्लिकेशन करते हैं, उसे 127.0.0.1 पर bind होना चाहिए, न कि 0.0.0.0 पर। यदि यह कभी भी पब्लिक पते पर नहीं सुनता है, तो हमलावर के पास पहुँचने के लिए कुछ भी नहीं होता है।

सुनना (Listening) और पहुँच योग्य होना (Reachable) एक नहीं है

एक और अंतर बहुत भ्रम को दूर करता है। मशीन पर पोर्ट का खुला होना, जिसका अर्थ है कि एक प्रोग्राम सुन रहा है, उस पोर्ट के बाहर से पहुँच योग्य होने से अलग है, जिसका अर्थ है कि फायरवॉल इसकी अनुमति देता है। रिमोट क्लाइंट के कनेक्ट होने के लिए दोनों का सच होना आवश्यक है। क्लाइंट साइड से ये दोनों विफलताएं अलग दिखती हैं: एक कनेक्शन जो refused हो जाता है, उसका आमतौर पर मतलब है कि कुछ भी नहीं सुन रहा था, जबकि एक जो अटक जाता है और फिर time out हो जाता है, उसका आमतौर पर मतलब है कि फायरवॉल ने पैकेट को ड्रॉप कर दिया है, जो कि ठीक वही है जो वे दो SSH त्रुटियां आपको बता रही हैं।

तो नियंत्रण की दो परतें हैं। आप तय करते हैं कि क्या सुनना है, प्रत्येक सेवा का bind पता सेट करके। और आप तय करते हैं कि बाहरी दुनिया क्या पहुँच सकती है, एक फायरवॉल के साथ। एक अच्छी तरह से संचालित सर्वर दोनों का उपयोग करता है: सेवाएं केवल वहीं bind होती हैं जहाँ उन्हें आवश्यकता होती है, और एक फायरवॉल हर उस चीज़ को अस्वीकार करता है जिसकी आपने स्पष्ट रूप से अनुमति नहीं दी है। ss के साथ यह पढ़ना कि क्या सुन रहा है, पहला कदम है; फायरवॉल क्या अनुमति देता है यह तय करना दूसरा कदम है, जो UFW के साथ फायरवॉल 101 में कवर किया गया है।

यहाँ एक सूक्ष्मता है जो लोगों को परेशान करती है। IPv4 और IPv6 अलग-अलग हैं, और एक फायरवॉल जो केवल IPv4 को कवर करता है, वह [::] सेवाओं को IPv6 पर खुला छोड़ देता है। उस विशिष्ट जाल की अपनी पोस्ट है: IPv6 फायरवॉल ट्रैप।

FAQ

मैं अपने Linux सर्वर पर यह कैसे देखूँ कि कौन से पोर्ट खुले हैं?

TCP के लिए sudo ss -tlnp या UDP के लिए sudo ss -ulnp चलाएँ। यह हर listening सॉकेट, पोर्ट, वह local address जिस पर वह bind है, और उस प्रक्रिया को सूचीबद्ध करता है जो इसका मालिक है। Local Address कॉलम पढ़ें: 0.0.0.0 या [::] का अर्थ है कि सेवा नेटवर्क के लिए exposed है, जबकि 127.0.0.1 का अर्थ है कि यह केवल मशीन पर ही सुन रही है।

0.0.0.0 और 127.0.0.1 के बीच क्या अंतर है?

0.0.0.0 का अर्थ है "सभी IPv4 पतों पर सुनें," जिसमें पब्लिक पता भी शामिल है, ताकि सेवा तक नेटवर्क से पहुँचा जा सके। 127.0.0.1 लूपबैक है, वह पता जिसका उपयोग मशीन खुद से बात करने के लिए करती है, और कर्नल की डिफ़ॉल्ट सेटिंग्स के साथ यह कहीं और से routable नहीं है, इसलिए इससे bind की गई सेवा केवल स्थानीय रूप से पहुँच योग्य है। आंतरिक सेवाओं को 127.0.0.1 पर bind करें ताकि वे नेटवर्क से दूर रहें।

क्या मुझे किसी सेवा के काम करने के लिए फायरवॉल में पोर्ट खोलने की आवश्यकता है?

केवल उन सेवाओं के लिए जिन्हें अन्य मशीनों से पहुँचा जाना चाहिए। 127.0.0.1 पर bind की गई सेवा को किसी allow नियम की आवश्यकता नहीं है, क्योंकि डिफ़ॉल्ट कर्नल सेटिंग्स के साथ कोई भी बाहरी चीज़ वहाँ तक नहीं पहुँच सकती। 0.0.0.0 या [::] पर मौजूद सेवा को एक allow नियम की आवश्यकता होती है, जब आपका फायरवॉल डिफ़ॉल्ट रूप से आने वाले ट्रैफिक को अस्वीकार करता है, जो उसे करना चाहिए। यदि कोई फायरवॉल सक्रिय नहीं है, या इसकी नीति सब कुछ स्वीकार करती है, तो वह सेवा बिना किसी नियम के पहले से ही पहुँच योग्य है।

TCP पोर्ट और UDP पोर्ट के बीच क्या अंतर है?

TCP connection-based है और अधिकांश सेवाओं जैसे SSH, वेब सर्वर और डेटाबेस द्वारा उपयोग किया जाता है। UDP connectionless है और DNS और कुछ VPN द्वारा उपयोग किया जाता है। TCP और UDP में समान नंबर अलग-अलग पोर्ट होते हैं, इसलिए 53/tcp और 53/udp अलग हैं। जब आप फायरवॉल नियम लिखते हैं तो आप प्रोटोकॉल का नाम बताते हैं, उदाहरण के लिए 22/tcp।