در این مقاله با شما هستیم تحت عنوان حل مشکل ssh اتصال به سرور پس تا انتهای این مطلب مفید ما را همراهی کنید.
مشکل وصل نشدن SSH یک چالش همیشگی برای کاربران ترمینال لینوکس است. مواجهه با ارور SSH هنگام اتصال به سرور مجازی لینوکس ممکن است برای همه افراد اتفاق بیفتد. چنانچه شما نیز قادر به اتصال به سرور ابری نیستید و با خطای SSH مواجه میشوید، این مقاله برایتان کاربردی خواهد بود. در مطلب پیش رو به بررسی رایجترین مشکلات SSH میپردازیم
هنگام استفاده از پروتکل SSH (Secure Shell) برای دسترسی به یک سرور راه دور، ممکن است با پیامSSH Connection Refused Error واجه شوید. این یک خطای رایج است که نشان می دهد سرور SSH شما اتصالات را نمی پذیرد.
در این آموزش توضیح خواهیم داد که پروتکل SSH (Secure Shell) چیست و علل احتمالی خطای SSH Connection چیست. همچنین، ما شما را از طریق شش روش موثر برای حل این خطای اتصال SSH راهنمایی خواهیم کرد.
در این بخش، ما رایجترین علل SSH Connection Refused” Error را کشف میکنیم.
پورت SSH اشتباه است
پورت SSH به شما امکان دسترسی به یک سرور راه دور را می دهد. به همین دلیل مهم است که هنگام باز کردن پورت SSH مطمئن شوید که به سمت راست اشاره می کنید. در غیر این صورت، هنگام تلاش برای انجام یک اتصال از راه دور، پیام SSH Connection Refused Error را دریافت خواهید کرد.
اعتبارنامه ها نادرست هستند
چند بار تایپ کردن اعتبارنامه اشتباه منجر به تلاشهای ناموفق برای ورود به سیستم میشود و باعث خطای SSH Connection Refused Error شد. مطمئن شوید که نام کاربری، رمز عبور، نام میزبان و پورت صحیح را وارد کرده اید تا از خرابی اتصال SSH جلوگیری کنید.
کلاینت SSH نصب نشده است
یکی دیگر از مشکلات رایجی که باعث خطای SSH “Connection رد شد” نصب نشدن نرم افزار کلاینت SSH در لوکال هاست شماست. یک کلاینت SSH اتصال ایمن به سرورهای SSH را فعال می کند. به طور خلاصه، در وهله اول نمی توانید درخواست اتصال به سرور SSH را بدون کلاینت SSH آغاز کنید.
SSH Daemon روی سرور نصب نشده است
علاوه بر سرویس گیرنده SSH، برای دسترسی به سرور راه دور از دستگاه محلی خود، باید SSH Daemon را نیز نصب کنید. SSH Daemon درخواست های احراز هویت شده ای را که از طریق یک کلاینت SSH انجام می شود می پذیرد. هنگامی که SSH Daemon به درستی پیکربندی نشده باشد، ممکن است مشکل “اتصال رد شده” SSH رخ دهد.
سرویس های SSH غیرفعال هستند
افزایش ترافیک و حملات DDoS دلایل احتمالی برای غیرفعال شدن سرویس SSH هستند. وقتی سرویس SSH شما قطع است، SSH Daemon نمیتواند اتصالات به سرور راه دور را بپذیرد. بنابراین، با پیام SSH “اتصال رد شد” روبرو خواهید شد.
حل مشکل ssh اتصال به سرور
فایروال از اتصال SSH جلوگیری می کند
هنگامی که یک فایروال از سرور شما در برابر اتصالات ورودی غیرمجاز محافظت می کند، ممکن است اتصالات SSH را نیز مسدود کند. شما باید قوانین فایروال خاصی را اعمال کنید تا درخواست های اتصال SSH را فعال کنید و از خطای SSH “Connection Refuzed” اجتناب کنید.
۶ راه برای رفع خطای اتصال SSH Refused
پس از شناسایی آنچه باعث خطای SSH Connection Refuzed شده است، نوبت به رفع آن رسیده است.
در این بخش، نگاهی دقیقتر به شش روش اثباتشده برای انجام این کار خواهیم داشت.
۱. شماره پورت SSH را تغییر دهید
یک اتصال SSH به طور پیشفرض روی پورت ۲۲ اجرا میشود، اما ممکن است در صورت عدم استفاده برای مدتی به دلایل امنیتی، پورت بسته شود. بنابراین، قبل از اتصال به سرور راه دور، از باز بودن پورت SSH اطمینان حاصل کنید.
برای بررسی پورت هایی که به درخواست ها گوش می دهند از دستور زیر استفاده کنید:
sudo lsof -i -n -P | grep گوش کن
با این حال، پورت باز پیش فرض ۲۲ در برابر حملات سایبری آسیب پذیرتر است. ما شما را توصیه می کنیم که از یک پورت متفاوت برای کاهش خطرات امنیتی استفاده کنید.
در اغلب هاست ها از پورت SSH 65002 سفارشی استفاده می کنند . بنابراین، هنگام دسترسی به جزئیات SSH در Panel خود، ۶۵۰۰۲ را به عنوان شماره پورت پیش فرض خواهید دید.
۲. اعتبارنامه را دو بار بررسی کنید
مطمئن شوید که از اعداد و کاراکترهای صحیح برای اطلاعات زیر استفاده می کنید:
- نام میزبان – این نام دامنه شما یا آدرس IP سرور شما است.
- نام کاربری – نام کاربری FTP خود را وارد کنید.
- بندر – کاربران هاستینگر باید از پورت سفارشی استفاده کنند ۶۵۰۰۲، در حالی که دیگران می توانند پورت پیش فرض ۲۲ را انتخاب کنند.
- کلمه عبور – رمز عبور حساب FTP خود را وارد کنید.
برای کاربران اکثر هاست ها ، نام کاربری و رمز عبور SSH شما با حساب FTP شما یکسان خواهد بود. شما می توانید این اعتبار را در Panel خود پیدا کنید. اگر این مورد در دسترس نبود از ارائه دهنده میزبانی و هاست خود این اطلاعات را بخواهید.
برای مدیریت رمز عبور خود، به Panel هاست بروید . در نوار کناری، کلیک کنید میزبانی → فایل ها → حساب های FTP. جزئیات نام کاربری FTP و گزینه ای برای تغییر رمز عبور FTP خود را مشاهده خواهید کرد. ما در این مثال تصاویر هاست هاستینگر را مثال زدیم ولی به طورکلی اغلب شرکت ها مسیری مشابه تصاویر زیر را دارند.
توجه داشته باشید که اگر از میزبان های وب دیگر استفاده می کنید، ممکن است مجبور شوید به روش دیگری به این جزئیات دسترسی داشته باشید.
۳. مطمئن شوید که SSH فعال است
اگر سرور SSH خود را فعال نکنید، SSH Daemons قادر به گوش دادن و پذیرش درخواستها نخواهند بود.
کاربران هاست های مختلف می توانند تنظیمات SSH را از طریق کنترل پنل وب مدیریت کنند. به سادگی به مسیر خود بروید Panel → میزبانی. سپس، کلیک کنید مدیریت کنید در وب سایت مورد نظر
پس از آن، کلیک کنید پیشرفته → دسترسی به SSH بر روی Panel نوار کناری بررسی کنید که آیا اعتبار شما درست است و کلیک کنید فعال کردن تا SSH خود را فعال کنید.
۴. مطمئن شوید که SSH Client نصب شده است
راه اندازی SSH Client در دستگاه خود به شما امکان می دهد دستورات از راه دور را روی سرور خود انجام دهید. ابتدا، با وارد کردن این مورد در ترمینال خود، بررسی کنید که آیا این مورد را روی دستگاه خود نصب کرده اید یا خیر:
کاربران هاستینگر می توانند دستور SSH را از آن کپی کنند hPanel. برو به پیشرفته بخش، کلیک کنید دسترسی SSH، و متن فرمان را در زیر می بینید وارد SSH شوید بخش سپس، روی نماد کپی کلیک کنید.
کاربران لینوکس و macOS می توانند از ترمینال داخلی برای اتصال حساب ها از طریق SSH استفاده کنند. در همین حال، کاربران ویندوز باید از یک کلاینت SSH برای برقراری ارتباط با حساب های خود استفاده کنند، به عنوان مثال، PuTTY.
روی همان وارد SSH شوید روی دکمه PuTTY کلیک کنید و لینک های دانلود فایل های بسته را مشاهده خواهید کرد.
از جزئیات SSH روی Panel خود استفاده کنید مانند آدرس IP سرور، نام کاربری، پورت و رمز عبور برای اتصال به PuTTY.
۵. مطمئن شوید که SSH Daemon روی سرور نصب شده است
هنگامی که یک Daemon در دسترس نباشد، محلی SSH ممکن است اتصال ورودی را نیز مسدود کند.
اکثر شرکتهای میزبانی وب یک Daemon SSH از پیش نصب شده روی سرور خود ارائه میکنند. اما وضعیت SSH Daemon شما ممکن است “پایین” باشد. اگر چنین است، در مورد این مشکل با ارائه دهنده هاست خود تماس بگیرید.
همچنین، می توانید سرویس SSH خود را با استفاده از دستور زیر راه اندازی مجدد کنید:
دستور sudo service ssh restart
همچنین می توانید از طریق PuTTY بررسی کنید که آیا سرویس به درستی کار می کند یا خیر. برای این کار از این دستورات استفاده کنید:
- برای کاربران Debian 7 و Ubuntu 14.04 – وضعیت ssh سرویس sudo
- برای کاربران CentOS 6 – وضعیت sshd سرویس sudo
- برای کاربران سیستم – وضعیت sudo systemctl sshd -l
اگر نمی توانید SSH Daemon را پیدا کنید، باید آن را برای شروع پذیرش اتصالات تنظیم کنید.
کاربران لینوکس می توانند به صورت دستی ابزار SSH مانند OpenSSH را نصب کنند و این دستور را وارد کنند:
sudo apt نصب openssh-server
۶. تنظیمات فایروال خود را بررسی کنید
تنظیمات فایروال خود را مدیریت کنید تا از مسدود کردن اتصالات SSH جلوگیری کنید. iptables خود را روی سرور فعال کنید و ببینید که آیا “رد کردن” یا “DROP” را در تنظیمات پورت SSH شما نشان می دهد. سپس آن را به «ACCEPT» تغییر دهید.
می توانید از این دستور در ترمینال خود برای ذخیره قوانین به روز شده استفاده کنید:
سرویس iptables ذخیره می کند
برای کاربران اوبونتو یا دبیان، پورت خود را روی تنظیمات فایروال با استفاده از این دستور اجازه دهید:
sudo ufw allow port /tcp
پس از آن، باید با وارد کردن این مورد در رابط خط فرمان خود، تنظیمات فایروال را بارگیری مجدد کنید:
sudo ufw بارگذاری مجدد
با تایپ این دستور بررسی کنید که آیا وضعیت به “ALLOW” تغییر کرده است:
حل مشکل ssh اتصال به سرور
وضعیت sudo ufw
رایجترین خطاهای SSH
اولین گام برای اتصال یک کلاینت SSH به یک سرور SSH ایجاد اتصال اولیه به شبکه است؛ اما گاهی اوقات ممکن است به دلیل بروز مشکلاتی، فرایند اتصال با خطا مواجه شود. برای رفع خطای اتصال SSH ابتدا بهتر است با رایجترین مشکلات SSH آشنا شویم و علت آنها را بررسی کنیم. از همین رو در این بخش به توضیح ۳ خطای مهم SSH هنگام اتصال به سرور میپردازیم:
۱. خطای Hostname Resolution
بیشتر خطاهای Resolution زمانی رخ میدهد که SSH قادر به پیدا کردن آدرس شبکه نباشد. هرچند بیشتر اوقات این خطا به DNS مربوط میشود، اما ممکن است علت ریشهای آن مشکلات DNS نباشد. در یک کلاینت OpenSSH فرمانی مانند ssh user@example.com ممکن است خطای زیر را برگرداند:
ssh: Could not resolve hostname example.com: Name or service not known
در نرمافزار PuTTY شما ممکن است خطایی با متن زیر مشاهده کنید:
Unable to open connection to example.com Host does not exist
PuTTY نرمافزاری برای سیستمعامل ویندوز است که بعد از خرید سرور مجازی میتوانید با استفاده از آن به سرور متصل شوید. برای عیبیابی (Troubleshoot) این خطا میتوانید مراحل زیر را طی کنید:
- ابتدا نام میزبان (Hostname) را بررسی کنید که بهدرستی نوشته شده باشد.
- بررسی کنید که میتوانید نام میزبان را با استفاده از دستور ping سیستم در دستگاه کلاینت حل کنید. استفاده از سایتهای دیگری مانند WhatsMyDns.net نیز به شما کمک میکند تا حافظه پنهان DNS خود را بررسی کنید.
نوشتن IP بهجای نام میزبان میتواند بهعنوان یک راهحل موقت در حل مشکلات DNS به شما کمک کند. بهعنوان مثال، بهجای ssh user@example.com از فرمان ssh user@203.0.113.0 استفاده کنید.
۲. ارور connection timed out در PuTTY
خطای connection timeout به این معنا است که کلاینت تلاش میکند تا به شبکه متصل شود، اما سرور در مدت زمان مشخصشده قادر به پاسخگویی نبوده است. دلیل دریافت نکردن پاسخ از سمت سرور در بازه زمانی مشخص ممکن است خاموش بودن سرور یا آدرس IP اشتباه باشد.
در یک کلاینت OpenSSH، فرمانی مانند ssh user@203.0.113.0 ممکن است باعث بروز خطای زیر شود:
ssh: connect to host 203.0.113.0 port 22: Connection refused
خطای وصل نشدن SSH در این شرایط در برنامه PuTTY به شکل زیر نمایش داده خواهد شد:
Network error: Connection refused
برای عیبیابی ارور connection timed out در PuTTY کارهای زیر را انجام دهید:
- صحت آدرس IP میزبان را بررسی کنید.
- بررسی کنید که شبکه شما از اتصال از طریق پورت SSH مورد استفاده پشتیبانی میکند. برخی از شبکههای عمومی ممکن است پورت ۲۲ یا پورتهای SSH سفارشی را مسدود کنند. برای مثال، شما میتوانید سایر هاستها را با استفاده از همان پورت با یک سرور SSH شناختهشده امتحان کنید. از این طریق متوجه خواهید شد که آیا مشکل مختص سرور ابری شماست یا خیر!
- از رعایت قوانین فایروال سرور ابری مطمئن شوید.
۳. ارور Connection Refused در Putty
وصل نشدن SSH به دلیل ارور connection refused به این معنا است که درخواست به هاست SSH داده شده، اما هاست درخواست را نمیپذیرد و رد میکند. ارور connection refused در PuTTY کاملا با ارور connection timeout تفاوت دارد؛ در ارور اول سرور درخواست ارتباط را رد میکند و در ارور دوم زمان پاسخگویی به درخواست کلاینت تمام میشود.
در یک کلاینت OpenSSH، فرمانی مانند ssh user@203.0.113.0 ممکن است باعث نمایش خطای زیر شود:
ssh: connect to host 203.0.113.0 port 22: Connection refused
در چنین شرایطی، در نرمافزار PuTTY نیز خطای زیر را مشاهده خواهید کرد:
Network error: Connection refused
دلایل ریشهای بروز ارور connection refused ممکن است با دلایل ارور connection timeout یکسان باشد؛ برای عیبیابی این خطای وصل نشدن ssh موارد زیر را میتوانید بررسی کنید:
- از درست بودن آدرس IP میزبان مطمئن شوید.
- بررسی کنید که آیا شبکه شما از اتصال از طریق پورت SSH مورد استفاده پشتیبانی میکند؛ زیرا برخی از شبکههای عمومی پورت ۲۲ یا پورتهای SSH سفارشی را مسدود میکنند. برای مثال، شما میتوانید سایر هاستها را با استفاده از همان پورت با یک سرور SSH شناختهشده امتحان کنید. از این طریق متوجه خواهید شد که آیا مشکل مختص سرور ابری شماست یا خیر!
- قوانین فایروال سرور ابری موردنظرتان را بررسی کنید.
- مطمئن شوید که سرویس در حال حاضر اجرا میشود و به پورت مورد انتظار متصل است.
بررسی راه حل مشکل SSH
حالا که با رایجترین خطاهای SSH و نحوه عیبیابی آنها آشنا شدید، وقت آن است که به بررسی راهحل مشکل SSH بپردازیم. بهطور کلی، در این بخش قرار است به بررسی ۳ راهکار بپردازیم که با کمک آن بتوانید مشکلات قطع شدن SSH را در سیستمعاملهای مختلف برطرف کنید:
۱. برای رفع خطای SSH، فایروال را بررسی کنید
برخی از مشکلات اتصال SSH ناشی از تنظیمات فایروال است. اگر فایروال شما بهگونهای تنظیم شده باشد که پورتها یا خدمات خاصی را مسدود کند، مانع از اتصال شما به سرور SSH خواهد شد. اگر یک قانون فایروال اضافه میکنید که اجازه اتصال با آدرس IP را به دستگاه محلی شما میدهد، بررسی کنید که آدرس IP اختصاصدادهشده توسط ISP شما تغییر نکرده باشد. در صورت تغییر، باید آن قانون فایروال را برای اجازه دادن به آدرس IP یا محدود آدرس جدید اصلاح کنید.
نحوه بررسی قوانین فایروال به این بستگی دارد که سرور مجازی شما از کدام فایروال استفاده میکند. همچنین باید بدانید که سرویس SSH شما از چه پورتی استفاده میکند. پورت پیشفرض معمولا ۲۲ است، اما محض اطمینان باز هم پورت سرویس SSH خود را بررسی کنید.
بررسی فایروال UFW
کاربرانی که با UFW کار میکنند، باید از ufw status برای بررسی فایروال خود استفاده کنند.
ufw status
خروجی مانند زیر پورتها را نمایش خواهد داد:
Status: active
To Action From
-- ------ ----
۲۲ LIMIT Anywhere
۴۴۳ ALLOW Anywhere
۸۰ ALLOW Anywhere
Anywhere ALLOW ۱۹۲.۱۶۸.۰.۰
۲۲ (v6) LIMIT Anywhere (v6)
۴۴۳ (v6) ALLOW Anywhere (v6)
۸۰ (v6) ALLOW Anywhere (v6)
حتما مطمئن شوید که پورت SSH شما در این فهرست وجود دارد.
بررسی FirewallD
اگر از کاربران FirewallD هستید، از دستور firewall-cmd برای فهرست کردن سرویسها استفاده کنید.
firewall-cmd --list-services
خروجی این دستور، فهرستی از سرویسها از جمله SSH (پورت پیشفرض ۲۲) خواهد بود که نشان میدهد فایروال از ترافیک SSH پشتیبانی میکند:
dhcpv6-client http ssh
اگر از پورت سفارشی برای SSH استفاده میکنید، بررسی را میتوانید با استفاده از –list-ports انجام دهید. اگر یک تعریف سرویس سفارشی ایجاد کردهاید، همچنان باید SSH را با –list-services ببینید.
بررسی iptables
برای سیستمهای لینوکسی که UFW یا FirewallD را اجرا نمیکنند، قوانین فایروال شما با استفاده از فرمان iptables با sudo یا بهعنوان کاربر اصلی (root) فهرست خواهد شد:
iptables -nL
خروجی زیر نشان میدهد که هیچ قانونی وجود ندارد که ترافیک SSH را مسدود کرده باشد:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
اگر قوانین یا خط مشی (Policy) پیشفرض REJECT یا DROP را مشاهده کردید، باید مطمئن شوید که زنجیره INPUT به پورتی که سرویس SSH شما روی آن اجرا میشود، اجازه میدهد. این پورت بهصورت پیشفرض ۲۲ است.
۲. وضعیت (Status) سرویس SSH را بررسی کنید
اگر امکان SSH به سرور ابری شما وجود ندارد، باید بررسی کنید که سرویس SSH در حال اجرا باشد. نحوه اجرای سرویس برای سیستمهای مختلف با یکدیگر متفاوت خواهد بود. نسخههای قدیمیتر سیستمعامل (اوبونتو ۱۴ و پایینتر، CentOS 6 و Debian 6) ممکن است از فرمان service پشتیبانیشده توسط Upstart استفاده کنند. توزیعهای جدیدتر با systemd از فرمان systemctl استفاده میکنند. توزیعهای Red Hat-based مانند CentOS و فدورا این سرویس را sshd مینامند؛ درحالیکه این سرویس در دبیان و اوبونتو ssh نام دارد.
استفاده از سرویس
برای سیستمهایی که از فرمان service استفاده میکنند، وضعیت فرایند SSH را با دستور زیر (اجرا بهعنوان ریشه یا با sudo) بررسی کنید:
service ssh status
خروجی مانند زیر به شما نمایش داده خواهد شد که شامل PID (شناسه فرایند) است و نشان میدهد که فرایند طبق انتظار در حال اجرا است:
ssh start/running, process 1262
اگر فرایند در حال اجرا نباشد، خروجی زیر به شما نشان میدهد که متوقف شده است:
ssh stop/waiting
در این مورد با استفاده از service ssh start میتونید آن را ریاستارت کنید.
استفاده از systemctl
بهطور مشابه، در سروری که از systemd استفاده میشود (مانند CentOS 7) باید از دستور systemctl برای بررسی وضعیت استفاده کرد:
systemctl status sshd
یک سرویس در حال اجرا خروجی را مانند زیر با active (running) در خط Active: نشان میدهد.
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since Mon 2017-03-20 11:00:22 EDT; 1 months 1 days ago
Process: 899 ExecStartPre=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
Main PID: 906 (sshd)
CGroup: /system.slice/sshd.service
├ ۹۰۶ /usr/sbin/sshd -D
├۲۶۹۴۱ sshd: [accepted]
└۲۶۹۴۲ sshd: [net]
اگر سرویس در حال اجرا نیست، خط Active عبارت inactive را با ورودیهای آخرین journal برای سرویس نشان میدهد:
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: inactive (dead) since Fri 2017-04-21 08:36:13 EDT; 2s ago
Process: 906 ExecStart=/usr/sbin/sshd -D $OPTIONS (code=exited, status=0/SUCCESS)
Process: 899 ExecStartPre=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
Main PID: 906 (code=exited, status=0/SUCCESS)
در این مورد با استفاده از systemctl start sshd میتوانید سرویس را ریاستارت کنید.
۳. پورت سرویس SSH را بررسی کنید
دو روش کلی برای بررسی اینکه سرویس SSH روی کدام پورت اجرا میشود، وجود دارد. در روش اول باید فایل پیکربندی SSH و در روش دوم فرایند در حال اجرا را بررسی کنید. در بیشتر سیستمها، /etc/ssh/sshd_config فایل پیکربندی SSH است. پورت پیشفرض نیز ۲۲ است؛ اما میتواند توسط هر خط پیکربندی در این فایل که یک دستورالعمل پورت را با عدد مشخص میکند، لغو شود. شما میتوانید با استفاده از grep برای جستوجوی خطوط استفاده کنید:
grep Port /etc/ssh/sshd_config
خروجی زیر با شماره پورت به شما نمایش داده خواهد شد:
Port 22
درصورتیکه میدانید سرویس در حال اجرا است، شما میتوانید تایید کنید که سرویس فقط با پورت مورد انتظار با استفاده از ss (اجرا با sudo یا بهعنوان کاربر اصلی) اجرا میشود. خروجی مشابهی برای دستور netstat -plnt ارائه شده، اما ss دستور ترجیحی برای جستوجوی اطلاعات سوکت از هسته (kernel) است.
ss -plnt