Tarkibga o'tish

Lab: "xizmatga ulanib bo'lmayapti" muammosini diagnostika qilish

Tarmoq diagnostikasi maqolasi ping, traceroute, ss va tcpdump ni alohida-alohida tanishtirdi. Bu lab to'rttasini ham birga, tajribali administrator ularga aslida murojaat qiladigan tartibda ishlatib, mavjud bo'lgan eng keng tarqalgan on-call chaqiruvini diagnostika qiladi: "xizmatga ulana olmayapman". Mashq bitta belgining ortiga ataylab uchta turli sabab qo'yadi: noto'g'ri tinglash manzili (1-holat), bloklangan firewall porti (2-holat) va noto'g'ri hostga resolve bo'ladigan nom (3-holat). Chunki tashqaridan uchalasi ham bir xil ko'rinadi va ularni to'g'ri farqlash — aynan tekshirilayotgan ko'nikma. To'rtinchi ehtimoliy sabab — jarayon umuman ishlamayotgani — har bir holatda ketma-ketlik boshidagi ps/ss tekshiruvi bilan birinchi bo'lib chiqarib tashlanadi. Bu tasdiqlash eng arzon bo'lgan narsa va uni o'tkazib yuborish eng uyatli narsa.

Maqsad va yakuniy natija

Bu lab oxirida siz bir xil xizmat uchun "connection refused" yoki "connection timed out" ning ataylab kiritilgan uchta alohida sababini diagnostika qilgan bo'lasiz. Buning uchun eng dramatik tuyuladigan gumondor bo'lgani uchun avval firewall’ni taxmin qilish o'rniga, jarayondan boshlanib tarmoq tomon tashqariga qarab boradigan izchil, qatlamli diagnostika ketma-ketligidan foydalanasiz.

Topologiya va boshlang'ich holat

Bitta lab VM yetarli. Ikkinchi mashina (yoki xuddi shu hostdagi alohida tarmoq nuqtasi sifatida qaraladigan container) "tashqaridan" sinovlarni realroq qiladi, lekin shart emas.

Talablar

  • oddiy test xizmati sifatida nc (netcat) yoki python3 -m http.server;
  • ss, ping, curl va ufw (yoki iptables) — hammasi standart holatda mavjud yoki apt orqali o'rnatiladi.

Xavfsizlik va snapshot haqida eslatma

Bu lab lab mashinasida firewall portini ochadi va yopadi. Biror narsani o'zgartirishdan oldin joriy firewall holatini tasdiqlang va oxirida uni aynan tiklang. Labda xato tufayli ochiq qolib ketgan port, agar o'sha VM keyinchalik qayta ishlatilsa yoki tashqariga ochilsa, kichik bo'lsa ham, haqiqiy xavfsizlik zaifligi.

sudo ufw status verbose

0-qadam: oddiy test xizmatini ishga tushirish

python3 -m http.server 8080 --bind 127.0.0.1 &

Bu ataylab faqat 127.0.0.1 ga bog'lanadi — bu lab diagnostika qiladigan birinchi nosozlik.

1-holat: xizmat noto'g'ri manzilga bog'langan

Boshqa mashinadan (yoki localhost emas, VM’ning haqiqiy IP’sini ishlatgan curl dan) ko'rinadigan belgi:

curl -v http://<vm-ip>:8080
curl: (7) Failed to connect to <vm-ip> port 8080: Connection refused

Diagnostika — 1-qadam: jarayon umuman ishlayaptimi?

ps aux | grep "http.server"
farruxbek   5210  ...  python3 -m http.server 8080 --bind 127.0.0.1

Jarayon ishlayapti — bu "xizmat ishdan chiqqan" variantini chiqarib tashlaydi va gipotezani toraytiradi.

Diagnostika — 2-qadam: u aslida nimani tinglayapti?

ss -tulpn | grep 8080
tcp   LISTEN  0   5   127.0.0.1:8080   0.0.0.0:*   users:(("python3",pid=5210,fd=3))

127.0.0.1:8080 — mahalliy manzil ustuni — javob: bu jarayon firewall holatidan qat’i nazar, faqat mashinaning o'zidan kelgan ulanishlarni qabul qiladi, tarmoqdan kelganlarni hech qachon qabul qilmaydi. Tarmoq diagnostikasi maqolasi aynan shu tekshiruvni eng ko'p o'tkazib yuboriladigan qadam sifatida belgilaydi: administratorlar bog'lanish manzili to'liq izohlaydigan belgi uchun ko'pincha to'g'ridan-to'g'ri firewall qoidalariga o'tib ketadi.

Tuzatish va tekshirish:

kill %1
python3 -m http.server 8080 --bind 0.0.0.0 &
ss -tulpn | grep 8080
tcp   LISTEN  0   5   0.0.0.0:8080   0.0.0.0:*   users:(("python3",pid=5344,fd=3))
curl -v http://<vm-ip>:8080
< HTTP/1.0 200 OK

2-holat: firewall qoidasi portni bloklaydi

sudo ufw deny 8080/tcp

Belgi:

curl -v --max-time 5 http://<vm-ip>:8080
curl: (28) Connection timed out after 5001 milliseconds

Diagnostika. E’tibor bering, xato matnining o'zi birinchi ishora: "Connection refused" va "Connection timed out" — sabablari turlicha bo'lgan turli nosozliklar. Ikkalasiga ham "tarmoq buzilgan" deb qarash o'rniga ularni darhol ajratishga arziydi:

  • Connection refused — mashina o'sha portda hech narsa tinglamayotgani haqida faol javob berdi (hech qanday jarayon bog'lanmagan yoki firewall qoidasi paketni tashlab yuborish o'rniga aniq rad etyapti).
  • Connection timed out — kutish davri ichida umuman javob kelmadi. Odatda buning sababi firewall paketni jimgina tashlab yuborgani yoki route haqiqatan mavjud emasligi.
ss -tulpn | grep 8080
tcp   LISTEN  0   5   0.0.0.0:8080   0.0.0.0:*   users:(("python3",pid=5344,fd=3))

Jarayon to'g'ri manzilda tinglayotgani tasdiqlandi — bu 1-holatdagi sababni chiqarib tashlaydi va tekshiruvni tarmoq yo'lining o'ziga yo'naltiradi.

sudo ufw status verbose
Status: active
To                         Action      From
--                         ------      ----
8080/tcp                   DENY        Anywhere

Tuzatish va tekshirish:

sudo ufw delete deny 8080/tcp
sudo ufw allow 8080/tcp
curl -v --max-time 5 http://<vm-ip>:8080
< HTTP/1.0 200 OK

3-holat: DNS noto'g'ri manzilga resolve qiladi

echo "127.0.0.1 test-service.lab" | sudo tee -a /etc/hosts

Belgi:

curl -v --max-time 5 http://test-service.lab:8080
curl: (7) Failed to connect to 127.0.0.1 port 8080: Connection refused

Diagnostika. Oldingi tuzatishlar bu holatdan oldin ishlaydigan holatga qaytarilgani uchun bu yerdagi nosozlik faqat nomni resolve qilish bilan bog'liq. Xizmatning o'zi yana aybdor deb taxmin qilishdan oldin resolve qilishni tekshirib, xuddi shu qatlamli yondashuv bilan tasdiqlang:

getent hosts test-service.lab
127.0.0.1       test-service.lab

Hostname VM’ning haqiqiy interfeys manziliga emas, 127.0.0.1 ga resolve bo'ladi. DNS vositalari maqolasi /etc/hosts yozuvlari standart holatda nega DNS’dan ustun turishini va boshqa hech bir hostda takrorlanmaydigan, aynan shu turdagi chalkash, mashinaga xos nosozliklarning tez-tez uchraydigan, osongina unutiladigan manbai ekanini ko'rib chiqadi.

Tuzatish va tekshirish:

sudo sed -i '/test-service.lab/d' /etc/hosts
getent hosts test-service.lab

Keng tarqalgan xatolar

  • Jarayon umuman ishlayotganini tekshirishdan oldin firewall’ni tekshirish. Bu labdagi uchta holat ko'rsatganidek, firewall bir xil belgining kamida uchta ehtimoliy sababidan faqat bittasi. Uni tartibni buzib birinchi tekshirish u haqiqiy sabab bo'lmagan uchdan ikki holatda vaqtni behuda sarflaydi.
  • "Connection refused" va "connection timed out" ni bir xil muammo deb hisoblash. Yuqorida tushuntirilganidek, ular stekning turli qatlamlariga va butunlay boshqa-boshqa tuzatishlarga ishora qiladi.
  • Mashinaning haqiqiy manzili o'rniga curl localhost bilan sinash. 127.0.0.1 ga bog'langan xizmat bu tarzda sinalganda yolg'ondan ishlayotgandek ko'rinadi va aynan 1-holatdagi xatoni dastlabki sinov paytida ushlanishidan yashiradi.

Orqaga qaytarish va tozalash

kill %1 2>/dev/null
sudo ufw delete allow 8080/tcp
sudo sed -i '/test-service.lab/d' /etc/hosts
sudo ufw status verbose

Yakuniy ufw status verbose chiqishi 0-qadamdan oldin yozib qo'ygan holatingizga mos kelishini tasdiqlang.

Yakuniy baholash mezoni

Uchta holatning har biri uchun siz — bu labni qayta o'qimasdan — asl sababni aniqlagan aniq buyruqni ayta olsangiz va klient nuqtai nazaridan belgi uchala holatda ham nega bir xil ko'ringanini tushuntira olsangiz, bu lab yakunlangan hisoblanadi.

Mashqlar

  1. 2-holatni qayta yarating, lekin bu safar ufw deny o'rniga ufw reject dan foydalaning va klient tomonidagi xato xabari hamda javob vaqtini deny holati bilan taqqoslang. deny (jimgina tashlab yuborish) va reject (faol rad etish) o'rtasidagi farqni klient nimani kuzatishi nuqtai nazaridan tushuntiring.
  2. tcpdump yordamida 2-holatni qayta yaratayotganda 8080-portdagi trafikni yozib oling va yozuvda SYN paket qachondir tasdiqlanganmi (acknowledged), jimgina tashlab yuborilganmi yoki reset bilan javob berilganmi, aniqlang.
  3. Yuqorida ko'rib chiqilmagan, xuddi shu "xizmatga ulanib bo'lmayapti" belgisi ortidagi to'rtinchi sababni (masalan, klient so'rovidagi noto'g'ri port raqami yoki butunlay yo'q route) o'ylab toping va diagnostika qiling. Xuddi shu qatlamli diagnostika tartibini qo'llang: jarayon, tinglash manzili, firewall, keyin nomni resolve qilish.

Manbalar