Linux मध्ये पोर्ट आणि सेवा कशा ऐकतात?
पोर्ट server वरील traffic योग्य सेवेकडे पाठवतो. ss वापरून कोणते ports listening आहेत ते पाहा आणि local port व public port यांतील फरक समजून घ्या.
पोर्ट म्हणजे नेमके काय
पोर्ट हा एक क्रमांक असतो. त्याच्या मदतीने एकाच सर्व्हरवर अनेक सेवा एकाच वेळी चालवता येतात आणि त्यांचा network traffic एकमेकांत मिसळत नाही. तुमच्या VPS कडे एक IP address असतो. मात्र त्यावर web server, SSH server आणि database एकाच वेळी चालू असू शकतात. एखादे packet आल्यावर ते कोणत्या सेवेसाठी आहे हे operating system ला ठरवावे लागते. पोर्ट क्रमांक त्याचे उत्तर देतो. Web traffic port 443 वर जाते आणि SSH port 22 वर जाते. IP address मुळे packet तुमच्या सर्व्हरपर्यंत पोहोचते. पोर्टमुळे ते त्या सर्व्हरवरील योग्य program पर्यंत पोहोचते.
पोर्ट हा 16-bit क्रमांक असतो. 16 bits मुळे 0 ते 65535 पर्यंत क्रमांक मिळतात. 0 राखीव असल्यामुळे प्रत्यक्षात पोर्ट 1 ते 65535 या श्रेणीत असतात. 1024 पेक्षा कमी पोर्टना "well-known" ports म्हणतात. ते उघडण्यासाठी root आवश्यक असतो. म्हणून standard services या पोर्टवर चालतात: SSH साठी 22, HTTP साठी 80, HTTPS साठी 443 आणि DNS साठी 53. 1024 पेक्षा जास्त क्रमांक सामान्य programs साठी वापरता येतात.
पोर्टचे TCP आणि UDP असे दोन प्रकार असतात. एका प्रकारातील पोर्ट क्रमांक दुसऱ्या प्रकारातील त्याच क्रमांकापेक्षा स्वतंत्र असतो. TCP हा connection-based protocol आहे. SSH, HTTP आणि databases यांसारख्या बहुतेक services तो वापरतात. UDP हा connectionless असतो. DNS आणि काही VPNs सारख्या सेवांसाठी तो वापरला जातो. Firewall उघडताना साधारणपणे यापैकी कोणता प्रकार वापरायचा ते नमूद करावे लागते; उदाहरणार्थ 22/tcp.
Listening म्हणजे प्रोग्राम पोर्टवर कनेक्शनची प्रतीक्षा करत आहे
कनेक्शन स्वीकारायचे असलेल्या प्रोग्रामकडून kernel ला पोर्टवर "listen" करण्याची विनंती केली जाते. त्यानंतर मशीनवर तो पोर्ट open होतो आणि firewall च्या नियमांच्या अधीन राहून तेथे येणाऱ्या प्रत्येक विनंतीला प्रोग्राम उत्तर देतो. त्या पोर्टवर कोणताही प्रोग्राम listening करत नसेल, तर कनेक्शन नाकारले जाते. त्यामुळे कोणत्याही security check मधील पहिला प्रश्न असा असतो: कोणता प्रोग्राम listening करत आहे आणि कुठे?
याचे उत्तर देणारी command म्हणजे ss:
sudo ss -tlnpहे flags TCP (t), फक्त listening sockets (l), numeric ports (n, त्यामुळे ssh ऐवजी 22 दिसते) आणि मालकीचा process (p) दर्शवतात. सामान्य result:
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 प्रत्येक port कोणत्या प्रोग्रामच्या मालकीचा आहे हे दाखवतो. यामुळे अनावश्यकपणे सुरू ठेवलेला प्रोग्राम शोधता येतो.
समोर असलेला Local Address स्तंभ महत्त्वाचा आहे
प्रत्येक पोर्टसमोरील address काळजीपूर्वक वाचा, कारण सेवेपर्यंत कोण पोहोचू शकते हे त्यावर ठरते. तुम्हाला खालील तीन स्थिती वारंवार दिसतील.
0.0.0.0:22 याचा अर्थ, या मशीनकडे असलेल्या प्रत्येक IPv4 address वर listen करणे, त्यातील public address सहित. Firewall परवानगी देत असल्यास, ही सेवा IPv4 द्वारे internet वरून पोहोचण्यायोग्य असते.
[::]:80 याचा IPv6 साठी तोच अर्थ आहे: public address सहित प्रत्येक IPv6 address वर listen करणे. अनेक प्रोग्राम्स default म्हणून येथे bind होतात. Linux मध्ये :: socket IPv4 विनंत्याही स्वीकारू शकतो.
127.0.0.1:5432 याचा अर्थ, फक्त loopback वर listen करणे. 127.0.0.1 हा मशीन स्वतःशी संवाद साधण्यासाठी वापरत असलेला address आहे. तो इतर कोणत्याही ठिकाणाहून route करता येत नाही. येथे bind केलेली सेवा फक्त त्याच server वरून पोहोचण्यायोग्य असते; firewall काहीही सांगत असला तरी internet वरून नाही. वरील Postgres ओळ रचनेनुसारच सुरक्षित आहे.
यातून व्यावहारिक नियम स्पष्ट होतो: फक्त तुमचे स्वतःचे applications वापरत असलेला database, cache किंवा admin panel 127.0.0.1 वर bind केला पाहिजे, 0.0.0.0 वर नाही. सेवा public address वर कधीही listen करत नसेल, तर attacker साठी तिच्यापर्यंत पोहोचण्याचा मार्गच उपलब्ध नसतो.
Listening म्हणजे reachable असणे नाही
आणखी एक फरक समजून घेतल्यास बराच गोंधळ टाळता येतो. मशीनवरील पोर्ट open असणे, म्हणजे एखादा प्रोग्राम त्या पोर्टवर listening करत असणे, आणि तो पोर्ट बाहेरून reachable असणे, म्हणजे firewall त्याला परवानगी देत असणे, या दोन वेगळ्या गोष्टी आहेत. Remote client कनेक्ट होण्यासाठी दोन्ही अटी पूर्ण असणे आवश्यक आहे. Client च्या बाजूने या दोन अपयशांचे स्वरूपही वेगळे दिसते: connection refused म्हणजे कोणताही प्रोग्राम listening करत नव्हता; connection बराच वेळ थांबून timeout होणे म्हणजे firewall ने packet drop केला असण्याची शक्यता असते. हेच त्या दोन SSH त्रुटी सांगतात.
म्हणून नियंत्रणाचे दोन स्तर आहेत. प्रत्येक service चा bind address सेट करून कोणते प्रोग्राम listening करतील हे तुम्ही ठरवता. Firewall वापरून बाहेरील जगाला काय reachable असेल हे तुम्ही ठरवता. व्यवस्थित व्यवस्थापित सर्व्हरमध्ये दोन्ही वापरले जातात: services फक्त आवश्यक त्या address वर bind होतात आणि firewall ने स्पष्टपणे परवानगी न दिलेली प्रत्येक गोष्ट deny केली जाते. ss वापरून कोणते प्रोग्राम listening करत आहेत हे पाहणे ही पहिली पायरी आहे; firewall कशाला परवानगी देतो हे ठरवणे ही दुसरी पायरी आहे. याची माहिती UFW सह firewalls 101 मध्ये दिली आहे.
येथे एक सूक्ष्म मुद्दा आहे, ज्यामुळे अनेकांना समस्या येते. IPv4 आणि IPv6 स्वतंत्र आहेत. त्यामुळे फक्त IPv4 साठी लागू असलेला firewall IPv6 वरील [::] services उघड्या ठेवतो. या विशिष्ट समस्येवर स्वतंत्र लेख आहे: IPv6 firewall trap.
FAQ
माझ्या Linux सर्व्हरवर कोणते पोर्ट खुले आहेत हे कसे पाहू?
TCP साठी sudo ss -tlnp किंवा UDP साठी sudo ss -ulnp चालवा. यात प्रत्येक listening socket, पोर्ट, तो ज्या स्थानिक पत्त्यावर bind आहे तो पत्ता आणि तो वापरणारी process यांची यादी मिळते. Local Address स्तंभ पहा: 0.0.0.0 किंवा [::] याचा अर्थ सेवा network वर उपलब्ध आहे, तर 127.0.0.1 याचा अर्थ ती फक्त त्याच मशीनवर listening करते.
0.0.0.0 आणि 127.0.0.1 मध्ये काय फरक आहे?
0.0.0.0 याचा अर्थ "सर्व IPv4 पत्त्यांवर listening करा" असा होतो. यात सार्वजनिक पत्त्याचाही समावेश असतो. त्यामुळे सेवा network वरून पोहोचण्यायोग्य होते. 127.0.0.1 हा loopback पत्ता आहे. मशीन स्वतःशी संवाद साधण्यासाठी तो वापरते. तो इतर कोणत्याही ठिकाणाहून routable नसतो. त्यामुळे त्यावर bind केलेली सेवा फक्त स्थानिक पातळीवर उपलब्ध असते. Internal सेवा 127.0.0.1 वर bind करा, म्हणजे त्या कधीही सार्वजनिकरीत्या exposed होणार नाहीत.
एखादी सेवा कार्य करण्यासाठी firewall मध्ये पोर्ट खुले करणे आवश्यक आहे का?
फक्त इतर मशीनवरून पोहोचणे आवश्यक असलेल्या सेवांसाठी. 127.0.0.1 वर bind केलेल्या सेवेला firewall rule आवश्यक नसतो, कारण बाहेरून कोणतीही विनंती तिच्यापर्यंत पोहोचू शकत नाही. 0.0.0.0 किंवा [::] वर चालणाऱ्या सेवेसाठी traffic परवानगी देणारा firewall rule आवश्यक असतो. असा rule जोडत नाही तोपर्यंत traffic default ने नाकारलेला असावा.
TCP पोर्ट आणि UDP पोर्टमध्ये काय फरक आहे?
TCP हे connection-based असून SSH, web servers आणि databases यांसारख्या बहुतांश सेवांसाठी वापरले जाते. UDP हे connectionless असून DNS आणि काही VPNs साठी वापरले जाते. TCP आणि UDP मधील समान क्रमांक स्वतंत्र पोर्ट दर्शवतात. त्यामुळे 53/tcp आणि 53/udp वेगवेगळे आहेत. Firewall rules लिहिताना protocol नमूद करा. उदाहरणार्थ, 22/tcp.