معمولاً پورت پیشفرض SSH 22 هست؛ بنابراین وقتی مینویسیم:
ssh user@SERVER_IPSSH Client بهصورت پیشفرض تلاش میکند به Port 22 سرور متصل شود.
اما میتونیم OpenSSH Server را طوری تنظیم کنید که روی Port دیگری مثل:
2222یا:
22022منتظر اتصال باشد.
در این صورت اتصال ما به شکل زیر خواهد بود:
ssh -p 2222 user@SERVER_IPاما تغییر Port SSH یک نکته بسیار مهم دارد:
اگر ترتیب تنظیم SSH و Firewall را اشتباه انجام دهید، ممکن است دسترسی خودتان به سرور را قطع کنید.
بنابراین قرار نیست ابتدا Port 22 را ببندیم و بعد امیدوار باشیم Port جدید کار کند.
روش امن این است:
انتخاب Port جدید
↓
باز کردن Port در Firewall
↓
باز کردن Port در Cloud Firewall
↓
تنظیم OpenSSH
↓
تست Configuration
↓
اعمال تغییر
↓
بررسی Listener
↓
تست اتصال جدید
↓
بستن Port قبلی
آیا تغییر پورت SSH امنیت سرور را بیشتر میکند؟
قبل از آموزش عملی بهتر است این سوءتفاهم را برطرف کنیم.
تغییر Port پیشفرض SSH از:
22به مثلاً:
2222میتواند تعداد زیادی از Botها و Scanهای بسیار سادهای را که فقط Port 22 را بررسی میکنند از Logهای شما دور کند.
در نتیجه ممکن است تعداد تلاشهای تصادفی Login کمتر شود.
اما:
تغییر پورت SSH جایگزین تنظیمات امنیتی واقعی نیست.
یک مهاجم یا Scanner میتواند Portهای باز Server را پیدا کند و تشخیص دهد سرویس SSH روی Port دیگری اجرا میشود.
برای امنیت SSH مواردی مثل اینها اهمیت بیشتری دارند:
استفاده از SSH Key
استفاده از User غیر Root
محدودکردن Password Login در صورت مناسب بودن سناریو
Firewall
محدودکردن Source IP در صورت امکان
Updateهای امنیتی
Monitoring
Fail2ban یا مکانیزمهای مشابه در صورت نیاز
پس تغییر Port را بیشتر یک لایه تکمیلی و کاهشدهنده Noise در نظر بگیرید.
قبل از تغییر پورت SSH چه چیزهایی لازم داریم؟
مهمترین پیشنیاز این آموزش این است که همین حالا یک SSH Session فعال داشته باشید.
Session فعلی را تا پایان آموزش نبندید.
اگر Provider سرور شما قابلیتهایی مثل:
Web Console
VNC
Serial Console
Recovery Consoleدارد، بهتر است مطمئن شویم روش استفاده از آن را هم میدونیم.
در صورت اشتباه در Configuration، Console میتواند راه بازگشت شما به Server باشد.
قدم اول: پورت فعلی SSH را پیدا کنید
قبل از تغییر Port، اول وضعیت فعلی Server را ببینید.
روی Ubuntu یا Debian:
sudo systemctl status sshو برای دیدن Portهایی که Server روی آنها Listen میکند:
sudo ss -tlnp | grep sshیا:
sudo ss -tlnp | grep ':22'ممکن است خروجیای شبیه این ببینید:
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 [::]:22 [::]:*یعنی SSH روی Port 22 در حال Listen است.
Ubuntu نیز استفاده از ss را برای شناسایی Portهای باز و Process در حال Listen توصیه میکند. (مستندات امنیت Ubuntu)
Configuration مؤثر SSH را هم بررسی کنید
اجرا کنید:
sudo sshd -T | grep -i '^port'در حالت معمول احتمالاً میبینید:
port 22این روش کمک میکند Configuration مؤثر sshd را ببینیم، نه اینکه فقط یک فایل Config را حدس بزنیم.
همچنین میتوانید بررسی کنید:
sudo sshd -T | grep -Ei '^(port|listenaddress|addressfamily)'تا وضعیت Port و Addressهای مرتبط را ببینید.
قدم دوم: یک Port جدید مناسب انتخاب کنید
برای مثال در ادامه آموزش از:
2222استفاده میکنیم.
شما میتوانید Port دیگری انتخاب کنید، اما بهتر است قبل از استفاده مطمئن شوید Service دیگری روی آن Listen نمیکند.
مثلاً:
sudo ss -tlnp | grep ':2222'اگر خروجی ندارید، احتمالاً Process فعالی روی آن Port وجود ندارد.
میتوانید فهرست Listenerهای فعلی را هم ببینید:
sudo ss -tlnpچه Portهایی را انتخاب نکنیم؟
بهتر است Port مربوط به سرویس معروف دیگری را تصادفی برای SSH انتخاب نکنید.
مثلاً Portهایی مثل:
80
443
3306
5432
6379معمولاً برای سرویسهای دیگری شناخته میشوند.
هدف ما ایجاد Configuration قابل نگهداری است، نه فقط انتخاب یک عدد عجیب.
قدم سوم: قبل از تغییر SSH، Port جدید را در Firewall باز کنید
این مرحله را قبل از تغییر OpenSSH انجام دهید.
اگر از UFW استفاده میکنید، وضعیت آن را ببینید:
sudo ufw status verboseبرای Port جدید:
sudo ufw allow 2222/tcpدوباره وضعیت را بررسی کنید:
sudo ufw status numberedباید Rule مربوط به Port جدید را ببینید.
مثلاً:
2222/tcp ALLOWفعلاً Port 22 را حذف نکنید.
یعنی موقتاً ممکن است Firewall اجازه هر دو Port را داشته باشد:
22 ✓
2222 ✓تا وقتی اتصال روی Port جدید را واقعاً تست نکردهایم، این حالت کاملاً عمدی است.
مستندات رسمی Ubuntu نیز امکان بازکردن Port مشخص با UFW و مشاهده Ruleها با ufw status numbered را مستند کرده است. (Ubuntu Firewall)
Cloud Firewall را فراموش نکنید
اگر VPS شما علاوه بر Firewall سیستمعامل، Firewall جداگانهای در پنل Provider دارد، Port جدید باید آنجا هم Allow شود.
ساختار ممکن است شبیه این باشد:
Internet
│
▼
Cloud Firewall
│
▼
UFW
│
▼
OpenSSHبنابراین فقط اجرای:
sudo ufw allow 2222/tcpکافی نیست اگر Cloud Firewall همچنان فقط Port 22 را قبول کند.
Inbound Rule جدید معمولاً چیزی شبیه این خواهد بود:
Protocol: TCP
Port: 2222
Source: IP/Range موردنیازاگر امکان محدودکردن SSH به IP یا Range مشخصی دارید و نیاز عملی شما اجازه میدهد، این روش از بازکردن SSH برای کل اینترنت محدودتر است.
قدم چهارم: از Configuration فعلی Backup بگیرید
قبل از تغییر OpenSSH بهتر است از فایل اصلی Backup داشته باشید.
مثلاً:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backupدر صورت ایجاد مشکل میتوانید Configuration قبلی را بررسی یا Restore کنید.
Ubuntu نیز قبل از تغییرات حساس OpenSSH تهیه نسخهای از Configuration را توصیه میکند. (مستندات OpenSSH اوبونتو)
قدم پنجم: Port جدید را در OpenSSH تنظیم کنید
فایل اصلی OpenSSH Server معمولاً:
/etc/ssh/sshd_configاست.
اما در Ubuntu امکان استفاده از Snippetهای جداگانه در:
/etc/ssh/sshd_config.d/هم وجود دارد.
این روش کمک میکند Custom Configuration شما از فایل اصلی جدا بماند.
مثلاً:
sudo nano /etc/ssh/sshd_config.d/00-custom-port.confو داخل آن:
Port 2222قرار دهید.
فایل را Save کنید.
اگر ترجیح میدهید فایل اصلی را ویرایش کنید:
sudo nano /etc/ssh/sshd_configو Directive مربوط به Port را تنظیم کنید:
Port 2222اما در سیستمهای Ubuntu که از sshd_config.d استفاده میکنند، باید Configurationهای موجود در آن Directory را هم در نظر بگیرید.
Ubuntu بهطور پیشفرض فایلهای:
/etc/ssh/sshd_config.d/*.confرا نیز Include میکند. (Ubuntu OpenSSH)
قدم ششم: قبل از Restart حتماً Configuration را تست کنید
این شاید مهمترین Command مقاله باشد:
sudo sshd -tاگر هیچ خروجیای مشاهده نکردید، Configuration از نظر Syntax معتبر است.
اما اگر خطایی وجود داشته باشد، آن را قبل از Restart برطرف کنید.
مثلاً یک Directive اشتباه میتواند باعث شود sshd دیگر Start نشود.
اصل مهم:
Edit
↓
sshd -t
↓
Applyنه:
Edit
↓
Restart فوری
↓
امیدوار باش!مستندات رسمی Ubuntu هم صراحتاً توصیه میکند پیش از Restart کردن SSH، Configuration با sshd -t بررسی شود، چون Config اشتباه میتواند باعث قطع دسترسی Remote شود. (Ubuntu OpenSSH)
یک نکته مهم برای Ubuntuهای جدید: ssh.socket
در نسخههای جدید Ubuntu ممکن است OpenSSH بهصورت Socket Activated اجرا شود.
برای بررسی:
systemctl status ssh.socketاگر ssh.socket فعال است، تغییر Port ممکن است فقط با Restart کردن:
sudo systemctl restart sshاعمال نشود.
در این حالت بعد از اینکه sshd -t موفق بود، میتوانید Configuration مربوط به systemd را Reload کنید:
sudo systemctl daemon-reloadو سپس:
sudo systemctl restart ssh.socketرا اجرا کنید.
بعد Port واقعی را بررسی کنید:
sudo ss -tlnp | grep ':2222'Ubuntu از نسخههای جدید خود برای OpenSSH از Socket Activation استفاده کرده و در Ubuntu 24.04 نیز Port و Listen Address از Configuration sshd توسط Generator مربوط به systemd خوانده میشوند.
پس نکته مهم این نیست که Commandها را کورکورانه اجرا کنید؛ ابتدا ببینید Server شما:
ssh.serviceیا:
ssh.socketرا چگونه مدیریت میکند.
اگر ssh.socket فعال نیست چه کنیم؟
اگر Server شما از مدل کلاسیک Service استفاده میکند، بعد از:
sudo sshd -tمیتوانید در Ubuntu:
sudo systemctl restart sshرا اجرا کنید.
در Ubuntu 26.04 نیز sshd.service بهعنوان Alias برای ssh.service در دسترس قرار گرفته است.
برای توزیعهای RHEL-based مثل AlmaLinux و Rocky Linux معمولاً Service با نام:
sudo systemctl restart sshdمدیریت میشود.
قدم هفتم: بررسی کنید Port جدید واقعاً Listening است
بعد از اعمال Configuration فوراً Session قبلی را نبندید.
اجرا کنید:
sudo ss -tlnp | grep ':2222'اگر Port جدید فعال شده باشد باید Listener مربوط به آن را ببینید.
مثلاً:
LISTEN 0 4096 0.0.0.0:2222 0.0.0.0:*یا معادل IPv6.
همچنین دوباره Configuration مؤثر را بررسی کنید:
sudo sshd -T | grep -i '^port'حالا باید Port موردنظر شما دیده شود.
قدم هشتم: از یک Terminal جدید اتصال را تست کنید
Terminal فعلی را باز نگه دارید.
یک Terminal جدید روی کامپیوترتان باز کنید و بنویسید:
ssh -p 2222 user@SERVER_IPاگر SSH Key مشخصی دارید:
ssh -p 2222 -i ~/.ssh/id_ed25519 user@SERVER_IPدر Windows PowerShell:
ssh -p 2222 -i "$env:USERPROFILE\.ssh\id_ed25519" user@SERVER_IPاگر Login موفق شد، Port جدید عملاً قابل استفاده است.
این مهمتر از مشاهده Configuration است.
ما میخواهیم مسیر کامل را Verify کنیم:
Client
↓
Internet
↓
Cloud Firewall
↓
Server Firewall
↓
Port 2222
↓
OpenSSH
↓
Authentication
↓
Login ✓Port جدید را از بیرون هم تست کنید
در Windows:
Test-NetConnection -ComputerName SERVER_IP -Port 2222اگر:
TcpTestSucceeded : Trueببینید، TCP Connection به Port جدید برقرار میشود.
در Linux/macOS:
nc -vz SERVER_IP 2222نیز قابل استفاده است.
این Testها در کنار Login واقعی کمک میکنند مطمئن شوید Firewall و Listener درست عمل میکنند.
قدم نهم: فقط بعد از تست موفق، Port 22 را ببندید
حالا فرض کنیم این دستور:
ssh -p 2222 user@SERVER_IPدر یک Terminal جدید با موفقیت Login میکند.
در این مرحله میتوانید Rule قدیمی Port 22 را از Firewall حذف کنید؛ البته فقط اگر SSH دیگر روی آن Port استفاده نمیشود.
ابتدا Ruleها را ببینید:
sudo ufw status numberedسپس Rule مربوط به Port 22 را با شماره صحیح حذف کنید یا، اگر Rule سادهای دارید:
sudo ufw delete allow 22/tcpدر صورت استفاده از Profile:
sudo ufw delete allow OpenSSHممکن است مناسب باشد، اما قبل از حذف حتماً ببینید Profile دقیقاً چه Portی را باز میکند.
Cloud Firewall را هم به همین شکل بهروزرسانی کنید.
در پایان هدف میتواند چنین باشد:
22 Closed
2222 Openاما فقط بعد از موفقیت Login روی Port جدید.
Port قدیمی هنوز باز است؛ مشکل چیست؟
اگر Configuration را تغییر دادهاید اما هنوز:
sudo ss -tlnp | grep ':22'Listener نشان میدهد، چند مورد را بررسی کنید.
اول ssh.socket
systemctl status ssh.socketاگر فعال است:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socketو بعد دوباره:
sudo ss -tlnpرا ببینید.
Configuration دیگری Port 22 را تعریف نکرده باشد
اجرا کنید:
sudo grep -Rni '^[[:space:]]*Port' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ممکن است چند Configuration مختلف وجود داشته باشد.
سپس:
sudo sshd -T | grep -i '^port'را بررسی کنید.
بعد از تغییر Port، چرا Connection refused میگیرم؟
فرض کنید:
ssh -p 2222 user@SERVER_IPفوراً خطای:
Connection refusedمیدهد.
احتمالاً یکی از این موارد وجود دارد:
sshd روی 2222 Listen نمیکند
Configuration اعمال نشده
Service/Socket مشکل دارد
Port اشتباه انتخاب شده
Firewall اتصال را REJECT میکنداول:
sudo ss -tlnp | grep ':2222'را بررسی کنید.
اگر Listener ندارید، Firewall اولین مشکل شما نیست؛ ابتدا باید OpenSSH واقعاً روی Port جدید Listen کند.
چرا روی Port جدید Connection timed out میگیرم؟
اگر مدتی صبر میکنید و بعد:
Connection timed outمیبینید، بیشتر این موارد را بررسی کنید:
UFW
Cloud Firewall
Security Group
Provider Firewall
Routing
Source IP Ruleاگر از اینترنت دیگری Port جدید قابل دسترسی است ولی از شبکه شما نیست، احتمال Source Network یا Filtering مطرح میشود.
این دقیقاً همان تفاوتی است که در مقالات عیبیابی SSH بررسی کردیم.
بعد از تغییر Port، چرا Permission denied میگیرم؟
این اتفاق در واقع خبر بدی نیست!
اگر:
ssh -p 2222 user@SERVER_IPبه:
Permission denied (publickey)میرسد، یعنی Connection به Port جدید برقرار شده و SSH Server پاسخ داده است.
حالا مشکل به مرحله:
Authenticationمنتقل شده است.
باید Username، Private Key و authorized_keys را بررسی کنید.
پس:
Connection refused
→ Port / Listener
Connection timed out
→ Network / Firewall
Permission denied
→ Authenticationآیا باید Port SSH را بالاتر از 1024 انتخاب کنیم؟
برای Custom SSH Port معمولاً استفاده از یک Port آزاد و غیرمتعارض بالاتر از محدوده Well-known Ports انتخاب سادهتری است.
اما هیچ عدد جادویی وجود ندارد.
مثلاً:
2222
22022
2022صرفاً نمونه هستند.
مهمتر از عدد Port این است که:
توسط Service دیگری استفاده نشود
Firewall آن را Allow کند
Cloud Firewall هماهنگ باشد
در Documentation تیم ثبت شود
Monitoring و Automation آن را بدانند
SSH Config را بعد از تغییر Port بهروز کنید
اگر مرتب به Server متصل میشوید، لازم نیست هر بار بنویسید:
ssh -p 2222 -i ~/.ssh/production user@203.0.113.10روی Client فایل:
~/.ssh/configرا تنظیم کنید.
مثلاً:
Host netzo-server
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/productionحالا فقط:
ssh netzo-serverرا اجرا میکنید.
در Windows OpenSSH نیز فایل Config کاربر معمولاً در:
%USERPROFILE%\.ssh\configقرار میگیرد.
Automation و Backup Scriptها را فراموش نکنید
اگر قبلاً ابزارهایی دارید که به Port 22 متصل میشوند، بعد از تغییر Port ممکن است Fail شوند.
مثلاً:
CI/CD
Git Deployment
Backup
Monitoring
Ansible
rsync
scp
sftp
Automation Scriptsهمه اینها را بررسی کنید.
برای scp:
scp -P 2222 file.txt user@SERVER_IP:/path/توجه کنید که در scp برای Port از:
-Pبزرگ استفاده میشود.
برای rsync:
rsync -av -e "ssh -p 2222" ./data/ user@SERVER_IP:/data/اگر Port را تغییر دهید ولی Automation قدیمی همچنان 22 را استفاده کند، ممکن است Backup یا Deployment بعدی بدون اینکه متوجه شوید Fail شود.
تغییر پورت SSH و Fail2ban
اگر Fail2ban دارید، بعد از تغییر Port وضعیت Jail مربوط به SSH را هم بررسی کنید.
مثلاً:
sudo fail2ban-client status sshdبسته به Configuration، Jail ممکن است Port را بهصورت:
sshیا عدد مشخص دریافت کند.
بعد از تغییر OpenSSH مطمئن شوید ابزارهای امنیتی شما همچنان Traffic صحیح را Monitor میکنند.
آیا Port 22 را میتوان کاملاً بست؟
بله، اگر:
SSH روی Port جدید واقعاً Listen میکند
Firewall جدید صحیح است
Cloud Firewall صحیح است
Login واقعی با Port جدید تست شده
Automationها Update شدهاند
آنوقت Port قبلی دیگر برای SSH لازم نیست.
اما هیچ عجلهای برای بستن آن قبل از تست نهایی وجود ندارد.
چکلیست امن تغییر Port SSH
Session فعلی SSH را باز نگه داشتم
در صورت امکان Console/Recovery Access را بررسی کردم
Port فعلی را با
ssبررسی کردمPort جدید با Service دیگری Conflict ندارد
Port جدید را ابتدا در UFW باز کردم
Port جدید را در Cloud Firewall باز کردم
از Configuration قبلی Backup گرفتم
Port جدید را در OpenSSH تنظیم کردم
sudo sshd -tبدون خطا اجرا شددر صورت فعال بودن
ssh.socketآن را Reload/Restart کردمبا
ssوجود Listener جدید را بررسی کردماز Terminal دوم Login واقعی انجام دادم
Automationها و SSH Config را Update کردم
فقط در پایان Port قبلی را بستم
اشتباهات رایج هنگام تغییر Port SSH
اول Port 22 را میبندیم
بدترین ترتیب ممکن است.
اول Port جدید را آماده و Test کنید؛ بعد Port قدیمی را ببندید.
فقط sshd_config را تغییر میدهیم
ممکن است UFW یا Cloud Firewall هنوز Port جدید را Block کند.
همیشه مسیر کامل را در نظر بگیرید:
Client
→ Cloud Firewall
→ Host Firewall
→ Listener
→ SSH Serverبعد از تغییر Config، sshd -t اجرا نمیکنیم
یک Typo میتواند باعث Start نشدن OpenSSH شود.
همیشه:
sudo sshd -tرا قبل از اعمال Configuration اجرا کنید.
Session فعلی را سریع میبندیم
تا زمانی که Terminal دوم با Port جدید Login نکرده:
Session قبلی را باز نگه دارید.
Port را تغییر میدهیم و فکر میکنیم SSH امن شده
Port غیر استاندارد جایگزین SSH Key، Firewall و Hardening واقعی نیست.
دستورات سریع تغییر پورت SSH در Ubuntu
اگر بخواهیم کل فرایند را خلاصه کنیم و فرض کنیم Port جدید 2222 است:
ابتدا Firewall:
sudo ufw allow 2222/tcpConfiguration:
sudo nano /etc/ssh/sshd_config.d/00-custom-port.confداخل فایل:
Port 2222تست:
sudo sshd -tبررسی Socket:
systemctl status ssh.socketاگر Socket Activation فعال است:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socketدر غیر این صورت:
sudo systemctl restart sshبررسی Listener:
sudo ss -tlnp | grep ':2222'و از Terminal دوم:
ssh -p 2222 user@SERVER_IPفقط اگر این Login موفق شد، سراغ حذف Port قبلی بروید.
جمعبندی
تغییر Port SSH کار سختی نیست؛ اما ترتیب انجام آن بسیار مهم است.
هدف این نیست که:
22را هرچه سریعتر ببندیم.
هدف این است که یک مسیر اتصال جدید را کاملاً بسازیم، Verify کنیم و فقط بعد مسیر قبلی را حذف کنیم.
ترتیب امن:
New Port
↓
UFW
↓
Cloud Firewall
↓
OpenSSH Config
↓
sshd -t
↓
Apply
↓
Check Listener
↓
Test New Session
↓
Close Old Portو یک نکته امنیتی را فراموش نکنید:
تغییر پورت SSH میتواند اسکنها و تلاشهای تصادفی روی Port 22 را کاهش دهد، اما جایگزین SSH Key، Firewall، Update و تنظیمات امنیتی صحیح نیست.
اگر بعد از تغییر Port با:
Connection refusedمواجه شدید، Listener و Service را بررسی کنید.
اگر:
Connection timed outگرفتید، Firewall و Network Path را بررسی کنید.
و اگر:
Permission denied (publickey)دیدید، Port جدید کار میکند و مشکل به Authentication مربوط است.
سوالات متداول
پورت پیشفرض SSH چیست؟
OpenSSH بهصورت معمول از TCP Port 22 استفاده میکند، مگر اینکه Configuration دیگری برای Server تعیین شده باشد.
چگونه پورت SSH را در Ubuntu تغییر دهیم؟
Port جدید را ابتدا در Firewall باز کنید، سپس Directive مربوط به Port را در Configuration OpenSSH تنظیم کنید، با sshd -t Config را تست کنید، Service یا ssh.socket را متناسب با سیستم اعمال کنید و در نهایت از Terminal جداگانه Login را تست کنید.
آیا تغییر Port SSH امنیت را بیشتر میکند؟
بهتنهایی یک مکانیزم امنیتی قوی نیست. این کار بیشتر میتواند Noise اسکنهای خودکار روی Port 22 را کاهش دهد. SSH Key، Firewall، Updateها و محدودکردن دسترسی اهمیت بیشتری دارند.
بعد از تغییر پورت چرا SSH هنوز روی 22 است؟
در Ubuntuهای جدید ممکن است ssh.socket فعال باشد یا Configuration دیگری Port را تعیین کند. وضعیت ssh.socket، خروجی sshd -T و Listenerهای واقعی با ss را بررسی کنید.
چگونه با پورت جدید SSH وصل شویم؟
از -p استفاده کنید:
ssh -p 2222 user@SERVER_IPآیا قبل از تغییر Port باید Port 22 را ببندیم؟
خیر. Port جدید را ابتدا کاملاً تنظیم و تست کنید و فقط بعد از Login موفق روی Port جدید، Port قبلی را ببندید.
چطور بفهمیم SSH روی پورت جدید Listen میکند؟
مثلاً برای Port 2222:
sudo ss -tlnp | grep ':2222'و برای Configuration مؤثر:
sudo sshd -T | grep -i '^port'



