آموزش تغییر پورت 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 این است که اول سرویس را ریاستارت میکنند و بعد متوجه میشوند فایروال پورت جدید را بسته است. پس قبل از هر تغییر، این موارد را بررسی کنید.
/etc/ssh/sshd_config بسازید.# بکاپ از تنظیمات 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 و سیاست ورود امن استفاده کنید.
شما میتوانید دیدگاه خود را در مورد این مطلب با ما به اشتراک بگذارید.