SSH در Ubuntu
آموزش کامل نصب و پیکربندی OpenSSH در Ubuntu: کلیدهای SSH، تأمین امنیت سرور، SSH tunneling، SFTP و رفع خطاهای رایج.
OpenSSH استاندارد طلایی برای ورود از راه دور و انتقال امن فایل در لینوکس است. در این آموزش با نصب، پیکربندی، امنسازی و استفادهٔ پیشرفته از SSH در Ubuntu آشنا میشوید.
نصب OpenSSH
روی Ubuntu Desktop
Ubuntu Desktop بهطور پیشفرض فقط کلاینت SSH را دارد. برای نصب سرور:
# نصب سرور SSH
sudo apt update
sudo apt install -y openssh-server
# بررسی وضعیت سرویس
sudo systemctl status ssh
# ● ssh.service - OpenBSD Secure Shell server
# Active: active (running) since ...روی Ubuntu Server
Ubuntu Server در طول نصب، از شما میپرسد آیا SSH نصب شود. اگر در زمان نصب فعال نکردید:
sudo apt install -y openssh-server
sudo systemctl enable --now sshنام سرویس SSH در Ubuntu
در Ubuntu 24.04 به بعد، سرویس SSH با نام ssh.service شناخته میشود (نه sshd.service). هر دو به یک فایل واحد اشاره میکنند، اما در دستورات systemctl از ssh استفاده کنید.
اتصال به سرور با SSH
# اتصال با نام کاربری و آدرس
ssh ali@192.168.1.10
# اتصال با پورت غیرپیشفرض
ssh -p 2222 ali@192.168.1.10
# اتصال و اجرای یک دستور
ssh ali@192.168.1.10 "uname -a"
# اتصال با تخصیص کلید
ssh -i ~/.ssh/mykey ali@192.168.1.10پس از اولین اتصال، اثر انگشت کلید سرور در ~/.ssh/known_hosts ذخیره میشود:
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
ED25519 key fingerprint is SHA256:abc123...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.10' (ED25519) to the list of known hosts.
ali@192.168.1.10's password: ********احراز هویت با کلید عمومی
استفاده از کلید SSH بهجای رمز عبور، هم راحتتر و هم بسیار امنتر است.
۱. ساخت کلید روی کلاینت
# ساخت کلید ED25519 (توصیهشده)
ssh-keygen -t ed25519 -C "ali@laptop"
# خروجی:
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/ali/.ssh/id_ed25519):
# Enter passphrase (empty for no passphrase): ********
# Enter same passphrase again: ********
# Your identification has been saved in /home/ali/.ssh/id_ed25519
# Your public key has been saved in /home/ali/.ssh/id_ed25519.pubED25519 بهجای RSA
الگوریتم ED25519 کوتاهتر، سریعتر و امنتر از RSA است. اگر نرمافزار قدیمی دارید که RSA لازم است، از ssh-keygen -t rsa -b 4096 استفاده کنید. در غیر این صورت، همیشه ED25519 را ترجیح دهید.
۲. کپی کلید عمومی روی سرور
# روش ساده با ssh-copy-id
ssh-copy-id ali@192.168.1.10
# یا روش دستی
cat ~/.ssh/id_ed25519.pub | ssh ali@192.168.1.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys"۳. تست اتصال
# اکنون بدون رمز باید وارد شوید
ssh ali@192.168.1.10
# Enter passphrase for key '/home/ali/.ssh/id_ed25519': ********
# (این passphrase کلید است، نه رمز سرور)۴. استفاده از ssh-agent برای جلوگیری از تکرار passphrase
# شروع ssh-agent
eval "$(ssh-agent -s)"
# افزودن کلید
ssh-add ~/.ssh/id_ed25519
# Enter passphrase for /home/ali/.ssh/id_ed25519: ********
# Identity added: /home/ali/.ssh/id_ed25519
# حالا در این session، دیگر passphrase پرسیده نمیشودپیکربندی سرور SSH
فایل پیکربندی سرور در /etc/ssh/sshd_config (یا /etc/ssh/sshd_config.d/) است:
# ویرایش فایل اصلی
sudo nano /etc/ssh/sshd_config
# یا ساخت فایل drop-in (روش مدرن)
sudo nano /etc/ssh/sshd_config.d/99-custom.confتنظیمات امنیتی پیشنهادی
# /etc/ssh/sshd_config.d/99-custom.conf
# پورت غیراستاندارد (مثلاً 2222)
Port 2222
# غیرفعالکردن ورود با رمز
PasswordAuthentication no
# غیرفعالکردن ورود root
PermitRootLogin no
# فقط کلید ED25519 و RSA
PubkeyAcceptedKeyTypes ssh-ed25519,rsa-sha2-512,rsa-sha2-256
# محدودیت کاربران مجاز
AllowUsers ali maryam
# timeout نشست
ClientAliveInterval 300
ClientAliveCountMax 0
# غیرفعالکردن X11 forwarding (اگر سرور دسکتاپ ندارد)
X11Forwarding no
# محدودیت احراز هویت
MaxAuthTries 3
LoginGraceTime 30پس از تغییر:
# تست پیکربندی
sudo sshd -t
# بارگذاری مجدد (بدون قطع نشستهای فعلی)
sudo systemctl reload sshهرگز نشست SSH فعلی را نبندید
هنگام تغییر پیکربندی SSH، همیشه نشست فعلی را باز نگه دارید و در یک ترمینال دیگر، نشست جدیدی باز کنید تا مطمئن شوید هنوز میتوانید وارد شوید. اگر پیکربندی خراب باشد، بدون دسترسی فیزیکی یا کنسول ابری، سیستم قفل میشود.
فایل پیکربندی کلاینت
برای کلاینت SSH، میتوانید در ~/.ssh/config میانبرهایی تعریف کنید:
# ~/.ssh/config
Host myserver
HostName 192.168.1.10
User ali
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host github.com
User git
IdentityFile ~/.ssh/github_key
IdentitiesOnly yesحالا بهجای تایپ همهٔ گزینهها:
ssh myserver
scp file.txt myserver:~/SFTP — انتقال امن فایل
# اتصال SFTP
sftp ali@192.168.1.10
# دستورات داخل sftp:
# sftp> ls
# sftp> cd /tmp
# sftp> get remote-file.txt local-file.txt
# sftp> put local-file.txt remote-file.txt
# sftp> exitSCP — کپی مستقیم
# کپی فایل محلی به سرور
scp file.txt ali@192.168.1.10:~/
# کپی فایل از سرور به محلی
scp ali@192.168.1.10:/var/log/syslog ./
# کپی پوشه بهصورت بازگشتی
scp -r myfolder/ ali@192.168.1.10:~/
# با پورت غیرپیشفرض
scp -P 2222 file.txt ali@192.168.1.10:~/SSH Tunneling (Port Forwarding)
Local Port Forwarding
دسترسی به یک سرویس روی سرور (که از بیرون قابل دسترسی نیست) از طریق پورت محلی:
# دسترسی به PostgreSQL روی سرور (پورت 5432) از طریق پورت محلی 15432
ssh -L 15432:localhost:5432 ali@192.168.1.10
# حالا به localhost:15432 وصل شوید
psql -h localhost -p 15432 -U postgresRemote Port Forwarding
باز کردن پورت روی سرور که به سرویس محلی شما منتقل میشود:
# نمایش وبسرور محلی روی پورت 8080 سرور
ssh -R 8080:localhost:80 ali@192.168.1.10Dynamic Port Forwarding (SOCKS proxy)
# ساخت SOCKS proxy روی پورت محلی 1080
ssh -D 1080 ali@192.168.1.10
# حالا در مرورگر، SOCKS5 proxy روی localhost:1080 تنظیم کنیدfail2ban برای محافظت از brute-force
# نصب fail2ban
sudo apt install -y fail2ban
# فعالسازی
sudo systemctl enable --now fail2ban
# بررسی وضعیت
sudo fail2ban-client status sshd
# Status for the jail: sshs
# |- Filter
# | |- Currently failed: 0
# | |- Total failed: 3
# `- Actions
# |- Currently banned: 0
# |- Total banned: 1خطاهای رایج
۱. Permission denied (publickey)
ali@192.168.1.10: Permission denied (publickey).راهحل:
# اجرای ssh با debug برای دیدن دلیل
ssh -v ali@192.168.1.10
# بررسی مجوزهای فایل کلید
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub۲. Connection refused
راهحل: سرویس SSH اجرا نیست:
# روی سرور
sudo systemctl start ssh
sudo systemctl enable ssh۳. Connection timed out
راهحل:
- فایروال را بررسی کنید:
sudo ufw status - آدرس IP را تأیید کنید:
ping 192.168.1.10 - پورت را بررسی کنید:
nc -zv 192.168.1.10 22
۴. Host key verification failed
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@راهحل: اگر مطمئن هستید سرور همان است (مثلاً reinstall شده):
# حذف کلید قدیمی
ssh-keygen -R 192.168.1.10
# اتصال مجدد
ssh ali@192.168.1.10۵. SSH کند است در ورود
راهحل: معمولاً بهخاطر تلاش برای reverse DNS است. در فایل پیکربندی سرور اضافه کنید:
UseDNS no
GSSAPIAuthentication nosudo systemctl reload sshخلاصه و مرحلهٔ بعد
SSH در Ubuntu با OpenSSH راهاندازی سادهای دارد، اما برای استفادهٔ امن و حرفهای باید از کلید عمومی، فایل پیکربندی و fail2ban استفاده کنید. همیشه قبل از بستن نشست فعلی، پیکربندی جدید را تست کنید.
بهعنوان گام بعدی:
- آموزش systemd را برای مدیریت سرویس ssh ببینید
- آموزش مدیریت کاربران را برای ساخت کاربر SSH بخوانید
- آموزش تنظیم شبکه را برای پیکربندی شبکه مرور کنید
این صفحه در تاریخ ۹ تیر ۱۴۰۵ بهروزرسانی شده است.