SSD Nodes Learn Hosting plans →
मार्गदर्शक Matt Connorद्वारे Matt Connor

Linux मध्ये पोर्ट आणि सेवा कशा ऐकतात?

पोर्ट server वरील traffic योग्य सेवेकडे पाठवतो. ss वापरून कोणते ports listening आहेत ते पाहा आणि local port व public port यांतील फरक समजून घ्या.

पोर्ट म्हणजे प्रत्यक्षात काय

पोर्ट हा असा क्रमांक आहे, ज्यामुळे एका सर्व्हरवर एकाच वेळी अनेक सेवा चालवता येतात आणि त्यांचा network traffic एकमेकांत मिसळत नाही. तुमच्या VPS ला एक IP address असतो; मात्र त्यावर web server, SSH server आणि database एकाच वेळी चालू असू शकतात. एखादा packet आल्यावर तो यापैकी कोणत्या सेवेसाठी आहे हे operating system ला ठरवावे लागते. पोर्ट क्रमांक याचे उत्तर देतो. HTTPS traffic सामान्यतः port 443 वर, तर SSH traffic port 22 वर जाते. IP address packet तुमच्या सर्व्हरपर्यंत पोहोचवतो; पोर्ट तो packet त्या सर्व्हरवरील योग्य program पर्यंत पोहोचवतो.

पोर्ट हा 16-bit क्रमांक असतो. 16 bits मुळे 0 ते 65535 पर्यंत क्रमांक मिळतात. 0 राखीव असल्यामुळे प्रत्यक्षात ports 1 ते 65535 पर्यंत असतात. 1024 पेक्षा कमी ports हे "well-known" ports आहेत. Linux मध्ये default configuration नुसार ते फक्त root किंवा CAP_NET_BIND_SERVICE capability दिलेल्या program ला उघडता येतात. म्हणून standard services येथे चालतात: SSH साठी 22, HTTP साठी 80, HTTPS साठी 443 आणि DNS साठी 53. net.ipv4.ip_unprivileged_port_start sysctl ही मर्यादा बदलू शकतो; मात्र त्याची default value 1024 असते. 1024 पासून पुढील कोणताही पोर्ट सामान्य programs वापरू शकतात.

Ports चे दोन प्रकार आहेत: TCP आणि UDP. एका प्रकारातील पोर्ट क्रमांक आणि दुसऱ्या प्रकारातील तोच क्रमांक स्वतंत्र असतो. TCP हा connection-based protocol आहे आणि SSH, HTTP तसेच databases यांसारख्या बहुतांश services तो वापरतात. UDP हा connectionless protocol आहे. DNS आणि काही VPNs साठी त्याचा वापर होतो. Firewall उघडताना सामान्यतः कोणता protocol वापरायचा हे नमूद करावे लागते. उदाहरणार्थ 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              nginx

Process column प्रत्येक port कोणत्या प्रोग्रामच्या मालकीचा आहे हे दाखवतो. यामुळे अनावश्यकपणे सुरू ठेवलेला प्रोग्राम शोधता येतो.

Local Address column महत्त्वाचा भाग आहे

प्रत्येक पोर्टसमोरील address काळजीपूर्वक वाचा, कारण त्या सेवेपर्यंत कोण पोहोचू शकते हे त्यावर ठरते. तुम्हाला वारंवार दिसणाऱ्या तीन परिस्थिती आहेत.

0.0.0.0:22 याचा अर्थ या machine कडे असलेल्या प्रत्येक IPv4 address वर, public address सहित, सेवा listen करते. Firewall परवानगी देत असल्यास ही सेवा IPv4 द्वारे internet वरून पोहोचण्यायोग्य असते.

[::]:80 याचा IPv6 साठी हाच अर्थ आहे: public address सहित प्रत्येक IPv6 address वर सेवा listen करते. अनेक programs येथे default ने bind होतात. Linux मध्ये :: socket अनेकदा IPv4 connections देखील स्वीकारतो.

127.0.0.1:5432 याचा अर्थ सेवा फक्त loopback वर listen करते. 127.0.0.1 हा machine स्वतःशी communication करण्यासाठी वापरत असलेला address आहे. Kernel च्या default settings नुसार तो इतर कोणत्याही ठिकाणाहून routable नसतो. येथे bind केलेली सेवा फक्त त्याच सर्व्हरवरून पोहोचण्यायोग्य असते; internet वरून नाही, firewall ने त्या पोर्टला परवानगी दिली तरीही. वरील Postgres line default ने सुरक्षित आहे. याला अपवाद म्हणजे route_localnet नावाची kernel setting. ती default ने बंद असते; मात्र काही tools ती सुरू करतात, जसे Kubernetes मधील kube-proxy. ही setting सुरू असल्यास आणि योग्य routing किंवा NAT rules असल्यास loopback traffic बाहेरून येऊ शकतो. प्रत्येक line वर sysctl -a | grep route_localnet ने = 0 दाखवले पाहिजे.

यातून व्यावहारिक नियम स्पष्ट होतो: तुमचे applications वापरत असलेला database, cache किंवा admin panel 0.0.0.0 ऐवजी 127.0.0.1 वर bind करावा. ती सेवा public address वर listen करत नसेल, तर attacker साठी तिथे पोहोचण्यास काहीही उपलब्ध नसते.

Listening आणि reachable हे एकसारखे नाही

आणखी एक फरक समजून घेतल्यास बराच गोंधळ टाळता येतो. Machine वर पोर्ट open असणे, म्हणजे एखादा program त्यावर listen करणे, आणि बाहेरून तो पोर्ट reachable असणे, म्हणजे firewall त्याला परवानगी देणे, या दोन वेगळ्या गोष्टी आहेत. Remote client ने connect करण्यासाठी दोन्ही गोष्टी खऱ्या असणे आवश्यक आहे. Client च्या बाजूने या दोन failures वेगवेगळ्या दिसतात. Connection refused झाल्यास सामान्यतः कोणताही program listen करत नसतो. Connection hang होऊन timeout झाल्यास सामान्यतः firewall ने packet drop केलेला असतो. त्या दोन SSH errors मधून हेच स्पष्ट होते.

म्हणून control चे दोन स्तर आहेत. प्रत्येक service चा bind address सेट करून कोणत्या address वर ती listen करेल हे तुम्ही ठरवता. Firewall वापरून बाहेरील जगाला कोणत्या services पर्यंत पोहोचता येईल हे तुम्ही ठरवता. व्यवस्थित व्यवस्थापित सर्व्हर दोन्ही वापरतो: services आवश्यक असलेल्या address वरच bind होतात आणि firewall ने स्पष्टपणे परवानगी न दिलेली प्रत्येक गोष्ट deny केली जाते. ss वापरून कोणते ports listening आहेत हे पाहणे हा पहिला टप्पा आहे. Firewall कशाला परवानगी देतो हे ठरवणे हा दुसरा टप्पा आहे. यासाठी UFW सह firewalls 101 पहा.

यामध्ये एक सूक्ष्म मुद्दा आहे. IPv4 आणि IPv6 स्वतंत्र आहेत. फक्त IPv4 ला लागू होणारा firewall [::] services IPv6 वर उघड्या ठेवतो. या विशिष्ट समस्येवर स्वतंत्र लेख आहे: IPv6 firewall ची समस्या.

FAQ

माझ्या Linux server वर कोणते ports open आहेत हे कसे पाहू?

TCP साठी sudo ss -tlnp किंवा UDP साठी sudo ss -ulnp चालवा. यामुळे प्रत्येक listening socket, पोर्ट, तो bind केलेला local address आणि तो वापरणारा process यांची यादी मिळते. Local Address column वाचा: 0.0.0.0 किंवा [::] याचा अर्थ service network साठी exposed आहे, तर 127.0.0.1 याचा अर्थ ती फक्त machine वरच listen करते.

0.0.0.0 आणि 127.0.0.1 यांच्यात काय फरक आहे?

0.0.0.0 याचा अर्थ public address सहित सर्व IPv4 addresses वर listen करणे. त्यामुळे service network वरून पोहोचण्यायोग्य असते. 127.0.0.1 हा loopback आहे. Machine स्वतःशी communication करण्यासाठी हा address वापरते. Kernel च्या default settings नुसार तो इतर कोणत्याही ठिकाणाहून routable नसतो. त्यामुळे त्यावर bind केलेली service फक्त locally पोहोचण्यायोग्य असते. Internal services 127.0.0.1 वर bind करा, म्हणजे त्या network वर उघड्या राहणार नाहीत.

एखादी service कार्य करण्यासाठी firewall मध्ये पोर्ट उघडणे आवश्यक आहे का?

ज्या services इतर machines कडून पोहोचण्यायोग्य असणे आवश्यक आहे, त्यांच्यासाठीच. 127.0.0.1 वर bind केलेल्या service साठी allow rule आवश्यक नाही, कारण kernel च्या default settings नुसार कोणतेही external connection तिच्यापर्यंत पोहोचू शकत नाही. तुमचा firewall incoming traffic default ने deny करत असल्यास, 0.0.0.0 किंवा [::] वर चालणाऱ्या service साठी allow rule आवश्यक आहे. तसे असले पाहिजे. Firewall सक्रिय नसेल किंवा त्याची policy सर्व traffic स्वीकारत असेल, तर कोणत्याही rule शिवाय ती service आधीपासूनच पोहोचण्यायोग्य असते.

TCP port आणि UDP port यांच्यात काय फरक आहे?

TCP हा connection-based protocol आहे. SSH, web servers आणि databases यांसारख्या बहुतांश services तो वापरतात. UDP हा connectionless protocol आहे. DNS आणि काही VPNs साठी त्याचा वापर होतो. TCP आणि UDP मधील समान क्रमांकाचे ports स्वतंत्र असतात. त्यामुळे 53/tcp आणि 53/udp हे वेगवेगळे ports आहेत. Firewall rules लिहिताना protocol नमूद करा. उदाहरणार्थ 22/tcp.