SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-09-04

Rocky Linux বা AlmaLinux-এ SSH port পরিবর্তন করার নিয়ম

Rocky Linux বা AlmaLinux-এ SSH port পরিবর্তন করতে firewalld, SELinux এবং sshd_config কনফিগারেশন প্রয়োজন। ভুল এড়াতে এবং সংযোগ বিচ্ছিন্ন হওয়া রোধ করতে এই ধাপগুলো অনুসরণ করুন।

কেন SSH port পরিবর্তন করতে এখানে তিনটি ধাপ অনুসরণ করতে হয়

Rocky Linux, AlmaLinux, CentOS Stream বা Fedora-তে SSH port পরিবর্তন করার জন্য শুধুমাত্র একটি এডিট যথেষ্ট নয়। নতুন পোর্টে সংযোগ কাজ করবে কি না, তা নির্ধারণে তিনটি আলাদা সিস্টেম ভূমিকা রাখে। firewalld সিদ্ধান্ত নেয় যে প্যাকেটটি মেশিনে পৌঁছাবে কি না। SELinux সিদ্ধান্ত নেয় যে sshd-কে ওই পোর্ট নম্বরে bind করার অনুমতি দেওয়া হবে কি না। sshd_config নির্ধারণ করে যে daemon কোন পোর্টের জন্য অনুরোধ করবে। SELinux ধাপটি বাদ দিলে daemon চালু হতে অস্বীকার করবে। firewalld ধাপটি বাদ দিলে daemon চালু হবে এবং listen করবে, কিন্তু কেউ সেখানে পৌঁছাতে পারবে না।

Ubuntu-তে একই কাজ একটি এডিট এবং রিস্টার্টের মাধ্যমেই সম্পন্ন হয়, কারণ Ubuntu SELinux-এর পরিবর্তে AppArmor ব্যবহার করে এবং এমন কোনো প্রোফাইল দেয় না যা sshd-এর bind করার পোর্টকে সীমাবদ্ধ করে। যদি সেখানে ufw চালু থাকে, তবে আপনাকে কেবল একটি রুল যোগ করতে হবে। পার্থক্যটি মূলত এখানেই। RHEL ফ্যামিলির ডিস্ট্রিবিউশনগুলোতে নতুন ইন্সটলেশনের সময় firewalld চালু থাকে এবং SELinux enforcing মোডে থাকে, আর উভয়ই পোর্ট নম্বরের বিষয়ে সতর্ক থাকে।

এই কাজগুলো নিচের ক্রমানুসারে করুন যাতে প্রতিটি ধাপের সময় আপনার বর্তমান সেশনটি চালু থাকে:

  1. firewalld-এ নতুন পোর্টটি খুলুন, তবে আপাতত পোর্ট 22 খোলা রাখুন।
  2. semanage ব্যবহার করে নতুন পোর্টের জন্য SELinux label যোগ করুন।
  3. sshd কনফিগারেশনে পোর্টটি সেট করুন।
  4. sshd রিস্টার্ট করুন, তারপর প্রথম টার্মিনালটি বন্ধ করার আগে দ্বিতীয় একটি টার্মিনাল থেকে নতুন পোর্টে লগইন করুন।
কাজ শুরু করার আগে আপনার প্রোভাইডারের ওয়েব কনসোল (VNC বা সিরিয়াল) খুঁজে বের করুন এবং নিশ্চিত করুন যে আপনি এর মাধ্যমে লগইন করতে পারছেন। যদি পরিবর্তনটি ভুল হয়, তবে এই কনসোলটিই আপনার পুনরায় প্রবেশের একমাত্র উপায়। পোর্ট পরিবর্তন করার সময় নিজের সার্ভার থেকে নিজে লক হয়ে যাওয়া একজন ব্যবহারকারীর জন্য সবচেয়ে সাধারণ ভুলগুলোর একটি।

প্রথমে semanage ইনস্টল করুন

semanage হলো এমন একটি টুল যা SELinux পলিসি সেটিংস এডিট করে, এবং Rocky Linux বা AlmaLinux-এর মিনিমাল ইনস্টলেশনে এটি থাকে না। এটি policycoreutils-python-utils প্যাকেজের অন্তর্ভুক্ত।

sudo dnf install -y policycoreutils-python-utils

প্যাকেজটি ইনস্টল করার আগে কমান্ডটি চালালে sudo: semanage: command not found এরর দেখায়, আর এখানেই অনেক পাঠক মনে করেন যে SELinux ইনস্টল করা নেই এবং ধাপটি বাদ দিয়ে যান। SELinux ইনস্টল করা আছে। শুধুমাত্র ম্যানেজমেন্ট টুলটি অনুপস্থিত। যদি dnf সিনট্যাক্স আপনার কাছে নতুন মনে হয়, তবে dnf এবং apt কমান্ডের সমতুল্য কমান্ডগুলো দেখে আপনি আপনার পরিচিত কমান্ডের সাথে মিলিয়ে নিতে পারেন।

একটি পোর্ট নির্বাচন করুন এবং নিশ্চিত করুন যে এটি অন্য কোনো প্রসেস ব্যবহার করছে না

1024 থেকে 65535-এর মধ্যে যেকোনো খালি TCP পোর্ট ব্যবহার করা যাবে। কোনো পোর্ট চূড়ান্ত করার আগে দুটি বিষয় পরীক্ষা করে নিন:

sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222

প্রথম কমান্ডটি দেখাবে যে কোনো প্রসেস ইতিমধ্যে সেই পোর্টে লিসেন (listen) করছে কি না। দ্বিতীয়টি দেখাবে SELinux পলিসি অনুযায়ী পোর্টটি অন্য কোনো সার্ভিস টাইপের জন্য বরাদ্দ করা আছে কি না। একটি খালি পোর্ট হলে কোনো কমান্ডই কোনো আউটপুট দেবে না। যদি পলিসি ইতিমধ্যে পোর্টটি দখল করে রাখে, তবে 2 নম্বর ধাপের semanage port -a কমান্ডটি ValueError: Port tcp/2222 already defined এর মাধ্যমে ব্যর্থ হবে। এর সমাধান হলো অন্য একটি পোর্ট নম্বর বেছে নেওয়া।

এই গাইডে উদাহরণ হিসেবে 2222 পোর্টটি ব্যবহার করা হয়েছে। এটি 22 পোর্টের পরেই স্ক্যানারদের পছন্দের তালিকায় থাকে, তাই বাস্তব সার্ভারে কাজ করার সময় তুলনামূলক কম পরিচিত কোনো পোর্ট বেছে নিন।

ধাপ 1: firewalld-এ পোর্টটি ওপেন করুন

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

--permanent কমান্ডটি ডিস্কে থাকা জোন ফাইলে রুলটি লিখে রাখে কিন্তু চলমান ফায়ারওয়ালে কোনো পরিবর্তন করে না। --reload কমান্ডটি ডিস্কে থাকা কনফিগারেশনকে চলমান ফায়ারওয়ালে লোড করে। রিলোড না করলে রুলটি তৈরি থাকলেও তা কার্যকর হয় না যতক্ষণ না firewalld পরবর্তীবার রিস্টার্ট হয়; এই কারণেই অনেক সময় মনে হয় যে পুরো প্রক্রিয়াটি কোনো কারণ ছাড়াই ব্যর্থ হয়েছে।

আপাতত ssh সার্ভিস এন্ট্রিটি পরিবর্তন করবেন না। এই এন্ট্রিটি পোর্ট 22 খোলা রাখে এবং পরীক্ষার সময় এটি আপনার ব্যাকআপ হিসেবে কাজ করবে।

আপনার প্রোভাইডারের কন্ট্রোল প্যানেলটিও পরীক্ষা করুন। অনেক হোস্টিং প্রোভাইডার অপারেটিং সিস্টেমের বাইরে VPS-এর সামনে একটি নেটওয়ার্ক ফায়ারওয়াল চালায়, তাই firewalld-এ পোর্ট ওপেন করার পরেও upstream থেকে তা ব্লক হতে পারে। VPS-এর জন্য firewalld-এর মৌলিক নির্দেশিকা-তে জোন এবং রানটাইম বনাম পার্মানেন্ট কনফিগারেশনের পার্থক্য সম্পর্কে আলোচনা করা হয়েছে, যদি এই বিষয়টি আপনার কাছে নতুন হয়।

ধাপ 2: SELinux-এর জন্য পোর্ট লেবেল করা

sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t

-a একটি নতুন পোর্ট অ্যাসাইনমেন্ট যোগ করে। -t ssh_port_t হলো সেই টাইপ যা SSH পোর্টগুলোতে ব্যবহৃত হয়। দ্বিতীয় কমান্ডটি ssh_port_t-এর আওতাভুক্ত সমস্ত পোর্ট তালিকাভুক্ত করে, যাতে ডেমনে হাত দেওয়ার আগে আপনি নিশ্চিত হতে পারেন যে আপনার পোর্ট নম্বরটি সঠিকভাবে যুক্ত হয়েছে।

কেন SELinux পোর্টটিকে ব্লক করে

SELinux (Security-Enhanced Linux) সিস্টেমের প্রতিটি অবজেক্টকে একটি লেবেল প্রদান করে, এবং TCP পোর্ট নম্বরগুলোও অন্যান্য অবজেক্টের মতোই। SSH daemon একটি ডোমেইন-এর মধ্যে সীমাবদ্ধ থাকে যাকে sshd_t বলা হয়। পলিসি অনুযায়ী sshd_t-কে ssh_port_t লেবেলযুক্ত TCP পোর্টে বাইন্ড করার অনুমতি দেওয়া হয়, এবং ডিফল্টভাবে শুধুমাত্র 22 নম্বর পোর্টেই এই লেবেল থাকে। আপনি যদি daemon-কে 2222 পোর্টে বাইন্ড করতে বলেন, তবে কার্নেল লেবেলটি পরীক্ষা করে, সেই নম্বরের জন্য নির্ধারিত জেনেরিক টাইপ পলিসি খুঁজে পায় এবং সকেটের ওপর name_bind অনুমতি প্রত্যাখ্যান করে।

এ কারণেই এই ব্যর্থতাটি ফায়ারওয়ালের সমস্যার মতো মনে হয় না। লিসেনিং সকেট তৈরি হওয়ার আগেই কার্নেল এটি প্রত্যাখ্যান করে, তাই sshd ত্রুটি রিপোর্ট করে বন্ধ হয়ে যায়। ফায়ারওয়ালের সমস্যাটি ঠিক এর বিপরীত: সেখানে daemon সচল ও সুস্থ থাকে, কিন্তু প্যাকেটগুলো আসার পথে বাতিল হয়ে যায়।

getenforce আপনাকে জানায় যে সার্ভারটি বর্তমানে কোন মোডে আছে। Permissive মোডে কোনো ডিনায়াল রেকর্ড করা হলেও তা কার্যকর করা হয় না, তাই পোর্ট পরিবর্তনের বিষয়টি কাজ করছে বলে মনে হতে পারে, কিন্তু যখনই কেউ setenforce 1 চালায় বা সার্ভারটি রিবুট হয়ে enforcing মোডে আসে, তখনই এটি কাজ করা বন্ধ করে দেয়। যেকোনো মোডেই পোর্টটিকে লেবেল করে রাখা উচিত। সার্ভারের জন্য SELinux-এর মৌলিক নির্দেশিকা-তে মোড, কনটেক্সট এবং বুলিয়ান সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে। পোর্টই একমাত্র অবজেক্ট নয় যেখানে আপনি এই সমস্যার সম্মুখীন হতে পারেন; একই পলিসি একটি কন্টেইনারকে মাউন্ট করা হোস্ট ডিরেক্টরি পড়তে বাধা দেয় যতক্ষণ না সেই পাথটিকে পুনরায় লেবেল করা হয়। এ কারণেই Rocky Linux বা AlmaLinux-এ Docker ইনস্টল করার প্রক্রিয়ায় একটি SELinux ধাপ থাকে, যা Ubuntu-এর নির্দেশিকায় কখনোই উল্লেখ করা হয় না।

ধাপ 3: sshd কনফিগারেশনে পোর্ট সেট করা

Rocky Linux 9 ও 10, AlmaLinux 9 ও 10 এবং বর্তমান Fedora-তে /etc/ssh/sshd_config একটি include লাইন দিয়ে শুরু হয়, তাই আপনার পরিবর্তনের জন্য একটি drop-in ফাইল ব্যবহার করাই সবচেয়ে পরিচ্ছন্ন পদ্ধতি। এতে প্যাকেজ আপডেট করার সময় আপনার করা এডিট মুছে যাবে না।

grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -t

যদি grep কোনো Include লাইন খুঁজে না পায় (যা Rocky Linux 8 এবং অন্যান্য পুরনো ইমেজের ক্ষেত্রে ঘটে), তবে সরাসরি Port 2222-কে /etc/ssh/sshd_config ফাইলে যুক্ত করুন। sshd -t পুরো কনফিগারেশনটি (drop-in সহ) পার্স করে এবং কোনো সিনট্যাক্স এরর থাকলে তা জানিয়ে দেয়। রিস্টার্ট করার আগে রিপোর্ট করা যেকোনো সমস্যা সমাধান করুন, কারণ কনফিগারেশন পার্স করতে ব্যর্থ হলে daemon পুনরায় চালু হবে না।

Port একাধিকবার থাকতে পারে এবং sshd তালিকাভুক্ত প্রতিটি পোর্টে লিসেন করে। প্রথম দিন নিরাপত্তার খাতিরে Port 22-এর পাশাপাশি Port 2222 রাখা একটি ভালো কৌশল, তবে মনে করে পরে এটি সরিয়ে ফেলতে হবে।

আপনার sshd কি socket unit দ্বারা চালু হয়েছে?

কিছু ইমেজ দীর্ঘস্থায়ী সার্ভিসের পরিবর্তে systemd socket activation-এর মাধ্যমে SSH চালু করে। যেখানে এটি সেট করা থাকে, সেখানে systemd লিসেনিং সকেটটি নিয়ন্ত্রণ করে এবং সংযোগগুলো sshd-এর কাছে হস্তান্তর করে। তাই sshd_config-এর Port লাইনটি পুরোপুরি উপেক্ষা করা হয়। যেকোনো কিছু রিস্টার্ট করার আগে এটি পরীক্ষা করে নিন:

systemctl is-enabled sshd.socket

একটি enabled উত্তর পাওয়ার মানে হলো পোর্টটি socket unit-এ সেট করা আছে, sshd_config-এ নয়:

sudo systemctl edit sshd.socket
[Socket]
ListenStream=
ListenStream=2222

এখানে খালি ListenStream= থাকা প্রয়োজন। ড্রপ-ইন ফাইলগুলোতে মানগুলো জমা হতে থাকে, তাই তালিকাটি প্রথমে খালি না করলে সকেটটি 22 এবং 2222 উভয় পোর্টেই লিসেন করতে থাকবে। এটি প্রয়োগ করতে sudo systemctl daemon-reload এবং তারপর sudo systemctl restart sshd.socket ব্যবহার করুন। যদি আপনার সার্ভারে এই ইউনিটটি ডিজেবল করা থাকে বা না থাকে, তবে এই অংশটি আপনার জন্য প্রযোজ্য নয়।

ধাপ 4: রিস্টার্ট করুন, তারপর দ্বিতীয় একটি টার্মিনাল থেকে পরীক্ষা করুন

sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshd

এই টার্মিনালটি খোলা রাখুন। এখান থেকে লগ আউট করবেন না। আপনার নিজের মেশিনে দ্বিতীয় একটি টার্মিনাল খুলুন এবং নতুন পোর্টে কানেক্ট করুন:

ssh -p 2222 youruser@203.0.113.10

দ্বিতীয়বার লগইন সফল হওয়ার পরেই কেবল প্রথম সেশনটি বন্ধ করুন। যদি এটি কাজ না করে, তবে আপনার কাছে একটি শেল খোলা থাকবে যেখান থেকে আপনি সবকিছু পূর্বাবস্থায় ফিরিয়ে আনতে পারবেন। এই একটি অভ্যাসই পাঁচ মিনিটের কাজ এবং প্রোভাইডার কনসোলে পুরো বিকেল নষ্ট করার মধ্যে পার্থক্য গড়ে দেয়।

Firewall drop নাকি SELinux denial? পার্থক্য বোঝার উপায়

আপনার ল্যাপটপ থেকে এই দুটি ব্যর্থতা দেখতে প্রায় একই রকম মনে হতে পারে। কিন্তু সার্ভারে এদের মধ্যে কোনো মিল নেই।

  • যদি systemctl status sshd কমান্ডে দেখা যায় যে ইউনিটটি ব্যর্থ হয়েছে, তবে বুঝতে হবে ডেমোনটি তার সকেটটি পায়নি। এটি একটি কনফিগারেশন ত্রুটি অথবা SELinux denial।
  • যদি ইউনিটটি active থাকে এবং ss -tlnp কমান্ডে দেখা যায় যে sshd নতুন পোর্টে bind হয়েছে, তবে ডেমোনটি ঠিক আছে এবং সমস্যাটি নেটওয়ার্ক পাথে: firewalld, প্রোভাইডারের আলাদা কোনো ফায়ারওয়াল, অথবা আপনি যে অ্যাড্রেস ও পোর্টে সংযোগ করার চেষ্টা করছেন সেখানে।

SELinux-এর ক্ষেত্রে অনুমান না করে অডিট রেকর্ড পড়ুন:

sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pager

একটি name_bind denial এবং tcp_socket ক্লাসের ক্ষেত্রে comm="sshd"-এ প্রসেসের নাম, src=-এ পোর্ট নম্বর এবং tcontext=-এ পোর্টের প্রকৃত লেবেল দেখা যায়। শেষ ফিল্ডটিই হলো উত্তরের চাবিকাঠি। ssh_port_t ছাড়া অন্য যেকোনো কিছু থাকার অর্থ হলো, আপনি যে পোর্টটি ব্যবহার করছেন তাতে 2 নম্বর ধাপটি কার্যকর হয়নি; সাধারণত পোর্ট নম্বরে টাইপো বা ভুল প্রোটোকল ব্যবহারের কারণে এমনটি হয়। আপনি যদি sealert ব্যবহার করে রেকর্ডটিকে সহজ ভাষায় পড়তে চান, তবে setroubleshoot-server ইনস্টল করুন।

কার্নেল যখন bind করতে অস্বীকার করে, তখন sshd নিজে যে বার্তাটি লেখে তা দেখতে এমন:

error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.

1024-এর উপরের কোনো পোর্টে Permission denied আসা, যেখানে bind করার জন্য root প্রিভিলেজের প্রয়োজন নেই, তা হলো SELinux-এর লক্ষণ। একই লাইনে Address already in use থাকা মানে ভিন্ন একটি সমস্যা: অন্য কোনো প্রসেস পোর্টটি দখল করে রেখেছে। ক্লায়েন্ট সাইড থেকে, connection refused এবং connection timed out-এর মধ্যকার পার্থক্য নেটওয়ার্কের এই দুটি সমস্যাকে আলাদা করে। কারণ, refusal মানে আপনার প্যাকেট হোস্ট পর্যন্ত পৌঁছেছে কিন্তু সেখানে কোনো সার্ভিস লিসেনিং অবস্থায় নেই, আর timeout মানে কোনো কিছুই সাড়া দেয়নি।

পোর্ট 22 বন্ধ করুন এবং আপনার ক্লায়েন্টদের আপডেট করুন

নতুন পোর্টে একাধিকবার সফলভাবে লগইন করার পর, পোর্ট 22 এর অ্যাক্সেস বন্ধ করে দিন:

sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

পোর্ট 22-এ থাকা SELinux লেবেলটি পরিবর্তন করার প্রয়োজন নেই। এটি বেস পলিসি থেকে আসে এবং ফায়ারওয়াল প্যাকেট আসা বন্ধ করে দিলে এটি আর কোনো বাড়তি সুবিধা দেয় না।

এরপর ক্লায়েন্টদের কনফিগারেশন ঠিক করুন, কারণ ডিফল্ট পোর্ট ধরে কাজ করা প্রতিটি টুলকে এখন নতুন পোর্ট সম্পর্কে জানাতে হবে। বারবার -p টাইপ করার পরিবর্তে আপনার নিজের মেশিনে একবারই ~/.ssh/config ফাইলে এটি যুক্ত করে নিন:

Host myvps
  HostName 203.0.113.10
  Port 2222
  User youruser

scp, sftp, rsync এবং Ansible সবাই এই ফাইলটি পড়ে। ব্যাকআপ জব, মনিটরিং চেক এবং ক্রন স্ক্রিপ্টগুলোতে যদি পোর্ট 22 হার্ডকোড করা থাকে তবে সেগুলো এই ফাইলটি পড়বে না, তাই বিষয়টি আপনার মাথায় থাকা অবস্থাতেই সেগুলো খুঁজে বের করে আপডেট করুন।

পোর্ট পরিবর্তন করলে কী লাভ হয় আর কী হয় না

এটি লগের অপ্রয়োজনীয় তথ্য কমায়। স্বয়ংক্রিয় স্ক্যানারগুলো প্রতিনিয়ত port 22-এ আক্রমণ চালায়, তাই পোর্ট পরিবর্তন করলে জার্নাল থেকে অধিকাংশ লগ এন্ট্রি দূর হয় এবং প্রকৃত ঘটনাগুলো শনাক্ত করা সহজ হয়। এটি কোনো নিরাপত্তা ব্যবস্থা নয়। যেকোনো স্ক্যানার যদি পুরো পোর্ট রেঞ্জ স্ক্যান করে, তবে তারা আপনার ডেমোন খুঁজে পাবে এবং এর ভার্সন ব্যানার পড়ে ফেলবে। পোর্ট পরিবর্তনকে কেবল রক্ষণাবেক্ষণ হিসেবে দেখুন এবং প্রকৃত নিরাপত্তার জন্য পাসওয়ার্ড লগইন বন্ধ করে শুধুমাত্র key-based authentication ব্যবহার করুন, যা VPS-এর জন্য SSH হার্ডেনিং গাইড-এ ধাপে ধাপে বর্ণনা করা হয়েছে।

উপরের সবকিছুই RHEL-এর দুটি প্রধান রিবিল্ডে একইভাবে কাজ করে, কারণ সেগুলো একই সোর্স থেকে তৈরি। আপনি যদি এখনো কোনোটি বেছে নিতে না পারেন, তবে Rocky Linux এবং AlmaLinux-এর তুলনা দেখুন। 2020 সালে CentOS তার আগের রূপ পরিবর্তন করায় বর্তমানে দুটি প্রায় অভিন্ন রিবিল্ডের মধ্যে বেছে নেওয়ার সুযোগ রয়েছে, যার বিস্তারিত ইতিহাস Red Hat থেকে CentOS হয়ে Rocky এবং AlmaLinux-এর গল্প-এ বলা হয়েছে। যেকোনো পুরনো গাইড অনুসরণ করার আগে cat /etc/os-release ব্যবহার করে আপনার সিস্টেমের রিলিজ ভার্সন যাচাই করে নিন। Rocky Linux 8-এর জন্য লেখা গাইডগুলো এখনো জনপ্রিয় এবং সেগুলোর semanage ও firewall-cmd ধাপগুলো সঠিক, কিন্তু Rocky 8-এ কোনো sshd_config.d ইনক্লুড লাইন বা সকেট ইউনিট নেই। তাই সেই গাইডগুলোর sshd সংক্রান্ত অংশ বর্তমান সিস্টেমের সাথে মিলবে না।

নতুন পোর্ট সম্পর্কে fail2ban-কে জানাতে হবে

fail2ban বেস রিপোজিটরিতে থাকে না। এটি EPEL (extra packages for enterprise Linux) থেকে আসে:

sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalld

fail2ban-firewalld সাবপ্যাকেজটি fail2ban-কে firewalld-এর মাধ্যমে ব্যান কার্যকর করতে সাহায্য করে, যা এমন সার্ভারের জন্য প্রয়োজন যেখানে firewalld রুলসেট নিয়ন্ত্রণ করে।

স্টক sshd জেল (jail) port = ssh সেট করে, এবং এই নামটি /etc/services-এর মাধ্যমে 22 পোর্টে রেজলভ হয়। আপনার পরিবর্তনের পর জেলটি এমন একটি পোর্ট পর্যবেক্ষণ করছে যেখানে কেউ আক্রমণ করছে না, ফলে 2222 পোর্টে লগইন ব্যর্থতার সংখ্যা বাড়তে থাকলেও এটি কাউকে ব্যান করছে না। /etc/fail2ban/jail.local-এ পোর্টের নম্বরটি সেট করুন:

[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600

backend = systemd লগ ফাইল /var/log/secure-এর পরিবর্তে journal থেকে ব্যর্থতার তথ্য পড়ে, যা minimal ইনস্টলেশনের ক্ষেত্রে অধিক নিরাপদ কারণ সেখানে rsyslog নাও থাকতে পারে। sudo systemctl enable --now fail2ban দিয়ে এটি চালু করুন এবং sudo fail2ban-client status sshd দিয়ে জেলটি পরীক্ষা করুন। জেলের সিনট্যাক্স Ubuntu 24.04-এ SSH-এর জন্য fail2ban সেটআপ-এর মতোই। শুধুমাত্র প্যাকেজের উৎস এবং ব্যান অ্যাকশন ভিন্ন।

পোর্টের চেয়ে প্যাচিং বেশি গুরুত্বপূর্ণ

একটি সার্ভারের SSH পোর্ট পরিবর্তন করে চার মাস ধরে নিরাপত্তা আপডেট না দেওয়া হলে, সেটি পোর্ট 22-এ থাকা এমন একটি সার্ভারের চেয়ে বেশি ঝুঁকিপূর্ণ, যা প্রতি রাতে স্বয়ংক্রিয়ভাবে আপডেট হয়। আপনি যখন root হিসেবে কাজ করছেন, তখনই একই সেশনে unattended updates চালু করুন: Rocky Linux এবং AlmaLinux-এ স্বয়ংক্রিয় dnf আপডেট নিবন্ধটিতে টাইমার সেট করা এবং আপডেট ডাউনলোড বনাম প্রয়োগ করার বিকল্পগুলো নিয়ে আলোচনা করা হয়েছে। একটি আপডেট ইনস্টল করলেই পুরনো কোড চালানো daemon-গুলো স্বয়ংক্রিয়ভাবে রিস্টার্ট হয় না, তাই যখনই openssh-server বা এর সাথে সম্পর্কিত কোনো লাইব্রেরি আপডেট হয়, তখন কোন সার্ভিসগুলোর রিস্টার্ট বা রিবুট প্রয়োজন তা যাচাই করা অত্যন্ত জরুরি।

FAQ

Rocky Linux-এ port পরিবর্তন করার পর sshd কেন start হতে ব্যর্থ হয়?

এর কারণ প্রায় সবসময়ই SELinux port label-এর অনুপস্থিতি। sshd, sshd_t ডোমেইনের অধীনে সীমাবদ্ধ (confined) অবস্থায় চলে এবং পলিসি অনুযায়ী এটি শুধুমাত্র ssh_port_t হিসেবে লেবেল করা port-এই bind করতে পারে, যা ডিফল্টভাবে শুধুমাত্র port 22। কার্নেল এই bind করার অনুরোধ প্রত্যাখ্যান করে, ফলে daemon কোনো port-এ listen না করেই বন্ধ হয়ে যায় এবং journalctl -u sshd-এ error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. ফরম্যাটের একটি লাইন দেখা যায়। আপনার port নম্বর দিয়ে sudo semanage port -a -t ssh_port_t -p tcp 2222 চালান, তারপর service-টি restart করুন। যদি semanage খুঁজে না পাওয়া যায়, তবে প্রথমে policycoreutils-python-utils ইনস্টল করুন।

SELinux যদি permissive mode-এ থাকে, তবুও কি আমার semanage প্রয়োজন?

হ্যাঁ। permissive mode-এ denial রেকর্ড করা হয় কিন্তু bind করার অনুমতি দেওয়া হয়, তাই মনে হতে পারে পরিবর্তনটি কাজ করেছে। কিন্তু লেবেলটি তখনও অনুপস্থিত থাকে। যখনই কেউ setenforce 1 চালাবে, অথবা সিস্টেম /etc/selinux/config-এ SELINUX=enforcing সহ boot হবে, তখনই sshd ওই port-এ start হওয়া বন্ধ করে দেবে। লেবেলটি যোগ করতে মাত্র একটি কমান্ড লাগে এবং এটি এমন একটি ব্যর্থতা দূর করে যা অন্যথায় কয়েক সপ্তাহ পর কোনো স্পষ্ট কারণ ছাড়াই দেখা দিতে পারে।

port-টি লেবেল করা আছে এবং sshd চলছে, তাহলে আমার connection কেন time out হচ্ছে?

daemon চলছে মানে SELinux-এর কোনো আপত্তি নেই, তাই প্যাকেটটি আসার পথেই ড্রপ করা হচ্ছে। আপনার port-এর জন্য sudo firewall-cmd --list-ports চেক করুন এবং নিশ্চিত করুন যে আপনি --permanent রুল যোগ করার পর firewall-cmd --reload চালিয়েছেন, কারণ শুধুমাত্র একটি permanent রুল চলন্ত firewall-এ কার্যকর হয় না। এরপর VPS-এর সামনে কোনো আলাদা network firewall আছে কি না তা দেখার জন্য আপনার host-এর control panel চেক করুন। এটি দ্বিতীয় স্থান যেখানে মানুষ ব্লকড হয় এবং অপারেটিং সিস্টেমের ভেতরে থাকা কোনো কিছুই তা দেখাতে পারবে না।

22-এর পরিবর্তে আমার কোন port ব্যবহার করা উচিত?

1024 থেকে 65535-এর মধ্যে যেকোনো খালি TCP port। একটি আসল সার্ভারে 2222 এবং 22222 ব্যবহার করা থেকে বিরত থাকুন, কারণ স্ক্যানাররা 22-এর পরপরই এগুলো পরীক্ষা করে। sudo ss -tlnp দিয়ে নিশ্চিত করুন যে নম্বরটি খালি আছে, sudo semanage port -l দিয়ে নিশ্চিত করুন যে SELinux পলিসি ইতিমধ্যে এটি দাবি করেনি, এবং ভবিষ্যতে ইনস্টল করতে পারেন এমন কোনো সার্ভিসের জন্য বরাদ্দকৃত port এড়িয়ে চলুন। একটি বড় এবং সহজে মনে না রাখা যায় এমন নম্বর ব্যবহার করাই ভালো, কারণ আপনি এটি একবার ~/.ssh/config-এ লিখে রাখলে আর কখনোই টাইপ করতে হবে না।