SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor

Linux-এ port কী এবং service কীভাবে listen করে

Linux-এ port কীভাবে traffic সঠিক service-এ পাঠায়, ss দিয়ে কোন port listen করছে তা পড়ুন, এবং local port ও public port-এর পার্থক্য বুঝুন।

একটি port আসলে কী

একটি port হলো এমন একটি number, যা একই server-এ একসঙ্গে একাধিক service চালাতে দেয় এবং তাদের network traffic মিশে যেতে বাধা দেয়। আপনার VPS-এর একটি IP address থাকতে পারে, কিন্তু একই সময়ে সেখানে web server, SSH server এবং database চলতে পারে। কোনো packet এলে operating system-কে জানতে হয় সেটি কোন service-এর জন্য। port number সেই পরিচয় দেয়। HTTPS traffic সাধারণত port 443-এ এবং SSH port 22-এ যায়। IP address packet-কে আপনার server-এ পৌঁছে দেয়; port সেটিকে ওই server-এর সঠিক program-এ পৌঁছে দেয়।

একটি port হলো 16-bit number। 16 bits-এর পরিসর 0 থেকে 65535 পর্যন্ত, তবে 0 সংরক্ষিত থাকায় বাস্তবে port 1 থেকে 65535 পর্যন্ত হয়। 1024-এর নিচের port-গুলোকে "well-known" port বলা হয়। ডিফল্টভাবে Linux শুধু root account অথবা CAP_NET_BIND_SERVICE capability-প্রাপ্ত program-কে এগুলো open করতে দেয়। এ কারণেই standard service-গুলো এখানে চলে: SSH-এর জন্য 22, HTTP-এর জন্য 80, HTTPS-এর জন্য 443 এবং DNS-এর জন্য 53। net.ipv4.ip_unprivileged_port_start sysctl এই সীমা পরিবর্তন করতে পারে, তবে ডিফল্ট মান 1024। 1024 এবং তার ওপরের port সাধারণ program-গুলো ব্যবহার করতে পারে।

port দুই ধরনের: TCP এবং UDP। একটির port number অন্যটির একই number থেকে আলাদা। TCP হলো connection-based protocol, যা SSH, HTTP এবং database-এর মতো অধিকাংশ service ব্যবহার করে। UDP connectionless এবং DNS ও কিছু VPN-এর মতো service-এ ব্যবহৃত হয়। Firewall-এ port open করার সময় সাধারণত কোন protocol ব্যবহার হবে তা উল্লেখ করতে হয়, যেমন 22/tcp।

Listening বলতে বোঝায় কোনো program একটি port-এর জন্য অপেক্ষা করছে

যে program connection গ্রহণ করতে চায়, সেটি kernel-কে একটি port-এ “listen” করতে বলে। এরপর ওই port মেশিনে open থাকে এবং firewall-এর নিয়ম প্রযোজ্য থাকা সাপেক্ষে program সেখানে আসা connection-এর উত্তর দেয়। কোনো port-এ কিছু listening না থাকলে সেটি connection প্রত্যাখ্যান করে। তাই যেকোনো security check-এর প্রথম প্রশ্ন হলো: কী listening করছে এবং কোথায়।

এর উত্তর পাওয়ার command হলো ss:

sudo ss -tlnp

Flag-গুলো TCP (t), শুধু listening socket (l), numeric port (n; তাই ssh-এর বদলে 22 দেখা যায়) এবং সংশ্লিষ্ট 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-এর মালিক program-এর নাম দেখা যায়। এভাবেই অনিচ্ছাকৃতভাবে চালু থাকা কোনো program শনাক্ত করা যায়।

Local Address column-টিই সবচেয়ে গুরুত্বপূর্ণ

প্রতিটি port-এর আগে থাকা address ভালোভাবে পড়ুন, কারণ service-এ কারা পৌঁছাতে পারবে তা এটি নির্ধারণ করে। আপনি নিয়মিত তিনটি অবস্থা দেখবেন।

0.0.0.0:22 অর্থ হলো এই machine-এর সব IPv4 address-এ listen করা, যার মধ্যে public address-ও আছে। Firewall অনুমতি দিলে service-টি IPv4-এর মাধ্যমে Internet থেকে পৌঁছানো যায়।

[::]:80 IPv6-এর জন্য একই অর্থ বহন করে: public address-সহ সব IPv6 address-এ listen করা। অনেক program ডিফল্টভাবে এখানে bind করে। Linux-এ একটি :: socket প্রায়ই IPv4 connection-ও গ্রহণ করে।

127.0.0.1:5432 অর্থ হলো শুধু loopback-এ listen করা। 127.0.0.1 হলো machine-এর নিজের সঙ্গে যোগাযোগের জন্য ব্যবহৃত address। Kernel-এর default settings অনুযায়ী এটি অন্য কোনো স্থান থেকে routable নয়। এখানে bind করা service শুধু একই server থেকে পৌঁছানো যায়; Internet থেকে নয়, এমনকি firewall port-টিতে অনুমতি দিলেও। উপরের Postgres line-টি ডিফল্টভাবে নিরাপদ। এর ব্যতিক্রম হলো route_localnet নামের kernel setting। এটি ডিফল্টভাবে বন্ধ থাকে, তবে কিছু tool এটি চালু করে, যেমন Kubernetes-এর kube-proxy। এটি চালু থাকলে এবং সঠিক routing বা NAT rule থাকলে loopback traffic বাইরে থেকে আসতে পারে। প্রতিটি line-এ sysctl -a | grep route_localnet-এর মান = 0 দেখা উচিত।

এ থেকে ব্যবহারিক নিয়মটি সরাসরি বোঝা যায়: database, cache বা admin panel যদি শুধু আপনার নিজের application-গুলো ব্যবহার করে, তাহলে সেটিকে 127.0.0.1-এ bind করা উচিত, 0.0.0.0-এ নয়। এটি যদি কখনও public address-এ listen না করে, attacker-এর জন্য সেখানে পৌঁছানোর কোনো পথ থাকে না।

Listening এবং reachable একই বিষয় নয়

আরেকটি পার্থক্য বুঝলে অনেক বিভ্রান্তি দূর হয়। Machine-এ কোনো port open থাকা, অর্থাৎ কোনো program সেখানে listening করা, এবং বাইরে থেকে ওই port-এ পৌঁছানো যাওয়া, অর্থাৎ firewall সেটি অনুমতি দেওয়া, এক বিষয় নয়। Remote client-এর connection স্থাপনের জন্য দুটিই সত্য হতে হবে। Client-এর দিক থেকে এই দুই ধরনের failure-ও আলাদা দেখায়: connection refused হলে সাধারণত কোনো program listening করছে না। অন্যদিকে connection স্থাপনের চেষ্টা চলতে থেকে পরে timeout হলে সাধারণত firewall packet drop করেছে। ঠিক ওই দুইটি SSH error যা বোঝায়।

তাই control-এর দুটি স্তর আছে। প্রতিটি service-এর bind address নির্ধারণ করে আপনি ঠিক করেন কোন address-এ service listen করবে। Firewall ব্যবহার করে আপনি ঠিক করেন বাইরের দিক থেকে কোন service-এ পৌঁছানো যাবে। সঠিকভাবে পরিচালিত server দুটিই ব্যবহার করে: service শুধু প্রয়োজনীয় address-এ bind করে এবং firewall-এ স্পষ্টভাবে অনুমোদন না করা সবকিছু deny করা থাকে। ss দিয়ে কোন service listening করছে তা দেখা প্রথম ধাপ। Firewall কী অনুমতি দিচ্ছে তা নির্ধারণ করা দ্বিতীয় ধাপ। এটি UFW দিয়ে firewalls 101-এ ব্যাখ্যা করা হয়েছে।

এখানে একটি সূক্ষ্ম বিষয় আছে, যা অনেকের সমস্যা তৈরি করে। IPv4 এবং IPv6 আলাদা। তাই শুধু IPv4 cover করা firewall থাকলে [::] service IPv6-এ খোলা থেকে যায়। এই নির্দিষ্ট সমস্যাটি IPv6 firewall trap-এ আলাদাভাবে ব্যাখ্যা করা হয়েছে।

FAQ

আমার Linux server-এ কোন port open আছে তা কীভাবে দেখব?

TCP-এর জন্য sudo ss -tlnp অথবা UDP-এর জন্য sudo ss -ulnp চালান। এটি প্রতিটি listening socket, port, socket-টি যে local address-এ bind করা আছে এবং সেটির owner process দেখায়। Local Address column-টি দেখুন: 0.0.0.0 অথবা [::] হলে service-টি network-এর জন্য exposed। আর 127.0.0.1 হলে service-টি শুধু machine-এর নিজের address-এ listen করছে।

0.0.0.0 এবং 127.0.0.1-এর মধ্যে পার্থক্য কী?

0.0.0.0 অর্থ হলো public address-সহ সব IPv4 address-এ listen করা। তাই service-টি network থেকে পৌঁছানো যায়। 127.0.0.1 হলো loopback, অর্থাৎ machine-এর নিজের সঙ্গে যোগাযোগের জন্য ব্যবহৃত address। Kernel-এর default settings অনুযায়ী এটি অন্য কোনো স্থান থেকে routable নয়। তাই এতে bind করা service শুধু locally পৌঁছানো যায়। Internal service-গুলোকে 127.0.0.1-এ bind করুন, যাতে সেগুলো network-এর বাইরে থাকে।

কোনো service কাজ করার জন্য কি firewall-এ একটি port open করতে হবে?

শুধু সেই service-এর জন্য, যেটিতে অন্য machine থেকে পৌঁছাতে হবে। 127.0.0.1-এ bind করা service-এর জন্য কোনো allow rule প্রয়োজন নেই, কারণ default kernel settings অনুযায়ী কোনো external source সেখানে পৌঁছাতে পারে না। আপনার firewall incoming traffic ডিফল্টভাবে deny করলে 0.0.0.0 অথবা [::]-এ চলা service-এর জন্য allow rule প্রয়োজন। Firewall-এর default policy এমনই হওয়া উচিত। কোনো firewall সক্রিয় না থাকলে, অথবা তার policy সবকিছু accept করলে, কোনো rule ছাড়াই service-টি ইতিমধ্যে reachable।

TCP port এবং UDP port-এর মধ্যে পার্থক্য কী?

TCP হলো connection-based এবং SSH, web server ও database-এর মতো অধিকাংশ service এটি ব্যবহার করে। UDP হলো connectionless এবং DNS ও কিছু VPN এটি ব্যবহার করে। TCP এবং UDP-তে একই number ব্যবহার হলেও port দুটি আলাদা। তাই 53/tcp এবং 53/udp ভিন্ন port। Firewall rule লেখার সময় protocol-টি উল্লেখ করতে হয়, যেমন 22/tcp।