SSH asoslari
Tarmoq diagnostikasi maqolasida server mavjudligini qanday tasdiqlash ko'rib chiqildi, lekin serverga yetib borish uni boshqarish degani emas. Masofaviy mashinada buyruq ishga tushirish, fayl o'qish yoki xizmatni qayta ishga tushirish uchun tarmoq orqali haqiqiy login sessiyasi kerak — production’da esa administrator deyarli hech qachon fizik mashina oldiga o'tirmaydi. Hammasi masofadan, tarmoq orqali, SSH (Secure Shell) va uning eng keng tarqalgan implementatsiyasi — OpenSSH yordamida bajariladi. Bu maqola SSH aslida nima qilishini, ssh klientidan qanday foydalanishni va birinchi ulanishda u chiqaradigan xabarlarni qanday o'qishni ko'rib chiqadi.
SSH qaysi muammoni hal qiladi
SSH standartga aylanishidan oldin xuddi shu vazifani Telnet bajarardi: u login, parol va butun sessiyani tarmoq orqali ochiq matnda yuborardi. O'sha tarmoq segmentida trafikni ushlagan har qanday odam — masalan, tcpdump bilan — parolni to'g'ridan-to'g'ri tarmoqdan o'qiy olardi. 1995-yilda paydo bo'lgan SSH aynan shu teshikni yopish uchun mavjud: ulanish o'rnatilishi bilan trafik shifrlanadi, shuning uchun tarmoqda na parol, na undan keyingi biror buyruq ko'rinmaydi.
Bugun SSH faqat interaktiv login uchun emas, bundan ko'proq narsa uchun asosiy qatlam:
- xavfsiz fayl uzatish (
scp,sftp,rsync— scp va rsync maqolasida ko'rib chiqiladi); - masofaviy serverda avtomatlashtirilgan skriptlarni ishga tushirish, masalan, CI/CD pipeline’dagi deploy qadami;
- port forwarding orqali ichki xizmatlarga yetib borish (SSH tunneling);
- Git repozitoriylariga xavfsiz kirish —
[email protected]:...URL’i aslida SSH ulanishi.
Amalda "Linux serverni boshqarish" deyarli har doim o'sha serverga SSH terminal sessiyasini anglatadi.
Klient va server
SSH klient-server modeliga amal qiladi:
- SSH server — masofaviy mashinada ishlaydigan xizmat, odatda
sshd(OpenSSH server daemon’i). U kiruvchi ulanishlarni tinglaydi va foydalanuvchi autentifikatsiyadan o'tgach, unga shell beradi yoki buyruq ishga tushirishga ruxsat beradi; - SSH klient — ulanishni boshlaydigan tomon, odatda
sshbuyrug'i (OpenSSH klienti) yoki Windows’dagi PuTTY kabi grafik vosita.
Ko'p zamonaviy distributivlarda ikkala tomonni ham OpenSSH loyihasi taqdim etadi — bu protokolning eng keng tarqalgan open-source implementatsiyasi. Ubuntu/Debian’da klient odatda oldindan o'rnatilgan bo'ladi, server esa alohida paket:
Xizmat holatini tekshirish:
Note
Ubuntu/Debian’da xizmat odatda ssh deb ataladi; RHEL oilasidagi distributivlarda esa sshd. Aniq nomga ishonchingiz komil bo'lmasa, systemctl list-units '*ssh*' bilan tekshiring.
SSH sukut bo'yicha TCP 22-portni tinglaydi — bu kursda avvalroq ko'rilgan portlar va socket’lar tushunchalarining to'g'ridan-to'g'ri davomi. Server tinglayotganini tasdiqlash:
0.0.0.0:22 xizmat har bir tarmoq interfeysida ulanishlarni qabul qilishini bildiradi.
Shifrlash haqida qisqacha
SSH ulanishi ikkita mustaqil himoyani ustma-ust qo'yadi:
- transport qatlami — klient va server handshake deb ataladigan jarayonda asimmetrik kriptografiya yordamida umumiy sessiya kalitini kelishib oladi; shundan keyin barcha trafik shu kalit bo'yicha simmetrik shifrlash bilan himoyalanadi;
- autentifikatsiya qatlami — foydalanuvchi o'z shaxsini parol yoki — tavsiya etilgan usul — SSH kalit juftligi bilan isbotlaydi; bu SSH kalit autentifikatsiyasi maqolasida chuqur ko'rib chiqiladi.
Bu maqola shifrlash algoritmlarining matematikasiga kirmaydi. Administrator uchun muhimi — SSH sessiyasi boshidan oxirigacha shifrlangani va oradagi tarmoq uskunalari uning mazmunini o'qiy olmasligi.
ssh bilan ulanish
Eng oddiy shakl:
Masalan:
Agar lokal mashinadagi foydalanuvchi nomi masofaviy serverdagisi bilan bir xil bo'lsa, user@ qismini tushirib qoldirish mumkin:
Bunday holatda SSH avtomatik ravishda joriy lokal foydalanuvchi nomidan foydalanadi.
Birinchi ulanish: host key so'rovi
Muayyan serverga birinchi marta ulanganingizda shunga o'xshash xabar chiqadi:
The authenticity of host '192.168.1.50 (192.168.1.50)' can't be established.
ED25519 key fingerprint is SHA256:k3f9...Qz8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Bu server o'zining host key'ini — uni identifikatsiya qiladigan kriptografik kalitni taqdim etayotgani. Klient bu kalitni ilgari hech qachon ko'rmagani uchun bu haqiqiy server ekanini qayerdan bilishi kerakligini so'raydi. yes deb javob berish kalitni ~/.ssh/known_hosts ga saqlaydi va u keyingi har bir ulanishda avtomatik solishtiriladi. Bu mexanizm man-in-the-middle hujumlariga qarshi birinchi himoya qatlami bo'lib, SSH-agent va host tekshiruvi maqolasida batafsil ko'rib chiqiladi.
Shundan keyin parol so'rovi chiqadi (kalit autentifikatsiyasi hali sozlanmagan deb faraz qilsak):
[email protected]'s password:
To'g'ri parol kiritilgach, masofaviy serverning shell prompt’i paydo bo'ladi — shu paytdan boshlab har bir buyruq lokal mashinada emas, o'sha serverda ishlaydi. Sessiyani yopish uchun:
yoki Ctrl+D.
Foydali flag'lar
| Flag | Vazifasi |
|---|---|
-p <port> |
Sukut bo'yicha 22 dan boshqa portga ulanish |
-l <user> |
Foydalanuvchi nomini user@host shaklidan alohida ko'rsatish |
-v |
Batafsil rejim — ulanish jarayonining har bir bosqichini chiqaradi (diagnostika uchun foydali) |
-i <file> |
Sukut bo'yicha kalit o'rniga muayyan private key faylidan foydalanish |
Masalan, 2222-portda ishlayotgan serverga ulanish:
ssh -p 2222 [email protected]
Ulanish muvaffaqiyatsiz bo'lganda birinchi diagnostika qadami deyarli har doim -v (batafsilroq uchun -vvv) bo'ladi:
ssh -v [email protected]
Bu muammo aynan qaysi bosqichda — xom TCP ulanishida, host key tekshiruvida yoki autentifikatsiyada — yuz berayotganini ko'rsatadi.
Interaktiv shell’siz bitta buyruqni ishga tushirish
ssh to'liq interaktiv sessiya ochishi shart emas. Buyruqni oxirgi argument sifatida berish serverda faqat shu bitta buyruqni ishga tushiradi va darhol qaytib, uning chiqishini lokal ekranga chiqaradi:
ssh [email protected] "uptime"
Deploy qadamlari, health-check va monitoring skriptlari ortida aynan shu shakl turadi — bu maqola boshidagi "masofaviy serverda avtomatlashtirilgan skriptlarni ishga tushirish" holati. Buyruqni lokal shell avval talqin qilib yubormasligi uchun uni qo'shtirnoqqa oling: qo'shtirnoqsiz ssh host echo $HOSTNAME $HOSTNAME ni masofaviy emas, lokal mashinada ochadi — bu klassik chalkashlik manbai. Bu moduldagi keyingi maqolalar shu shaklga doim tayanadi (ssh prod-web "uptime", ssh alice@server "sudo -l").
Amaliy vaziyat: "Connection refused" ni aniqlash
Muammo: yangi deploy qilingan serverga ssh [email protected] bilan ulanishga urinish quyidagini beradi:
1-qadam — xato turini aniqlash: Connection refused paket TCP darajasida hostga yetib borganini, lekin 22-portni hech narsa tinglamayotganini bildiradi. Bu Connection timed out (tarmoq yoki firewall to'sig'i) yoki Could not resolve hostname (DNS muammosi) dan farq qiladi — har biri boshqa sababga ishora qiladi.
2-qadam — serverning o'zida xizmat holatini tekshirish (agar boshqa kirish yo'li bo'lsa):
Agar xizmat inactive yoki failed ni ko'rsatsa, sabab shu.
3-qadam — xizmatni ishga tushirish va qayta tekshirish:
4-qadam — klientdan qayta ulanish:
ssh -v [email protected]
5-qadam — natija: agar -v chiqishi endi ulanish o'rnatilayotganini va undan keyin autentifikatsiya so'rovini ko'rsatsa, muammo hal bo'lgan. Agar baribir refused bo'lsa, keyingi ehtimoliy sabab — firewall (sudo ufw status) yoki noto'g'ri port.
6-qadam — hujjatlashtirish: xizmat nega ishlamaganini (masalan, paket o'rnatilgandan keyin avtomatik ishga tushadigan qilib yoqilmagan) qayd qiling va keyingi qayta yuklashdan omon qolishi uchun enable qo'llanganini tasdiqlang.
Intervyuda
Tayyor turishga arziydigan savol: "klient Connection refused ni ko'rsatyapti — bu sizga Connection timed out aytmaydigan nimani aytadi?" refused paket hostga yetib borganini va o'sha portga hech narsa bog'lanmagani uchun TCP stack uni faol rad etganini tasdiqlaydi — tarmoq yo'lining o'zi joyida. Jim timed out esa hech qachon javob qaytmaganini bildiradi va bu trafikni tashlab yuborayotgan firewall’ga, routing muammosiga yoki yetib bo'lmaydigan hostga ishora qiladi. Bu farqni taxmin qilmasdan darhol ayta olish tizimli diagnostikani sinov-xato usulidan ajratib turadi.
Keng tarqalgan xatolar
Har qanday ulanish xatosini "server ishlamayapti" deb hisoblash
Connection refused, Connection timed out va Could not resolve hostname hammasi "ulanmadi" degandek tuyuladi, lekin ularning sabablari butunlay boshqa: mos ravishda ishlamayotgan xizmat, tarmoq/firewall to'sig'i va nomni resolve qilishdagi nosozlik. Har doim aniq xato matnini o'qing.
Host key ogohlantirishlarini odat bo'yicha avtomatik qabul qilish
Agar har bir yangi host key so'roviga yes deb yozish o'ylamasdan bajariladigan refleksga aylansa, xuddi shu refleks haqiqiy man-in-the-middle hujumi paytida ham ishlab ketadi. Agar fingerprint qayerdan kelishi kerakligini bilmasangiz, uni o'sha serverni boshqaradigan odam bilan alohida kanal orqali tasdiqlang.
Parol autentifikatsiyasiga cheksiz tayanish
Parol bilan kirish ishlaydi, lekin production serverlar uchun tavsiya etilmaydi — u brute-force urinishlariga ochiq va har bir ulanishda parol yozishni talab qiladi. Keyingi maqolada ko'riladigan kalitga asoslangan autentifikatsiya ham xavfsizroq, ham qulayroq.
Mashqlar
- Laboratoriya VM’ingizga
ssh -v user@server_ipbilan ulaning va batafsil chiqishdagi asosiy bosqichlarni (TCP ulanish, host key tekshiruvi, autentifikatsiya) aniqlang. sudo ss -tlnp | grep :22chiqishidan 22-portni qaysi jarayon (nomi va PID i) tinglayotganini toping.- SSH xizmatini ataylab to'xtating (
sudo systemctl stop ssh), boshqa terminaldan ulanishga urining, aniq xatoni kuzating, so'ng xizmatni tiklang. ~/.ssh/known_hostsni oching va undagi bitta qatorning tuzilishini (host, kalit turi, kalitning o'zi) tushuntiring.
Mashqni bajardim deyish uchun: 3-mashqda xizmat to'xtatilgan paytdagi ulanish urinishi timeout yoki DNS xatosini emas, Connection refused ni ko'rsatishi kerak — agar boshqa narsa ko'rsatsa, aslida qaysi xizmatni to'xtatganingizni qayta tekshiring.