Linux में पोर्ट क्या हैं और services कैसे listen करती हैं
पोर्ट सर्वर पर ट्रैफिक को सही सर्विस तक पहुँचाते हैं। ss कमांड का उपयोग करके यह जानें कि कौन सी सर्विस किस पोर्ट पर सक्रिय है और local व public पोर्ट में अंतर कैसे पहचानें।
पोर्ट वास्तव में क्या है
पोर्ट एक संख्या है जो एक सर्वर को एक साथ कई सेवाएं चलाने की अनुमति देती है, ताकि उनका ट्रैफिक आपस में न मिले। आपके VPS का एक IP address होता है, लेकिन उस पर एक साथ web server, SSH server और database चल सकते हैं। जब कोई packet आता है, तो operating system को यह जानना होता है कि वह किसके लिए है। पोर्ट संख्या ही इसका उत्तर है। Web traffic पोर्ट 443 पर जाता है, और SSH पोर्ट 22 पर। IP address packet को आपके सर्वर तक पहुँचाता है; पोर्ट उसे उस सर्वर पर सही program तक पहुँचाता है।
पोर्ट एक 16-bit संख्या है: 16 bits से 0 से 65535 तक की संख्याएं बनती हैं, और 0 reserved है, इसलिए व्यावहारिक रूप से पोर्ट 1 से 65535 तक होते हैं। 1024 से नीचे के पोर्ट "well-known" पोर्ट कहलाते हैं और इन्हें खोलने के लिए root access की आवश्यकता होती है, यही कारण है कि मानक सेवाएं वहीं रहती हैं: SSH के लिए 22, HTTP के लिए 80, HTTPS के लिए 443, DNS के लिए 53। 1024 से ऊपर की कोई भी संख्या सामान्य programs के लिए उपलब्ध होती है।
ये दो प्रकार के होते हैं, TCP और UDP, और एक में पोर्ट संख्या दूसरे के उसी नंबर से अलग होती है। TCP connection-based protocol है जिसका उपयोग अधिकांश सेवाएं करती हैं, जैसे SSH, HTTP और databases। UDP connectionless है और इसका उपयोग DNS और कुछ VPN जैसी चीजों के लिए किया जाता है। जब आप firewall खोलते हैं, तो आप आमतौर पर यह बताते हैं कि कौन सा protocol है, उदाहरण के लिए 22/tcp।
Listening का अर्थ है कि कोई प्रोग्राम किसी port पर प्रतीक्षा कर रहा है
जो प्रोग्राम connections प्राप्त करना चाहता है, वह kernel से किसी port पर "listen" करने का अनुरोध करता है। उस क्षण से वह port मशीन पर खुल जाता है और firewall के अधीन रहते हुए, प्रोग्राम वहां आने वाले किसी भी अनुरोध का उत्तर देता है। जिस port पर कुछ भी listen नहीं कर रहा है, वह connections को सीधे अस्वीकार कर देता है। इसलिए किसी भी security check में पहला प्रश्न यह होता है: क्या listen कर रहा है, और कहाँ।
इसका उत्तर देने के लिए command ss है:
sudo ss -tlnpइन flags का अर्थ है TCP (t), केवल listening sockets (l), numeric ports (n, ताकि आप 22 देखें, न कि ssh), और स्वामित्व रखने वाली 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 nginxProcess column आपको बताता है कि किस program के पास प्रत्येक port का स्वामित्व है, जिससे आप उस चीज़ का पता लगा सकते हैं जिसे आप गलती से चालू छोड़ गए थे।
Local Address कॉलम ही सबसे महत्वपूर्ण है
प्रत्येक port के सामने दिए गए address को ध्यान से पढ़ें, क्योंकि यही तय करता है कि service तक कौन पहुँच सकता है। आप लगातार तीन स्थितियाँ देखेंगे।
0.0.0.0:22 का अर्थ है "इस मशीन के हर IPv4 address पर listen करें," जिसमें इसका public address भी शामिल है। यदि firewall अनुमति दे, तो service internet से IPv4 के माध्यम से पहुँच योग्य है।
[::]:80 का अर्थ IPv6 के लिए भी यही है: हर IPv6 address पर listen करें, जिसमें public address भी शामिल है। कई programs default रूप से यहाँ bind होते हैं, और Linux पर एक :: socket अक्सर IPv4 connections को भी स्वीकार कर लेता है।
127.0.0.1:5432 का अर्थ है "केवल loopback पर listen करें।" 127.0.0.1 वह address है जिसका उपयोग मशीन खुद से बात करने के लिए करती है, और यह कहीं और से routable नहीं है। यहाँ bind की गई service केवल उसी server से पहुँच योग्य होती है, internet से कभी नहीं, चाहे आपका firewall कुछ भी कहे। ऊपर दी गई Postgres line अपनी बनावट के कारण सुरक्षित है।
इसका व्यावहारिक नियम सीधा है: एक database, cache, या admin panel जिसका उपयोग केवल आपके अपने applications करते हैं, उसे 127.0.0.1 पर bind होना चाहिए, न कि 0.0.0.0 पर। यदि यह कभी भी public address पर listen नहीं करता है, तो हमलावर के पास पहुँचने के लिए कुछ भी नहीं होगा।
Listening और reachable होना एक समान नहीं है
एक और अंतर बहुत सारी उलझन को दूर करता है। मशीन पर किसी port का open होना, जिसका अर्थ है कि कोई program listening mode में है, उस port के बाहर से reachable होने से अलग है, जिसका अर्थ है कि firewall उसे अनुमति देता है। remote client को connect करने के लिए दोनों का सत्य होना आवश्यक है। client side से ये दोनों विफलताएं अलग-अलग दिखती हैं: connection का refused होना यह दर्शाता है कि कुछ भी listening नहीं था, जबकि connection का hang होकर time out हो जाना आमतौर पर यह दर्शाता है कि firewall ने packet को drop कर दिया है, जो कि बिल्कुल वही है जो वे दो SSH errors आपको बता रही हैं।
अतः नियंत्रण की दो परतें हैं। आप यह तय करते हैं कि क्या listen करेगा, प्रत्येक service का bind address set करके। और आप यह तय करते हैं कि बाहरी दुनिया क्या access कर सकती है, firewall के साथ। एक अच्छी तरह से संचालित server दोनों का उपयोग करता है: services केवल वहीं bind होती हैं जहाँ उनकी आवश्यकता होती है, और firewall हर उस चीज़ को deny करता है जिसे आपने स्पष्ट रूप से अनुमति नहीं दी है। ss के साथ यह पढ़ना कि क्या listening है, पहला कदम है; firewall क्या अनुमति देता है यह तय करना दूसरा कदम है, जिसे firewalls 101 with UFW में कवर किया गया है।
यहाँ एक सूक्ष्म बात है जो लोगों को परेशान करती है। IPv4 और IPv6 अलग-अलग हैं, और जो firewall केवल IPv4 को कवर करता है, वह [::] services को IPv6 पर खुला छोड़ देता है। उस विशिष्ट trap पर एक अलग post है: the IPv6 firewall trap।
FAQ
अपने Linux सर्वर पर खुले हुए पोर्ट्स को कैसे देखें?
TCP के लिए sudo ss -tlnp या UDP के लिए sudo ss -ulnp चलाएं। यह हर listening socket, पोर्ट, जिस लोकल एड्रेस पर वह bound है, और उसके मालिक प्रोसेस की सूची दिखाता है। Local Address कॉलम को पढ़ें: 0.0.0.0 या [::] का मतलब है कि सर्विस नेटवर्क के लिए खुली है, जबकि 127.0.0.1 का मतलब है कि यह केवल मशीन पर ही listen कर रही है।
0.0.0.0 और 127.0.0.1 में क्या अंतर है?
0.0.0.0 का अर्थ है "सभी IPv4 एड्रेस पर listen करें," जिसमें पब्लिक एड्रेस भी शामिल है, इसलिए सर्विस तक नेटवर्क से पहुँचा जा सकता है। 127.0.0.1 लूपबैक है, वह एड्रेस जिसका उपयोग मशीन खुद से बात करने के लिए करती है, और यह कहीं और से routable नहीं है, इसलिए इससे bound सर्विस केवल स्थानीय रूप से ही पहुँच योग्य होती है। इंटरनल सर्विसेज को 127.0.0.1 पर bind करें ताकि वे कभी भी एक्सपोज न हों।
क्या किसी सर्विस के काम करने के लिए मुझे फायरवॉल में पोर्ट खोलना होगा?
केवल उन सर्विसेज के लिए जिन्हें दूसरी मशीनों से एक्सेस किया जाना आवश्यक है। 127.0.0.1 पर bound सर्विस के लिए किसी फायरवॉल नियम की आवश्यकता नहीं है क्योंकि बाहरी रूप से कोई भी उस तक नहीं पहुँच सकता। 0.0.0.0 या [::] पर मौजूद सर्विस के लिए ट्रैफिक की अनुमति देने हेतु फायरवॉल नियम की आवश्यकता होती है, और जब तक आप नियम न जोड़ें, तब तक इसे डिफ़ॉल्ट रूप से deny किया जाना चाहिए।
TCP पोर्ट और UDP पोर्ट में क्या अंतर है?
TCP कनेक्शन-आधारित है और इसका उपयोग अधिकांश सर्विसेज जैसे SSH, वेब सर्वर और डेटाबेस द्वारा किया जाता है। UDP कनेक्शन-रहित है और इसका उपयोग DNS और कुछ VPNs द्वारा किया जाता है। TCP और UDP में एक ही नंबर अलग-अलग पोर्ट होते हैं, इसलिए 53/tcp और 53/udp अलग-अलग हैं। जब आप फायरवॉल नियम लिखते हैं तो आप प्रोटोकॉल का नाम देते हैं, उदाहरण के लिए 22/tcp।