17-bo‘lim
Tarmoq nosozliklarini aniqlash
Pastdan yuqoriga tashxis tartibi, "rad etildi" va "javob yo'q" farqi, ping, traceroute, dig, ss va curl ni qachon ishlatish.
Ushbu bo‘lim mundarijasi
"Sayt ochilmayapti" - bu tashxis emas, bu alomat. Sabab oltita qatlamning istalganida bo'lishi mumkin.
Bu bo'limda tartibli qidirishni o'rganamiz.
Asosiy qoida: pastdan yuqoriga #
Zinapoyani kodda ham qurish mumkin:
import socket
import threading
PORT = 9952
SAHIFA = b"<h1>ishlayapti</h1>"
tinglovchi = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tinglovchi.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tinglovchi.bind(("127.0.0.1", PORT))
tinglovchi.listen(2)
def server(nechta):
for _ in range(nechta):
u, _ = tinglovchi.accept()
u.recv(1024)
u.sendall(b"HTTP/1.1 200 OK\r\nContent-Length: "
+ str(len(SAHIFA)).encode() + b"\r\n\r\n" + SAHIFA)
u.close()
threading.Thread(target=server, args=(1,), daemon=True).start()
def tashxis(xost, port, yol="/"):
"""Har qatlamni pastdan yuqoriga tekshiradi."""
natija = []
# 1-qadam: nom manzilga aylanadimi?
try:
manzil = socket.gethostbyname(xost)
natija.append(("DNS", "ok", manzil))
except socket.gaierror:
natija.append(("DNS", "XATO", "nom hal qilinmadi"))
return natija
# 2-qadam: TCP ulanish o'rnatiladimi?
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(3)
try:
s.connect((manzil, port))
natija.append(("TCP", "ok", f"{manzil}:{port}"))
except ConnectionRefusedError:
natija.append(("TCP", "XATO", "rad etildi - xizmat ishlamayapti"))
return natija
except socket.timeout:
natija.append(("TCP", "XATO", "javob yo'q - firewall?"))
return natija
# 3-qadam: HTTP javob beradimi?
try:
s.sendall(f"GET {yol} HTTP/1.1\r\nHost: {xost}\r\n"
f"Connection: close\r\n\r\n".encode())
javob = s.recv(4096)
holat = javob.split(b"\r\n")[0].decode()
natija.append(("HTTP", "ok", holat))
except OSError as x:
natija.append(("HTTP", "XATO", str(x)))
finally:
s.close()
return natija
for nom, port in [("localhost", PORT), ("localhost", 9953)]:
print(f"--- tashxis: {nom}:{port}")
for qatlam, holat, izoh in tashxis(nom, port):
belgi = "+" if holat == "ok" else "!"
print(f" {belgi} {qatlam:<5} {holat:<5} {izoh}")
print()
tinglovchi.close()
--- tashxis: localhost:9952
+ DNS ok 127.0.0.1
+ TCP ok 127.0.0.1:9952
+ HTTP ok HTTP/1.1 200 OK
--- tashxis: localhost:9953
+ DNS ok 127.0.0.1
! TCP XATO rad etildi - xizmat ishlamayapti
Ikkinchi holatda DNS ishladi, TCP esa ishlamadi. Demak muammo aniq joyda: xizmat ishga tushmagan. HTTP ni tekshirishning ma'nosi yo'q.
"Rad etildi" va "javob yo'q" - butunlay boshqa muammolar #
Bu farq eng ko'p vaqt tejaydigan bilim:
import socket
import threading
# Ikkita port: biri ochiq, biri yopiq
OCHIQ = 9950
YOPIQ = 9951
tinglovchi = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tinglovchi.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tinglovchi.bind(("127.0.0.1", OCHIQ))
tinglovchi.listen(2)
def server():
ulanish, _ = tinglovchi.accept()
ulanish.close()
threading.Thread(target=server, daemon=True).start()
def tekshir(manzil, port, kutish=2.0):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(kutish)
try:
s.connect((manzil, port))
return "OCHIQ - kimdir tinglayapti"
except ConnectionRefusedError:
return "YOPIQ - port bo'sh, lekin xost javob berdi"
except socket.timeout:
return "JAVOB YO'Q - xost yoki devor jim turibdi"
except socket.gaierror:
return "NOM TOPILMADI - DNS muammosi"
except OSError as x:
return f"XATO - {x.strerror}"
finally:
s.close()
SINOVLAR = [
("127.0.0.1", OCHIQ),
("127.0.0.1", YOPIQ),
("192.0.2.1", 80), # hujjatlar uchun ajratilgan - javob bermaydi
("mavjud-emas.invalid", 80),
]
for manzil, port in SINOVLAR:
print(f"{manzil}:{port}")
print(" ", tekshir(manzil, port))
tinglovchi.close()
127.0.0.1:9950
OCHIQ - kimdir tinglayapti
127.0.0.1:9951
YOPIQ - port bo'sh, lekin xost javob berdi
192.0.2.1:80
JAVOB YO'Q - xost yoki devor jim turibdi
mavjud-emas.invalid:80
NOM TOPILMADI - DNS muammosi
192.0.2.1 - hujjatlar uchun ajratilgan manzil, unga hech
kim javob bermaydi.
Ko'p tarmoqlarda u kutish vaqtining tugashi bilan yakunlanadi. Lekin ba'zi provayderlar ICMP "yetib bo'lmaydi" xabarini qaytaradi - u holda boshqa qator chiqadi.
Kod ikkala holatni ham to'g'ri ishlaydi. O'zingizda boshqacha natija chiqsa, bu xato emas.
Farqning ma'nosi:
| Natija | Nima bo'lgan | Birinchi navbatda tekshiring |
|---|---|---|
| Rad etildi | Xost bor, port yopiq | Xizmat ishga tushganmi |
| Javob yo'q | Paket yo'qoldi yoki tashlandi | Firewall, marshrut, xost o'chiq |
| Nom topilmadi | DNS ishlamadi | /etc/hosts, DNS sozlamasi |
"Rad etildi" yaxshi xabar: tarmoq yo'li ishlayapti, faqat xizmat yo'q. "Javob yo'q" esa ancha noaniq.
Asosiy vositalar #
| Vosita | Nimani tekshiradi | Misol |
|---|---|---|
ip addr | O'z manzilingiz bormi | ip -br addr |
ip route | Standart shlyuz bormi | ip route |
ping | Xost javob beradimi | ping -c 4 1.1.1.1 |
traceroute | Yo'l qayerda uziladi | traceroute sayt.uz |
dig | DNS javobi | dig +short sayt.uz |
ss | Qaysi portlar ochiq | ss -tlnp |
nc | Portga ulana olamanmi | nc -vz sayt.uz 443 |
curl | Ilova nima qaytaryapti | curl -v sayt.uz |
ping javob bermasligi - muammo belgisi bo'lmasligi mumkinping ICMP protokolidan foydalanadi. Ko'p serverlar va
firewall lar ICMP ni ataylab bloklaydi.
Ya'ni "ping o'tmayapti, demak server o'chiq" degan xulosa noto'g'ri.
To'g'ri tekshiruv - aniq portga ulanish:
nc -vz edu.softromeda.com 443
Yoki curl bilan to'g'ridan-to'g'ri:
curl -sS -o /dev/null -w "%{http_code}\n" https://edu.softromeda.com/
Eng ko'p uchraydigan sabablar #
| Alomat | Ehtimoliy sabab |
|---|---|
| Faqat bitta saytda muammo | Sayt tomonda yoki DNS keshida |
| Hamma saytda, lekin IP bo'yicha ishlaydi | DNS ishlamayapti |
169.254.x.x manzil | DHCP javob bermayapti |
| Bir kompyuterda ishlaydi, boshqasida yo'q | Firewall yoki proksi sozlamasi |
| Ba'zan ishlaydi, ba'zan yo'q | Paket yo'qolishi yoki DNS dagi ikki manzil |
| "Ishlayapti, lekin sekin" | Kechikish yoki bufer shishishi (16-bo'lim) |
| Brauzerda ishlaydi, kodda yo'q | Sertifikat zanjiri yoki proksi |
Nosozlik tuzatilganda ham muammo davom etayotgandek ko'rinishi mumkin - chunki eski javob keshda qolgan.
Tozalash kerak bo'lgan joylar:
| Kesh | Tozalash |
|---|---|
| Brauzer | Ctrl+Shift+R yoki maxfiy oyna |
| Operatsion tizim DNS keshi | resolvectl flush-caches |
| ARP jadvali | ip neigh flush all |
| Ilova ichidagi kesh | Ilovani qayta ishga tushirish |
DNS uchun 11-bo'limdagi TTL qoidasini eslang: yozuv o'zgargandan keyin ham eski qiymat TTL tugaguncha yashaydi.
Yuqoridagi port tekshirgich o'z kompyuteringiz va o'zingiz mas'ul bo'lgan tizimlarni tashxislash uchun.
Begona xost yoki tarmoqni ruxsatsiz skanerlash ko'p mamlakatlarda qonunbuzarlik hisoblanadi - hatto hech narsa buzilmagan bo'lsa ham.
Mashq qilish uchun:
| Qayerda | Izoh |
|---|---|
O'z kompyuteringiz (127.0.0.1) | Har doim mumkin |
| O'z virtual mashinangiz | Har doim mumkin |
| Maxsus mashq maydonchalari | Ruxsat oldindan berilgan |
| Ish beruvchining tizimi | Yozma ruxsat bilan |
Bu mavzu "Kiberxavfsizlik asoslari" darsligining 12-bo'limida batafsil yoritilgan.
- Tashxis zinapoyasi misolini ishga tushiring.
- Unga TLS tekshiruvi qadamini qo'shing.
- Mavjud bo'lmagan nom bering va qaysi qadamda to'xtaganini ko'ring.
- Port tekshirish misolini ishga tushiring.
- Kutish vaqtini 0.5 soniyaga tushiring - natija o'zgardimi?
ip -br addrvaip routeni ishga tushiring, natijani o'qing.- Standart shlyuzingizga
pingqiling. dig +shortbilan uchta saytning manzilini oling.ss -tlnpbilan kompyuteringizdagi ochiq portlarni ro'yxatlang.- Tanish bir nosozlikni zinapoya bo'yicha qadamma-qadam yozib chiqing.
Xulosa #
- "Sayt ochilmayapti" - alomat, tashxis emas. Sabab olti qatlamda bo'lishi mumkin.
- Tekshiruvni pastdan yuqoriga olib boring: kabel, shlyuz, IP, DNS, port, ilova.
- Har qadam o'zidan pastdagisi ishlashini faraz qiladi.
- "Rad etildi" - yaxshi xabar: tarmoq ishlayapti, xizmat yo'q.
- "Javob yo'q" - noaniq: firewall, marshrut yoki o'chiq xost.
- "Nom topilmadi" - DNS muammosi, tarmoq bilan aloqasi yo'q.
pingjavob bermasligi server o'chiq degani emas - ICMP bloklangan bo'lishi mumkin.- Aniq tekshiruv uchun
nc -vzyokicurl -vishlating. - Tuzatishdan keyin brauzer, DNS va ARP keshlarini tozalang.
- O'zingizga tegishli bo'lmagan tizimlarni skanerlamang.
Keyingi bo'limda bitta server bir vaqtda ko'p mijozga qanday xizmat qilishini ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.