مشکل وصل نشدن SSH یک چالش همیشگی برای کاربران ترمینال لینوکس است. مواجهه با ارور SSH هنگام اتصال به سرور مجازی لینوکس ممکن است برای همه افراد اتفاق بیفتد. چنانچه شما نیز قادر به اتصال به سرور ابری نیستید و با خطای SSH مواجه میشوید، این مقاله برایتان کاربردی خواهد بود. در مطلب پیش رو به بررسی رایجترین مشکلات SSH میپردازیم و راهکارهای برطرف کردن آنها را به شما آموزش میدهیم، همچنین میتوانید آموزش تغییر پورت ssh نیز در ابر دراک بخوانید.
رایجترین خطاهای SSH
اولین گام برای اتصال یک کلاینت SSH به یک سرور SSH ایجاد اتصال اولیه به شبکه است؛ اما گاهی اوقات ممکن است به دلیل بروز مشکلاتی، فرایند اتصال با خطا مواجه شود. برای رفع خطای اتصال SSH ابتدا بهتر است با رایجترین مشکلات SSH آشنا شویم و علت آنها را بررسی کنیم. از همین رو در این بخش به توضیح ۳ خطای مهم SSH هنگام اتصال به سرور میپردازیم:
1. خطای 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 استفاده کنید.
2. ارور 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 مورد استفاده پشتیبانی میکند. برخی از شبکههای عمومی ممکن است پورت 22 یا پورتهای SSH سفارشی را مسدود کنند. برای مثال، شما میتوانید سایر هاستها را با استفاده از همان پورت با یک سرور SSH شناختهشده امتحان کنید. از این طریق متوجه خواهید شد که آیا مشکل مختص سرور ابری شماست یا خیر!
- از رعایت قوانین فایروال سرور ابری مطمئن شوید.
3. ارور 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 مورد استفاده پشتیبانی میکند؛ زیرا برخی از شبکههای عمومی پورت 22 یا پورتهای SSH سفارشی را مسدود میکنند. برای مثال، شما میتوانید سایر هاستها را با استفاده از همان پورت با یک سرور SSH شناختهشده امتحان کنید. از این طریق متوجه خواهید شد که آیا مشکل مختص سرور ابری شماست یا خیر!
- قوانین فایروال سرور ابری موردنظرتان را بررسی کنید.
- مطمئن شوید که سرویس در حال حاضر اجرا میشود و به پورت مورد انتظار متصل است.
دربارهی سرور ابری بیشتر بخوانید
بررسی راه حل مشکل SSH
حالا که با رایجترین خطاهای SSH و نحوه عیبیابی آنها آشنا شدید، وقت آن است که به بررسی راهحل مشکل SSH بپردازیم. بهطور کلی، در این بخش قرار است به بررسی ۳ راهکار بپردازیم که با کمک آن بتوانید مشکلات قطع شدن SSH را در سیستمعاملهای مختلف برطرف کنید:
1. برای رفع خطای SSH، فایروال را بررسی کنید
برخی از مشکلات اتصال SSH ناشی از تنظیمات فایروال است. اگر فایروال شما بهگونهای تنظیم شده باشد که پورتها یا خدمات خاصی را مسدود کند، مانع از اتصال شما به سرور SSH خواهد شد. اگر یک قانون فایروال اضافه میکنید که اجازه اتصال با آدرس IP را به دستگاه محلی شما میدهد، بررسی کنید که آدرس IP اختصاصدادهشده توسط ISP شما تغییر نکرده باشد. در صورت تغییر، باید آن قانون فایروال را برای اجازه دادن به آدرس IP یا محدود آدرس جدید اصلاح کنید.
نحوه بررسی قوانین فایروال به این بستگی دارد که سرور مجازی شما از کدام فایروال استفاده میکند. همچنین باید بدانید که سرویس SSH شما از چه پورتی استفاده میکند. پورت پیشفرض معمولا 22 است، اما محض اطمینان باز هم پورت سرویس SSH خود را بررسی کنید.
بررسی فایروال UFW
کاربرانی که با UFW کار میکنند، باید از ufw status برای بررسی فایروال خود استفاده کنند.
ufw status
خروجی مانند زیر پورتها را نمایش خواهد داد:
Status: active
To Action From
-- ------ ----
22 LIMIT Anywhere
443 ALLOW Anywhere
80 ALLOW Anywhere
Anywhere ALLOW 192.168.0.0
22 (v6) LIMIT Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
حتما مطمئن شوید که پورت SSH شما در این فهرست وجود دارد.
بررسی FirewallD
اگر از کاربران FirewallD هستید، از دستور firewall-cmd برای فهرست کردن سرویسها استفاده کنید.
firewall-cmd --list-services
خروجی این دستور، فهرستی از سرویسها از جمله SSH (پورت پیشفرض 22) خواهد بود که نشان میدهد فایروال از ترافیک 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 شما روی آن اجرا میشود، اجازه میدهد. این پورت بهصورت پیشفرض 22 است.
2. وضعیت (Status) سرویس SSH را بررسی کنید
اگر امکان SSH به سرور ابری شما وجود ندارد، باید بررسی کنید که سرویس SSH در حال اجرا باشد. نحوه اجرای سرویس برای سیستمهای مختلف با یکدیگر متفاوت خواهد بود. نسخههای قدیمیتر سیستمعامل (اوبونتو 14 و پایینتر، 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
├ 906 /usr/sbin/sshd -D
├26941 sshd: [accepted]
└26942 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 میتوانید سرویس را ریاستارت کنید.
3. پورت سرویس SSH را بررسی کنید
دو روش کلی برای بررسی اینکه سرویس SSH روی کدام پورت اجرا میشود، وجود دارد. در روش اول باید فایل پیکربندی SSH و در روش دوم فرایند در حال اجرا را بررسی کنید. در بیشتر سیستمها، /etc/ssh/sshd_config فایل پیکربندی SSH است. پورت پیشفرض نیز 22 است؛ اما میتواند توسط هر خط پیکربندی در این فایل که یک دستورالعمل پورت را با عدد مشخص میکند، لغو شود. شما میتوانید با استفاده از grep برای جستوجوی خطوط استفاده کنید:
grep Port /etc/ssh/sshd_config
خروجی زیر با شماره پورت به شما نمایش داده خواهد شد:
Port 22
درصورتیکه میدانید سرویس در حال اجرا است، شما میتوانید تایید کنید که سرویس فقط با پورت مورد انتظار با استفاده از ss (اجرا با sudo یا بهعنوان کاربر اصلی) اجرا میشود. خروجی مشابهی برای دستور netstat -plnt ارائه شده، اما ss دستور ترجیحی برای جستوجوی اطلاعات سوکت از هسته (kernel) است.
ss -plnt
برای حل مشکل SSH در ارتباط با سرور از تیم پشتیبانی کمک بگیرید
در این مقاله به بررسی 3 مشکل اساسی SSH هنگام ارتباط با سرور اشاره کردیم و راهکارهای حل آن را نیز توضیح دادیم. چنانچه با انجام این راهحلها مشکلتان برطرف نشد، توصیه میکنیم از تیم پشتیبانی کمک بگیرید. ابر دراک کلیه سرویسهای خود را با پشتیبانی تخصصی عرضه میکند که شما میتوانید از طریق تماس تلفنی یا تیکت با کارشناسان ما در ارتباط باشید.
منبع: دیجیتال اوشن