🔐 آموزش امنیت SSH در لینوکس

آموزش تغییر پورت SSH در لینوکس؛ روش امن بدون قطع شدن دسترسی سرور

تغییر پورت SSH یکی از تنظیمات رایج برای کاهش اسکن‌ها و تلاش‌های ورود خودکار روی سرور لینوکس است؛ اما اگر بدون باز کردن فایروال، تست تنظیمات و نگه‌داشتن نشست فعلی انجام شود، ممکن است دسترسی شما به سرور قطع شود. در این آموزش، تغییر پورت SSH را در Ubuntu، Debian، AlmaLinux، Rocky و CentOS با SSH، UFW، firewalld، CSF و SELinux قدم‌به‌قدم انجام می‌دهیم.

پورت SSH چیست؟

SSH راه اصلی مدیریت امن سرورهای لینوکسی از راه دور است. به‌صورت پیش‌فرض، سرویس OpenSSH روی پورت 22 گوش می‌دهد؛ یعنی وقتی از کامپیوتر خود با دستور ssh user@server-ip وصل می‌شوید، معمولاً ارتباط از پورت 22 برقرار می‌شود.

وقتی پورت SSH را تغییر می‌دهید، سرویس SSH دیگر روی پورت پیش‌فرض 22 گوش نمی‌دهد و برای اتصال باید پورت جدید را مشخص کنید؛ مثلاً:

ssh -p 2222 root@SERVER_IP

نکته مهم

تغییر پورت SSH به معنی امن شدن کامل سرور نیست. این کار بیشتر باعث کاهش اسکن‌های عمومی و ربات‌های ساده می‌شود. برای امنیت واقعی باید احراز هویت با کلید SSH، رمز قوی، محدودسازی IP، فایروال، Fail2Ban یا CSF و غیرفعال‌سازی ورود مستقیم root را هم بررسی کنید.

آیا تغییر پورت SSH کار درستی است؟

در بسیاری از سرورها، لاگ‌های SSH پر از تلاش‌های ورود ناموفق روی پورت 22 است. تغییر پورت می‌تواند این نویز را کمتر کند و لاگ‌ها را تمیزتر نگه دارد. با این حال، اگر مهاجم پورت‌های سرور را اسکن کند، می‌تواند پورت جدید SSH را هم پیدا کند؛ بنابراین تغییر پورت را باید یک لایه کمکی دانست، نه جایگزین امنیت اصلی.

مزیت

کاهش تلاش‌های خودکار روی پورت 22، کمتر شدن لاگ‌های brute force و ساده‌تر شدن مانیتورینگ.

محدودیت

پورت جدید قابل کشف است و بدون کلید SSH، فایروال و سیاست ورود امن، امنیت کامل ایجاد نمی‌کند.

خطر

اگر پورت جدید را در فایروال باز نکنید یا تنظیمات SSH اشتباه باشد، ممکن است از سرور بیرون بیفتید.

قبل از تغییر پورت SSH این چک‌لیست را انجام دهید

بیشترین مشکل کاربران هنگام تغییر پورت SSH این است که اول سرویس را ری‌استارت می‌کنند و بعد متوجه می‌شوند فایروال پورت جدید را بسته است. پس قبل از هر تغییر، این موارد را بررسی کنید.

نشست فعلی SSH را نبندیدتا زمانی که اتصال با پورت جدید را تست نکرده‌اید، پنجره فعلی SSH را باز نگه دارید.
کنسول اضطراری داشته باشیددر پنل ارائه‌دهنده سرور، امکان VNC/Console/Rescue را بشناسید تا اگر SSH قطع شد بتوانید وارد شوید.
از فایل تنظیمات بکاپ بگیریدقبل از تغییر، یک کپی از /etc/ssh/sshd_config بسازید.
پورت جدید را در فایروال باز کنیدقبل از ری‌استارت SSH، در UFW، firewalld، CSF یا فایروال پنل سرور، پورت جدید را اجازه دهید.
تنظیمات را با sshd -t تست کنیداگر فایل تنظیمات خطا داشته باشد، sshd ممکن است بعد از ری‌استارت بالا نیاید.

# بکاپ از تنظیمات SSH
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%F-%H%M)

# بررسی پورت‌های در حال استفاده
sudo ss -tulpn | grep -E ':(22|2222|22022)s'

# نمایش تنظیم فعلی پورت، اگر در فایل اصلی باشد
sudo grep -nE '^s*#?s*Ports+' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null

چه پورتی برای SSH انتخاب کنیم؟

پورت جدید بهتر است عددی بالاتر از 1024 و کمتر از 65535 باشد و با سرویس‌های رایج مثل 80، 443، 25، 53، 3306، 5432، 6379 و پورت‌های کنترل‌پنل تداخل نداشته باشد. مثال‌های رایج برای SSH سفارشی: 2222، 22022 یا 49222.

انتخاب پورت توضیح
22 پورت پیش‌فرض SSH؛ ساده و استاندارد، اما بیشتر اسکن می‌شود.
2222 یا 22022 برای سرورهای معمولی قابل فهم و رایج است، اما باید در فایروال باز شود.
پورت‌های سرویس‌های معروف مثل 80، 443، 25 و 3306 را برای SSH انتخاب نکنید؛ باعث تداخل و عیب‌یابی سخت می‌شود.
پورت خیلی تصادفی می‌تواند اسکن عمومی را کمتر کند، اما باید در مستندات سرور یادداشت شود تا فراموش نشود.

مرحله اول: پورت جدید را در فایروال باز کنید

قبل از تغییر فایل SSH، پورت جدید را در فایروال باز کنید. در مثال‌های زیر پورت جدید را 2222 فرض می‌کنیم. اگر پورت دیگری انتخاب کرده‌اید، عدد را عوض کنید.

باز کردن پورت در Ubuntu/Debian با UFW

sudo ufw allow 2222/tcp
sudo ufw status verbose

باز کردن پورت در AlmaLinux/Rocky/CentOS با firewalld

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

باز کردن پورت در CSF Firewall

اگر روی سرور CSF نصب است، باید پورت جدید را در TCP_IN اضافه کنید. تا وقتی اتصال جدید را تست نکرده‌اید، پورت 22 را حذف نکنید.

sudo nano /etc/csf/csf.conf
# در TCP_IN مقدار 2222 را اضافه کنید، مثال:
# TCP_IN = "22,2222,80,443"

sudo csf -r
sudo csf -l | grep 2222

فایروال پنل دیتاسنتر یا Cloud Firewall

گاهی فایروال داخل سیستم‌عامل باز است، اما فایروال پنل ارائه‌دهنده سرور یا Cloud Firewall پورت جدید را می‌بندد. اگر بعد از همه تنظیمات هنوز اتصال timeout می‌شود، Security Group، Cloud Firewall یا Firewall Policy دیتاسنتر را هم بررسی کنید.

مرحله دوم: تغییر پورت SSH در لینوکس

در بیشتر سرورهای لینوکسی، تنظیمات SSH در /etc/ssh/sshd_config و گاهی در فایل‌های داخل /etc/ssh/sshd_config.d/ قرار دارد. روش تمیزتر این است که یک فایل جداگانه برای پورت سفارشی بسازید تا تغییرات شما از تنظیمات پیش‌فرض سیستم جدا بماند.

روش پیشنهادی: ساخت فایل تنظیم جداگانه

echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/99-custom-port.conf

# بررسی اینکه فایل درست ساخته شده است
sudo cat /etc/ssh/sshd_config.d/99-custom-port.conf

روش جایگزین: ویرایش فایل اصلی sshd_config

sudo nano /etc/ssh/sshd_config

خط مربوط به پورت را پیدا کنید. اگر این خط کامنت شده بود:

#Port 22

آن را به شکل زیر تغییر دهید:

Port 2222

نکته برای سرورهایی که چند فایل تنظیم دارند

اگر هم در فایل اصلی و هم در فایل‌های sshd_config.d مقدار Port تعریف شده باشد، نتیجه ممکن است با چیزی که انتظار دارید متفاوت شود. بعد از تغییر، خروجی sshd -T | grep '^port ' را بررسی کنید تا ببینید SSH واقعاً قرار است روی چه پورتی گوش بدهد.

نکته مهم برای AlmaLinux/Rocky/CentOS/RHEL: SELinux

اگر SELinux در حالت Enforcing فعال باشد، ممکن است فقط تغییر sshd_config و فایروال کافی نباشد. در این حالت باید به SELinux بگویید سرویس SSH اجازه دارد روی پورت جدید گوش بدهد.

# بررسی وضعیت SELinux
getenforce

# نصب ابزار semanage در صورت نبودن
sudo dnf install -y policycoreutils-python-utils

# بررسی پورت‌های مجاز فعلی برای SSH
sudo semanage port -l | grep ssh

# اضافه کردن پورت جدید برای SSH
sudo semanage port -a -t ssh_port_t -p tcp 2222

# اگر خطای already defined گرفتید، از -m استفاده کنید
sudo semanage port -m -t ssh_port_t -p tcp 2222

اگر این مرحله لازم باشد و انجام نشود، ممکن است در لاگ‌ها خطاهای SELinux یا bind شدن sshd روی پورت جدید را ببینید.

مرحله سوم: تست تنظیمات و ری‌استارت SSH

قبل از ری‌استارت، حتماً تنظیمات را تست کنید. اگر خروجی خطا نداشت، یعنی فایل تنظیمات از نظر ساختار درست است.

sudo sshd -t

ری‌استارت سرویس SSH در Ubuntu/Debian

sudo systemctl restart ssh
sudo systemctl status ssh --no-pager

ری‌استارت سرویس SSH در AlmaLinux/Rocky/CentOS

sudo systemctl restart sshd
sudo systemctl status sshd --no-pager

تست اتصال با پورت جدید

نشست فعلی را نبندید. یک پنجره جدید Terminal باز کنید و با پورت جدید تست کنید:

ssh -p 2222 root@SERVER_IP

اگر با کاربر غیر root وصل می‌شوید:

ssh -p 2222 username@SERVER_IP

تست از خود سرور

sudo ss -tulpn | grep 2222
nc -vz 127.0.0.1 2222

بعد از موفقیت چه کنیم؟

وقتی مطمئن شدید اتصال با پورت جدید کار می‌کند، می‌توانید پورت 22 را از فایروال حذف کنید. اما اگر چند مدیر یا سیستم مانیتورینگ دارید، قبل از حذف پورت 22 مطمئن شوید همه آن‌ها پورت جدید را می‌دانند.

اتصال با پورت جدید در ابزارهای مختلف

ابزار روش اتصال
Linux/macOS Terminal ssh -p 2222 user@SERVER_IP
Windows PowerShell ssh -p 2222 user@SERVER_IP
PuTTY در بخش Host Name، IP سرور را وارد کنید و در فیلد Port عدد 2222 را بگذارید.
Bitvise SSH Client در بخش Server، Host را IP سرور و Port را پورت جدید قرار دهید.
WinSCP Protocol را SFTP بگذارید و Port number را به پورت جدید تغییر دهید.

مشکلات رایج بعد از تغییر پورت SSH و راه‌حل

خطای Connection timed out

این خطا معمولاً یعنی مسیر شبکه یا فایروال، پورت جدید را نمی‌گذارد. فایروال سیستم‌عامل، CSF، UFW، firewalld، فایروال پنل سرور و Security Group را بررسی کنید.

sudo ufw status verbose
sudo firewall-cmd --list-ports 2>/dev/null
sudo csf -l 2>/dev/null | grep 2222

خطای Connection refused

این خطا معمولاً یعنی به سرور رسیدید، اما sshd روی آن پورت گوش نمی‌دهد یا سرویس SSH بالا نیست.

sudo systemctl status ssh sshd --no-pager
sudo ss -tulpn | grep ssh
sudo sshd -T | grep '^port '

بعد از ری‌استارت، SSH بالا نمی‌آید

احتمالاً فایل تنظیمات خطا دارد. از نشست فعلی، VNC یا Rescue وارد شوید و خروجی تست را ببینید:

sudo sshd -t
sudo journalctl -u ssh -n 80 --no-pager
sudo journalctl -u sshd -n 80 --no-pager

روی سرورهای SELinux پورت جدید کار نمی‌کند

اگر سیستم AlmaLinux، Rocky، CentOS یا RHEL دارید و SELinux فعال است، پورت جدید را با semanage برای نوع ssh_port_t ثبت کنید.

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

بعد از تغییر پورت، پنل یا اسکریپت‌های بکاپ وصل نمی‌شوند

اگر مانیتورینگ، بکاپ، CI/CD، rsync یا اسکریپت‌های مدیریتی دارید، باید پورت جدید را در آن‌ها هم تغییر دهید. فقط تغییر پورت روی سرور کافی نیست؛ کلاینت‌ها هم باید با پورت جدید وصل شوند.

پورت جدید را فراموش کرده‌ام

از پنل VNC/Console یا Rescue وارد سرور شوید و فایل تنظیمات SSH را بررسی کنید:

grep -RniE '^s*Ports+' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null

روش امن برگشت به پورت 22

اگر پورت جدید مشکل دارد یا می‌خواهید به حالت قبل برگردید، ابتدا پورت 22 را در فایروال باز کنید، سپس تنظیمات SSH را به 22 برگردانید و سرویس را ری‌استارت کنید.

# باز کردن پورت 22 در UFW
sudo ufw allow 22/tcp

# باز کردن پورت 22 در firewalld
sudo firewall-cmd --add-port=22/tcp
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --reload

# حذف فایل تنظیم پورت سفارشی، اگر از روش drop-in استفاده کرده‌اید
sudo rm -f /etc/ssh/sshd_config.d/99-custom-port.conf

# تست و ری‌استارت
sudo sshd -t
sudo systemctl restart ssh 2>/dev/null || sudo systemctl restart sshd

چک‌لیست امنیتی بعد از تغییر پورت SSH

  • ورود با پورت جدید را از یک پنجره جدید تست کنید.
  • پورت 22 را فقط بعد از تست موفق ببندید.
  • اگر IP ثابت دارید، دسترسی SSH را فقط به همان IP محدود کنید.
  • ورود با کلید SSH را فعال و رمزهای ضعیف را حذف کنید.
  • اگر لازم نیست، ورود مستقیم root را غیرفعال کنید.
  • Fail2Ban یا CSF/LFD را برای کاهش brute force فعال کنید.
  • پورت جدید را در مستندات سرور، ابزار بکاپ و مانیتورینگ ثبت کنید.

سوالات متداول درباره تغییر پورت SSH

آیا تغییر پورت SSH امنیت سرور را کامل می‌کند؟

خیر. تغییر پورت فقط اسکن‌ها و تلاش‌های ورود ساده روی پورت 22 را کمتر می‌کند. برای امنیت واقعی باید کلید SSH، فایروال، محدودسازی IP و سیاست ورود امن داشته باشید.

بهترین پورت جایگزین برای SSH چیست؟

یک عدد بالاتر از 1024 و کمتر از 65535 انتخاب کنید که با سرویس‌های مهم سرور تداخل نداشته باشد. پورت‌هایی مثل 2222 یا 22022 رایج هستند.

چرا بعد از تغییر پورت، اتصال SSH تایم‌اوت می‌شود؟

معمولاً پورت جدید در فایروال سیستم‌عامل، CSF، فایروال دیتاسنتر یا Security Group باز نشده است.

چرا خطای Connection refused می‌گیرم؟

این خطا اغلب یعنی sshd روی پورت جدید گوش نمی‌دهد یا سرویس SSH درست ری‌استارت نشده است. خروجی ss -tulpn و systemctl status ssh/sshd را بررسی کنید.

آیا باید پورت 22 را فوراً ببندم؟

خیر. اول با پورت جدید از یک پنجره جداگانه وصل شوید. وقتی مطمئن شدید اتصال پایدار است، بعد پورت 22 را از فایروال حذف کنید.

اگر بعد از تغییر پورت از سرور بیرون افتادم چه کنم؟

از VNC، Console یا Rescue Mode پنل ارائه‌دهنده سرور وارد شوید، پورت 22 را باز کنید یا فایل تنظیمات SSH را به حالت قبلی برگردانید.

آیا در SELinux باید کار خاصی انجام بدهم؟

در توزیع‌هایی مثل AlmaLinux، Rocky، CentOS و RHEL اگر SELinux در حالت Enforcing باشد، معمولاً باید پورت جدید را با semanage port برای ssh_port_t ثبت کنید.

آیا تغییر پورت SSH روی SFTP و SCP هم اثر دارد؟

بله. چون SFTP و SCP معمولاً از همان سرویس SSH استفاده می‌کنند، در ابزارهایی مثل WinSCP، FileZilla، scp و rsync باید پورت جدید را وارد کنید.

جمع‌بندی

تغییر پورت SSH در لینوکس کار سختی نیست، اما اگر ترتیب مراحل رعایت نشود می‌تواند باعث قطع دسترسی شود. همیشه اول پورت جدید را در فایروال باز کنید، از تنظیمات بکاپ بگیرید، با sshd -t فایل را تست کنید، سرویس SSH را ری‌استارت کنید و قبل از بستن نشست فعلی، اتصال جدید را با ssh -p PORT امتحان کنید. برای امنیت بهتر هم تغییر پورت را کنار کلید SSH، محدودسازی IP، CSF/Fail2Ban و سیاست ورود امن استفاده کنید.