ভূমিকা: SSH কেন? Telnet এর চেয়ে কত ভালো?
SSH – Secure Shell হলো রিমোট সার্ভার অ্যাক্সেসের ইন্ডাস্ট্রি স্ট্যান্ডার্ড। পোর্ট 22 ব্যবহার করে। Telnet এর সব ডাটা প্লেইন টেক্সটে গেলেও, SSH সবকিছু এনক্রিপ্ট করে পাঠায়।
SSH এর ৩টি মূল কাজ:
- Remote Login: সিকিউরলি সার্ভারে লগইন
- Command Execution: রিমোট কমান্ড রান করা
- File Transfer:
scp,sftp,rsyncদিয়ে ফাইল কপি
এই আর্টিকেলে যা শিখবেন:
- OpenSSH Server ও Client ইনস্টল ও চালু করা
/etc/ssh/sshd_configফাইলের গুরুত্বপূর্ণ অপশন- SSH Port চেঞ্জ করে সিকিউরিটি বাড়ানো
- Root Login ও Password Login বন্ধ করা
- Key-Based Authentication সেটআপ – পাসওয়ার্ড ছাড়া লগইন
- Firewalld ও SELinux কনফিগারেশন
- একাডেমিক আলোচনা: Asymmetric Cryptography, SSH Handshake
১. পূর্বশর্ত ও প্রয়োজনীয় প্যাকেজ
| বিষয় | প্রয়োজন | ক্লারিফিকেশন |
|---|---|---|
| OS | CentOS Stream 9 / RHEL 9 | CentOS 7 এও একই, শুধু yum ব্যবহার হবে |
| প্যাকেজ | openssh-server, openssh-clients | সার্ভার ও ক্লায়েন্ট। ডিফল্টভাবে ইনস্টল থাকে |
| ইউজার | sudo এক্সেস আছে এমন নন-রুট ইউজার | root দিয়ে সরাসরি SSH করা রিস্কি |
| নেটওয়ার্ক | সার্ভারের IP জানা থাকতে হবে | ip a দিয়ে চেক করুন |
স্পেশাল ইনস্ট্রাকশন: CentOS Minimal Install এ openssh-server আগে থেকেই ইনস্টল ও চালু থাকে। তবুও ভেরিফাই করে নেব।
২. Step 1: SSH Server ইনস্টল ও স্ট্যাটাস চেক
2.1. প্যাকেজ ইনস্টল/ভেরিফাই করুন
Bash
sudo dnf install openssh-server openssh-clients -y
ক্লারিফিকেশন: openssh-server হলো ডেমন sshd, openssh-clients হলো ssh, scp, sftp কমান্ড।
2.2. সার্ভিস চালু ও এনাবল করুন
Bash
sudo systemctl start sshd
sudo systemctl enable sshd
sudo systemctl status sshd
আউটপুট active (running) দেখাবে:
Code
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since...
2.3. পোর্ট লিসেনিং চেক করুন
Bash
sudo ss -tulpn | grep :22
আউটপুট:
Code
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=4))
0.0.0.0:22 মানে সব IP থেকে পোর্ট 22 এ কানেকশন নিচ্ছে।
৩. Step 2: ফায়ারওয়াল ও SELinux কনফিগার
3.1. Firewalld দিয়ে পোর্ট 22 ওপেন করুন
Bash
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
ক্লারিফিকেশন: --add-service=ssh অটো পোর্ট 22 ওপেন করে। ম্যানুয়ালি করতে চাইলে: --add-port=22/tcp
3.2. SELinux Context
SSH এর ডিফল্ট পোর্ট 22 এর জন্য SELinux আগে থেকেই কনফিগার করা। পোর্ট চেঞ্জ করলে SELinux আপডেট করতে হবে। সেটা Step 4 এ দেখাব।
Bash
sudo semanage port -l | grep ssh
আউটপুট: ssh_port_t tcp 22
৪. Step 3: SSH Hardening – /etc/ssh/sshd_config এডিট
এটাই সবচেয়ে গুরুত্বপূর্ণ স্টেপ। সার্ভার সিকিউর করার জন্য এই ফাইল এডিট করতে হবে।
গুরুত্বপূর্ণ: কনফিগ চেঞ্জ করার আগে ব্যাকআপ নিন। ভুল হলে সার্ভার লক আউট হয়ে যাবেন।
Bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config
নিচের লাইনগুলো খুঁজে বের করে চেঞ্জ করুন:
4.1. Port চেঞ্জ করুন – বট অ্যাটাক কমবে
INI
#Port 22
Port 2222
ক্লারিফিকেশন: ডিফল্ট পোর্ট 22 এ সবাই অ্যাটাক করে। 2222 বা 22022 এর মতো নন-স্ট্যান্ডার্ড পোর্ট দিলে ৯০% অটো স্ক্যানার বাদ পড়বে।
পোর্ট চেঞ্জ করলে ২টা কাজ মাস্ট:
Bash
# 1. SELinux কে নতুন পোর্টের কথা জানান
sudo semanage port -a -t ssh_port_t -p tcp 2222
# 2. Firewall এ নতুন পোর্ট ওপেন করুন
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
4.2. Root Login বন্ধ করুন
INI
PermitRootLogin no
ক্লারিফিকেশন: root হলো কমন ইউজারনেম। হ্যাকাররা প্রথমে এটা ট্রাই করে। no করে দিলে শুধু নন-রুট ইউজার দিয়ে লগইন করে পরে sudo ব্যবহার করতে হবে।
4.3. Password Authentication বন্ধ করুন – সবচেয়ে সিকিউর
INI
PasswordAuthentication no
PubkeyAuthentication yes
সতর্কতা: এটা এনাবল করার আগে Step 5 এ Key-Based Login সেটআপ করে টেস্ট করে নিবেন। না হলে সার্ভার থেকে লক আউট হয়ে যাবেন।
4.4. অন্যান্য গুরুত্বপূর্ণ অপশন
INI
MaxAuthTries 3 # ৩ বার ভুল পাসওয়ার্ড দিলে ডিসকানেক্ট
LoginGraceTime 30 # ৩০ সেকেন্ডের মধ্যে লগইন না করলে ডিসকানেক্ট
AllowUsers admin devuser # শুধু এই ইউজাররা SSH করতে পারবে
X11Forwarding no # GUI ফরওয়ার্ডিং বন্ধ, সার্ভারে দরকার নাই
4.5. কনফিগ টেস্ট ও রিস্টার্ট
সিনট্যাক্স ভুল আছে কিনা চেক করুন:
Bash
sudo sshd -t
কোনো আউটপুট না আসলে সব ঠিক আছে। এরর আসলে ঠিক করুন।
এবার রিস্টার্ট করুন:
Bash
sudo systemctl restart sshd
৫. Step 4: Key-Based Authentication সেটআপ – পাসওয়ার্ড ছাড়া লগইন
এটা SSH এর সবচেয়ে সিকিউর মেথড। Private Key আপনার PC তে থাকবে, Public Key সার্ভারে।
5.1. আপনার লোকাল PC/Windows এ Key Pair জেনারেট করুন
Windows PowerShell বা Linux/Mac Terminal এ:
Bash
ssh-keygen -t ed25519 -C "admin@ToLearnTeam"
ক্লারিফিকেশন:
-t ed25519: মডার্ন ও সবচেয়ে সিকিউর অ্যালগরিদম।rsaপুরানো।-C: কমেন্ট, কার কী সেটা বোঝার জন্য।- ফাইল সেভ লোকেশন:
Enterচাপুন =/home/user/.ssh/id_ed25519 - Passphrase: একটা স্ট্রং পাসওয়ার্ড দিন। Key চুরি হলেও এটা ছাড়া কাজ করবে না।
২টা ফাইল তৈরি হবে:
id_ed25519: Private Key। এটা কখনো কারো সাথে শেয়ার করবেন না।id_ed25519.pub: Public Key। এটা সার্ভারে দিবেন।
5.2. Public Key সার্ভারে কপি করুন
সবচেয়ে সহজ উপায় ssh-copy-id কমান্ড:
Bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@192.168.1.100 -p 22
ক্লারিফিকেশন: -p 22 হলো পোর্ট। যদি Step 4 এ পোর্ট 2222 করে থাকেন তাহলে -p 2222 দিবেন।
এটা প্রথমবার পাসওয়ার্ড চাইবে। এরপর থেকে আর লাগবে না।
ম্যানুয়াল মেথড:
id_ed25519.pubফাইলের কনটেন্ট কপি করুন:cat ~/.ssh/id_ed25519.pub- সার্ভারে লগইন করুন:
Bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
- কপি করা Public Key পেস্ট করুন → সেভ করুন
- পারমিশন ঠিক করুন:
Bash
chmod 600 ~/.ssh/authorized_keys
5.3. Key দিয়ে লগইন টেস্ট করুন
Bash
ssh -i ~/.ssh/id_ed25519 -p 2222 admin@192.168.1.100
পাসওয়ার্ড চাইবে না, সরাসরি লগইন হবে। কাজ করলে এখন /etc/ssh/sshd_config এ PasswordAuthentication no করে দিতে পারেন।
5.4. ডিরেক্টরি স্ট্রাকচার ও পারমিশন
Bash
/home/admin/
└──.ssh/ # chmod 700
├── authorized_keys # chmod 600 – পাবলিক কী লিস্ট
├── id_ed25519 # chmod 600 – প্রাইভেট কী, ক্লায়েন্টে থাকে
├── id_ed25519.pub # chmod 644 – পাবলিক কী
└── known_hosts # chmod 644 – যেসব সার্ভারে কানেক্ট করেছেন তার ফিঙ্গারপ্রিন্ট
গুরুত্বপূর্ণ: পারমিশন ভুল হলে SSH কাজ করবে না। 700 ও 600 মাস্ট।
৬. Step 5: SSH Client কমান্ড ও উদাহরণ
6.1. বেসিক লগইন
Bash
ssh admin@192.168.1.100
ssh admin@192.168.1.100 -p 2222 # কাস্টম পোর্ট
ssh -i ~/.ssh/mykey.pem admin@server.com # স্পেসিফিক কী দিয়ে
6.2. রিমোট কমান্ড রান করা – লগইন না করেই
Bash
ssh admin@192.168.1.100 'df -h'
ssh admin@192.168.1.100 'sudo systemctl status nginx'
সার্ভারে লগইন না করেই আউটপুট আপনার টার্মিনালে দেখাবে।
6.3. SCP দিয়ে ফাইল কপি
Bash
# লোকাল থেকে সার্ভারে ফাইল পাঠানো
scp -P 2222 /home/user/file.txt admin@192.168.1.100:/home/admin/
# সার্ভার থেকে লোকালে ফাইল আনা
scp -P 2222 admin@192.168.1.100:/var/log/messages./
# ফোল্ডার কপি
scp -P 2222 -r /home/user/website admin@192.168.1.100:/var/www/
ক্লারিফিকেশন: scp তে পোর্টের জন্য বড় হাতের -P, ssh এ ছোট হাতের -p।
৭. একাডেমিক আলোচনা: SSH কিভাবে কাজ করে?
7.1. Asymmetric Cryptography
SSH, Key-Based Auth এর জন্য Public-Private Key Pair ব্যবহার করে। এটা Asymmetric Cryptography।
- Public Key: তালার মতো। সবাইকে দেওয়া যায়। এটা দিয়ে ডাটা এনক্রিপ্ট করা যায়।
- Private Key: চাবির মতো। শুধু আপনার কাছে থাকবে। এটা দিয়ে ডাটা ডিক্রিপ্ট করা যায়।
সার্ভারে আপনার Public Key authorized_keys এ থাকে। লগইনের সময় সার্ভার একটা চ্যালেঞ্জ পাঠায়। আপনার PC সেটা Private Key দিয়ে সাইন করে পাঠায়। মিলে গেলে লগইন হয়। পাসওয়ার্ড একবারও নেটওয়ার্কে যায় না।
7.2. SSH Handshake প্রসেস
- TCP Connection: ক্লায়েন্ট পোর্ট 22/2222 এ কানেক্ট করে।
- Version Exchange: সার্ভার ও ক্লায়েন্ট SSH ভার্সন শেয়ার করে।
- Key Exchange: Diffie-Hellman দিয়ে একটা সেশন কী তৈরি হয়। এটা Symmetric Key।
- Server Authentication: ক্লায়েন্ট সার্ভারের Host Key
~/.ssh/known_hostsএর সাথে মিলিয়ে দেখে। Man-in-the-Middle অ্যাটাক ধরার জন্য। - User Authentication: পাসওয়ার্ড বা Public Key দিয়ে ইউজার ভেরিফাই হয়।
- Encrypted Channel: এরপর সব কমান্ড ও ডাটা সেশন কী দিয়ে এনক্রিপ্ট হয়ে যায়।
7.3. SSH vs Telnet – একাডেমিক তুলনা
| প্যারামিটার | Telnet | SSH |
|---|---|---|
| Protocol | Application Layer | Application Layer |
| Security | None, Plain Text | Encryption, Integrity, Auth |
| Port | 23 | 22 |
| Authentication | Plain Password | Password, Public Key, Keyboard-Interactive |
| Data Integrity | No Check | HMAC-SHA2 দিয়ে ভেরিফাই |
| OSI Layer | 7 | 7, কিন্তু 6 এ এনক্রিপশন হয় |
| ব্যবহার | Deprecated, Legacy | Industry Standard |
সিদ্ধান্ত: CIA Triad – Confidentiality, Integrity, Availability – SSH তিনটাই নিশ্চিত করে, Telnet একটাও না।
৮. বোনাস: Fail2Ban দিয়ে Brute Force অ্যাটাক বন্ধ করুন
SSH এ বারবার ভুল পাসওয়ার্ড দিলে IP ব্লক করার জন্য Fail2Ban ব্যবহার করুন।
Bash
sudo dnf install epel-release -y
sudo dnf install fail2ban -y
sudo systemctl enable fail2ban --now
sudo nano /etc/fail2ban/jail.local
ফাইলে পেস্ট করুন:
INI
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
Bash
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
৩ বার ভুল করলে ১ ঘণ্টার জন্য IP ব্যান হয়ে যাবে।
৯. উপসংহার ও চেকলিস্ট
আপনি এখন একটি প্রোডাকশন-গ্রেড সিকিউর SSH সার্ভার কনফিগার করতে পারেন।
সিকিউরিটি চেকলিস্ট:
-
Port 22চেঞ্জ করে2222বা অন্য কিছু করেছেন? -
PermitRootLogin noকরা আছে? -
PasswordAuthentication noকরে Key-Based Login চালু করেছেন? -
AllowUsersদিয়ে স্পেসিফিক ইউজার এলাও করেছেন? - Firewalld এ শুধু নতুন SSH পোর্ট ওপেন?
- Fail2Ban ইনস্টল করেছেন?
সিরিজের পরবর্তী পর্ব: CentOS এ LAMP Stack ইনস্টলেশন - Apache, MariaDB, PHP 8.2। আমরা ওয়েব সার্ভার বানানো শিখব।
ToLearnTeam.com এর সাথে থাকুন। কোনো স্টেপে আটকে গেলে কমেন্ট করুন। Happy Securing!
প্রশ্ন: আপনার সার্ভারে ssh -v admin@IP কমান্ড দিলে কোন লাইনে Authenticated দেখাচ্ছে?
Windows থেকে authorized_keys ফাইলে পাবলিক কী কপি না হওয়ার ৩টা কমন কারণ আছে। স্টেপ বাই স্টেপ ফিক্স করি।
সমস্যা: Windows এর Public Key CentOS এর ~/.ssh/authorized_keys এ যাচ্ছে না
সলিউশন ১: ssh-copy-id ব্যবহার করুন – সবচেয়ে সহজ, Windows 10/11 এ কাজ করে
Windows PowerShell বা CMD ওপেন করুন:
powershell
# 1. প্রথমে চেক করুন কী আছে কিনা
type %USERPROFILE%\.ssh\id_ed25519.pub
# যদি "The system cannot find the path" আসে, তাহলে কী বানান:
ssh-keygen -t ed25519 -C "your_email@ToLearnTeam.com"
Enter ৩ বার চাপুন। পাসফ্রেজ না দিলেও হবে, তবে দেওয়া ভালো।
powershell
# 2. সার্ভারে কী কপি করুন - অটোমেটিক সব পারমিশন ঠিক করে দিবে
ssh-copy-id -i %USERPROFILE%\.ssh\id_ed25519.pub admin@192.168.1.100 -p 2222
ক্লারিফিকেশন: admin আপনার CentOS ইউজার, 192.168.1.100 সার্ভারের IP, -p 2222 আপনার SSH পোর্ট। পোর্ট 22 হলে -p 2222 বাদ দিন।
প্রথমবার সার্ভারের পাসওয়ার্ড চাইবে। দিলেই কপি হয়ে যাবে।
টেস্ট করুন:
powershell
ssh -i %USERPROFILE%\.ssh\id_ed25519 admin@192.168.1.100 -p 2222
পাসওয়ার্ড ছাড়া লগইন হলে সাকসেস।
সলিউশন ২: ম্যানুয়াল কপি-পেস্ট – ssh-copy-id না থাকলে
Step 1: Windows এ Public Key কপি করুন
powershell
type %USERPROFILE%\.ssh\id_ed25519.pub | clip
clip কমান্ড পুরো কী ক্লিপবোর্ডে কপি করে দিবে।
Step 2: CentOS সার্ভারে লগইন করে ম্যানুয়াল পেস্ট করুন
Bash
# 1. .ssh ফোল্ডার বানান ও পারমিশন ঠিক করুন
mkdir -p ~/.sshchmod 700 ~/.ssh
# 2. authorized_keys ফাইল খুলুন
nano ~/.ssh/authorized_keys
# 3. Windows থেকে কপি করা কী পেস্ট করুন - Ctrl+V# কী এক লাইনে থাকতে হবে। শুরু হবে ssh-ed25519 দিয়ে, শেষ হবে আপনার ইমেইল দিয়ে
# 4. সেভ করুন: Ctrl+O, Enter, Ctrl+X
# 5. পারমিশন মাস্ট ঠিক করুন, না হলে কাজ করবে না
chmod 600 ~/.ssh/authorized_keys
Step 3: SELinux Context ঠিক করুন – এটা না করলে কাজ করবে না
Bash
restorecon -Rv ~/.ssh
অথবা:
Bash
chcon -R unconfined_u:object_r:ssh_home_t:s0 ~/.ssh
কমন ৪টা ভুল যার কারণে কাজ করে না
| ভুল | লক্ষণ | সমাধান |
|---|---|---|
| 1. পারমিশন ভুল | Permission denied (publickey) | chmod 700 ~/.ssh এবং chmod 600 ~/.ssh/authorized_keys মাস্ট |
| 2. কী ভেঙে গেছে | কী ২-৩ লাইনে ভাগ হয়ে গেছে | authorized_keys এ ১টা কী = ১টা লাইন। কোনো Enter/Line Break থাকবে না |
| 3. SELinux ব্লক করছে | /var/log/secure এ Authentication refused | restorecon -Rv ~/.ssh রান করুন |
| 4. ভুল ইউজারের হোমে | root দিয়ে লগইন করে admin এর ফাইলে কী পেস্ট | যে ইউজার দিয়ে SSH করবেন, তার হোমে ~/.ssh/authorized_keys বানাতে হবে |
ডিবাগ কমান্ড CentOS এ রান করুন:
Bash
# 1. ফাইল আছে কিনা ও পারমিশন চেক
ls -ld ~/.sshls -l ~/.ssh/authorized_keys
# আউটপুট: drwx------ এবং -rw------- হতে হবে
# 2. SELinux এরর চেক করুন
sudo ausearch -m avc -ts recent# বা
sudo cat /var/log/secure | grep ssh
# 3. SSH ডেমন ডিবাগ মোডে চেকs
udo sshd -T | grep -i authorizedkeysfile
# আউটপুট: authorizedkeysfile .ssh/authorized_keys দেখাবে
PuTTY ব্যবহার করলে .ppk থেকে কনভার্ট
আপনি PuTTY দিয়ে কী বানালে .ppk ফরম্যাট হয়। সেটা OpenSSH এ কাজ করে না।
কনভার্ট করার নিয়ম:
PuTTYgenওপেন করুন →Load→ আপনার.ppkফাইল লোড করুনConversions→Export OpenSSH key→id_ed25519নামে সেভ করুন- উপরের বক্স থেকে
Public key for pastingপুরোটা কপি করে CentOS এরauthorized_keysএ পেস্ট করুন
ফাইনাল চেকলিস্ট – CentOS এ রান করুন
Bash
# 1. ফাইলে কী আছে কিনা দেখুন
cat ~/.ssh/authorized_keys
# ssh-ed25519 AAAAC3... আপনার_ইমেইল দিয়ে শুরু একটা লাইন দেখাবে
# 2. পারমিশন ফিক্স
chmod 700 ~ && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
# 3. Owner চেক - admin ইউজার হলে admin হতে হবে
ls -l ~/.ssh/authorized_keys
# -rw-------. 1 admin admin ... দেখাবে। root root দেখালে ভুল
# 4. ভুল হলে Owner ঠিক করুন
chown -R admin:admin ~/.ssh
এরপর Windows থেকে আবার লগইন করুন:
powershell
ssh -v -i %USERPROFILE%\.ssh\id_ed25519 admin@192.168.1.100 -p 2222
-v দিলে ডিটেইল লগ দেখাবে। Server accepts key দেখালেই সাকসেস।
ssh-copy-id কমান্ড Windows এ ডিফল্টভাবে নাই। এটা Linux/Mac এর টুল। তাই not recognized এরর দিচ্ছে।
Windows এ ssh-copy-id এর ৩টা বিকল্প
মেথড ১: type + ssh দিয়ে ১ লাইনে কপি – সবচেয়ে সহজ
Windows PowerShell বা CMD তে রান করুন:
powershell
type %USERPROFILE%\.ssh\id_ed25519.pub | ssh admin@192.168.1.100 -p 2222 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
ক্লারিফিকেশন:
type %USERPROFILE%\.ssh\id_ed25519.pub= আপনার পাবলিক কী পড়বে|= পাইপ করে SSH এ পাঠাবেssh ... "কমান্ড"= সার্ভারে লগইন করে~/.sshবানাবে, পারমিশন ঠিক করবে, কী Append করবে-p 2222= আপনার SSH পোর্ট। 22 হলে বাদ দিন
প্রথমবার সার্ভারের পাসওয়ার্ড চাইবে। এরপর থেকে আর লাগবে না।
মেথড ২: ম্যানুয়াল কপি-পেস্ট – ১০০% কাজ করবে
Step 1: Windows এ Public Key কপি করুন
powershell
type %USERPROFILE%\.ssh\id_ed25519.pub
যা আউটপুট আসবে পুরোটা সিলেক্ট করে Ctrl+C দিন। ssh-ed25519 AAAAC3... আপনার_ইমেইল এই রকম এক লাইন হবে।
কী না থাকলে বানান:
powershell
ssh-keygen -t ed25519 -C "admin@ToLearnTeam.com"
৩ বার Enter চাপুন।
Step 2: CentOS সার্ভারে পাসওয়ার্ড দিয়ে লগইন করুন
powershell
ssh admin@192.168.1.100 -p 2222
Step 3: সার্ভারে এই কমান্ডগুলো রান করুন
Bash
# 1. .ssh ফোল্ডার ও ফাইল বানান
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 2. nano দিয়ে ফাইল ওপেন করুনnano ~/.ssh/authorized_keys
Step 4: Windows থেকে কপি করা কী পেস্ট করুনnano তে Right Click বা Shift+Insert চাপুন → কী পেস্ট হবে।
গুরুত্বপূর্ণ: কী অবশ্যই এক লাইনে থাকতে হবে। Enter/Line Break থাকলে কাজ করবে না।
Step 5: সেভ করে বের হনCtrl+O → Enter → Ctrl+X
Step 6: SELinux ফিক্স – এটা না করলে CentOS এ কাজ করবে না
Bash
restorecon -Rv ~/.ssh
Step 7: লগআউট করে Key দিয়ে টেস্ট করুন
Bash
exit
Windows থেকে:
powershell
ssh -i %USERPROFILE%\.ssh\id_ed25519 admin@192.168.1.100 -p 2222
মেথড ৩: Git Bash বা WSL ইনস্টল করে ssh-copy-id ব্যবহার
আপনি যদি Git ইনস্টল করে থাকেন, তাহলে Git Bash ওপেন করুন। ওখানে ssh-copy-id কাজ করে।
Bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@192.168.1.100 -p 2222
WSL থাকলে: Ubuntu টার্মিনাল ওপেন করে একই কমান্ড রান করুন।
কপি হওয়ার পরও কাজ না করলে এই ৪টা চেক করুন
CentOS সার্ভারে রান করুন:
Bash
# 1. পারমিশন চেক - drwx------ ও -rw------- হতে হবে
ls -ld ~/.sshls -l ~/.ssh/authorized_keys
# 2. Owner চেক - admin admin হতে হবে, root root না
ls -l ~/.ssh/authorized_keys
# 3. ভুল হলে ঠিক করুন
chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys
chown admin:admin ~/.ssh/authorized_keys
# 4. SELinux কনটেক্সট চেক
ls -Z ~/.ssh/authorized_keys
# আউটপুট: unconfined_u:object_r:ssh_home_t:s0 হতে হবে
# 5. sshd_config চেক - PubkeyAuthentication yes আছে কিনা
sudo grep PubkeyAuthentication /etc/ssh/sshd_config
13 lines hidden
ডিবাগ লগ দেখুন:
powershell
ssh -vvv -i %USERPROFILE%\.ssh\id_ed25519 admin@192.168.1.100 -p 2222
Offering public key এবং Server accepts key দেখালে সাকসেস। Permission denied (publickey) আসলে উপরের ৪টা চেক করুন।
Windows থেকে CentOS এ SSH লগইন হচ্ছে না – এটার ৯টা কমন কারণ আছে। একটা একটা করে চেক করি।
Step 1: বেসিক কানেক্টিভিটি টেস্ট করুন
Windows CMD/PowerShell এ রান করুন:
powershell
# 1. সার্ভারে Ping যাচ্ছে কিনা
ping 192.168.1.100
# 2. SSH পোর্ট খোলা আছে কিনা - Telnet Client দিয়ে
telnet 192.168.1.100 22
Could not open connection আসলে ফায়ারওয়াল/নেটওয়ার্ক ইস্যু।SSH-2.0-OpenSSH_8.x আসলে পোর্ট খোলা আছে।
telnet না থাকলে: Test-NetConnection -ComputerName 192.168.1.100 -Port 22
Step 2: Verbose মোডে এরর দেখুন
এটা সবচেয়ে গুরুত্বপূর্ণ। ঠিক কি এরর হচ্ছে জানতে পারবেন।
powershell
ssh -vvv admin@192.168.1.100 -p 22
আউটপুটের শেষ ১০ লাইন দেখুন। কমন এরর ও ফিক্স:
| এরর মেসেজ | কারণ | সমাধান |
|---|---|---|
Connection timed out | ফায়ারওয়াল ব্লকভুল IP/Portsshd বন্ধ | CentOS এ: sudo firewall-cmd --add-port=22/tcp --permanent && sudo firewall-cmd --reloadsudo systemctl start sshd |
Connection refused | sshd চলছে না | CentOS এ: sudo systemctl start sshd && sudo systemctl enable sshd |
Permission denied (publickey,password) | PasswordAuthentication no করাKey কাজ করছে নাইউজার ভুল | CentOS এ: sudo nano /etc/ssh/sshd_config → PasswordAuthentication yes করে টেস্ট করুন |
Permission denied (publickey) | শুধু Key দিয়ে লগইন এলাও, কিন্তু আপনার কী সেটআপ নাই | পাসওয়ার্ড দিয়ে লগইন এনাবল করুন বা কী ঠিকমতো সেট করুন |
No such file or directory | ভুল কী পাথ | -i %USERPROFILE%\.ssh\id_ed25519 ঠিক আছে কিনা চেক করুন |
Step 3: CentOS সার্ভারে এই ৭টা জিনিস চেক করুন
সার্ভারে লোকালি লগইন করে বা VMware কনসোল থেকে রান করুন:
3.1. SSH সার্ভিস চলছে কিনা
Bash
sudo systemctl status sshd
active (running) না থাকলে:
Bash
sudo systemctl start sshdsudo systemctl enable sshd
3.2. ফায়ারওয়াল পোর্ট খোলা কিনা
Bash
sudo firewall-cmd --list-ports
sudo firewall-cmd --list-services
পোর্ট 22 বা আপনার কাস্টম পোর্ট না থাকলে:
Bash
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
3.3. sshd_config এ কি সেট করা
Bash
sudo grep -E "Port|PasswordAuthentication|PermitRootLogin|PubkeyAuthentication" /etc/ssh/sshd_config
সেফ ডিফল্ট টেস্টের জন্য:
INI
Port 22
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication yes
চেঞ্জ করার পর: sudo systemctl restart sshd
3.4. ইউজার লক বা শেল নাই কিনা
Bash
sudo cat /etc/passwd | grep admin
sudo passwd -S admin
আউটপুট: admin PS দেখাবে। LK বা NP দেখালে লক। আনলক করুন:
Bash
sudo usermod -U admin
sudo passwd admin
3.5. /var/log/secure লগ দেখুন – আসল এরর এখানে থাকে
Bash
sudo tail -f /var/log/secure
এবার Windows থেকে SSH করুন। এই টার্মিনালে লাইভ এরর দেখাবে।
কমন লগ মেসেজ:
Authentication refused: bad ownership or modes for directory /home/admin→chmod 700 /home/admin && chmod 700 ~/.sshFailed password for admin→ পাসওয়ার্ড ভুলUser admin not allowed because shell /sbin/nologin→sudo usermod -s /bin/bash admin
3.6. SELinux ব্লক করছে কিনা
Bash
sudo getenforce
sudo ausearch -m avc -ts recent | grep ssh
denied দেখালে:
Bash
sudo restorecon -Rv /home/admin/.ssh
sudo setsebool -P use_nfs_home_dirs 1 # NFS হোম হলে
3.7. /etc/hosts.deny বা /etc/hosts.allow
Bash
cat /etc/hosts.deny
sshd: ALL থাকলে আপনার IP ব্লক। ফাইল খালি করে দিন বা /etc/hosts.allow এ sshd: YOUR_PC_IP অ্যাড করুন।
Step 4: পাসওয়ার্ড দিয়ে লগইন টেস্ট করুন – Key এর ঝামেলা বাদ দিয়ে
আগে নিশ্চিত হন পাসওয়ার্ড দিয়ে কাজ করে কিনা।
CentOS এ:
Bash
sudo nano /etc/ssh/sshd_config
এই ২টা লাইন নিশ্চিত করুন:
INI
PasswordAuthentication yes
PubkeyAuthentication yes
Bash
sudo systemctl restart sshd
Windows থেকে:
powershell
ssh admin@192.168.1.100
পাসওয়ার্ড চাইবে। দিলে লগইন হবে।
যদি পাসওয়ার্ড দিয়েও না হয়: তাহলে নেটওয়ার্ক/ফায়ারওয়াল/sshd সার্ভিস ইস্যু। Step 1-3 আবার করুন।
যদি পাসওয়ার্ড দিয়ে হয় কিন্তু Key দিয়ে না হয়: তাহলে authorized_keys পারমিশন বা SELinux ইস্যু। আগের রিপ্লাই এর মেথড ২ ফলো করুন।
কুইক ফিক্স কমান্ড – CentOS এ রান করুন
এটা রান করলে ৯০% SSH ইস্যু ফিক্স হয়ে যায়:
Bash
sudo systemctl start sshd
sudo systemctl enable sshd
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
sudo restorecon -Rv /home
এরপর Windows থেকে ssh admin@192.168.1.100 ট্রাই করুন।
debug3: fail to open file:C:/Users/HP/.ssh/ssh_config এটা কোনো এরর না। এটা শুধু ইনফো যে ssh_config ফাইল নাই। SSH এটা ছাড়াই কাজ করে।
আসল সমস্যা এই লাইনের পরে আসবে। Permission denied বা Connection timed out এরকম কিছু।
সম্পূর্ণ ssh -vvv আউটপুটের শেষ ২০ লাইন দিন
শুধু ssh_config এর লাইন দেখে সমস্যা বোঝা যাবে না। নিচের কমান্ড রান করে পুরো আউটপুট দিন:
powershell
ssh -vvv admin@192.168.1.100 -p 22
কি দেখতে হবে:
১. যদি Connection timed out দেখায়:
Text
debug1: connect to address 192.168.1.100 port 22: Connection timed out
কারণ: ফায়ারওয়াল ব্লক করছে, বা IP ভুল, বা sshd বন্ধ
ফিক্স CentOS এ:
Bash
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
ip a # IP ঠিক আছে কিনা চেক করুন
২. যদি Connection refused দেখায়:
Text
debug1: connect to address 192.168.1.100 port 22: Connection refused
কারণ: sshd চলছে না
ফিক্স CentOS এ:
Bash
sudo systemctl start sshd
sudo ss -tulpn | grep :22 # পোর্ট 22 লিসেন করছে কিনা দেখুন
৩. যদি Permission denied (publickey,password) দেখায়:
Text
debug1: Authentications that can continue: publickey,password
debug3: start over, passed a different list publickey,passwordd
ebug1: No more authentication methods to try.
admin@192.168.1.100: Permission denied (publickey,password).
কারণ: ১. পাসওয়ার্ড ভুল ২. PasswordAuthentication no করা ৩. ইউজার লক
ফিক্স CentOS এ:
Bash
sudo nano /etc/ssh/sshd_config
# PasswordAuthentication yes করে দিন
sudo systemctl restart sshd
sudo passwd admin
# পাসওয়ার্ড রিসেট করুন
৪. যদি Permission denied (publickey) দেখায়:
Text
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.
admin@192.168.1.100: Permission denied (publickey).
কারণ: শুধু Key দিয়ে লগইন এলাও, কিন্তু আপনার কী সেটআপ হয়নি বা পারমিশন ভুল
ফিক্স: আগের রিপ্লাই এর মেথড ২: ম্যানুয়াল কপি-পেস্ট ফলো করুন।
Quick Test: পাসওয়ার্ড দিয়ে হয় কিনা চেক করুন
CentOS এ:
Bash
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_configsudo systemctl restart sshd
Windows থেকে:
powershell
ssh admin@192.168.1.100
পাসওয়ার্ড চাইলে admin ইউজারের পাসওয়ার্ড দিন।
যদি পাসওয়ার্ড দিয়েও না হয়: তাহলে CentOS এর /var/log/secure চেক করুন:
Bash
sudo tail -f /var/log/secure
এরপর Windows থেকে SSH করুন। লাইভ এরর দেখাবে।
Windows এর ssh_config ফাইল বানাতে চাইলে – অপশনাল
এটা না থাকলেও SSH চলে। তবুও বানাতে চাইলে:
powershell
notepad $env:USERPROFILE\.ssh\config
ফাইলে পেস্ট করুন:
Code
Host centos-server
HostName 192.168.1.100
Port 22
User admin
IdentityFile C:/Users/HP/.ssh/id_ed25519
সেভ করুন। এখন শুধু ssh centos-server লিখলেই কানেক্ট হবে।
