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.

🕑 8 daqiqa o‘qish 📄 786 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Asosiy qoida: pastdan yuqoriga
  2. "Rad etildi" va "javob yo'q" - butunlay boshqa muammolar
  3. Asosiy vositalar
  4. Eng ko'p uchraydigan sabablar
  5. Xulosa

"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 #

Tashxis zinapoyasi 1. Kabel, Wi-Fi, o'z IP manzilim bormi? ip addr 2. Shlyuzgacha yetadimi? ping shlyuz 3. Tashqi IP gacha yetadimi? ping 1.1.1.1 4. Nom manzilga aylanadimi? dig sayt.uz 5. Port ochiqmi? nc -vz sayt.uz 443 6. Ilova to'g'ri javob beryaptimi? curl -v Har qadam o'zidan pastdagisi ishlaganini FARAZ qiladi Shuning uchun tartibni buzmang - vaqt tejaydi
Eng ko'p vaqt yuqoridan boshlaganda yo'qotiladi

Zinapoyani kodda ham qurish mumkin:

Python
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()
Natija
--- 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:

Python
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()
Natija
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
Uchinchi qator tarmog'ingizga bog'liq

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:

NatijaNima bo'lganBirinchi navbatda tekshiring
Rad etildiXost bor, port yopiqXizmat ishga tushganmi
Javob yo'qPaket yo'qoldi yoki tashlandiFirewall, marshrut, xost o'chiq
Nom topilmadiDNS 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 #

VositaNimani tekshiradiMisol
ip addrO'z manzilingiz bormiip -br addr
ip routeStandart shlyuz bormiip route
pingXost javob beradimiping -c 4 1.1.1.1
tracerouteYo'l qayerda uziladitraceroute sayt.uz
digDNS javobidig +short sayt.uz
ssQaysi portlar ochiqss -tlnp
ncPortga ulana olamanminc -vz sayt.uz 443
curlIlova nima qaytaryapticurl -v sayt.uz
ping javob bermasligi - muammo belgisi bo'lmasligi mumkin

ping 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:

Terminal
nc -vz edu.softromeda.com 443

Yoki curl bilan to'g'ridan-to'g'ri:

Terminal
curl -sS -o /dev/null -w "%{http_code}\n" https://edu.softromeda.com/

Eng ko'p uchraydigan sabablar #

AlomatEhtimoliy sabab
Faqat bitta saytda muammoSayt tomonda yoki DNS keshida
Hamma saytda, lekin IP bo'yicha ishlaydiDNS ishlamayapti
169.254.x.x manzilDHCP javob bermayapti
Bir kompyuterda ishlaydi, boshqasida yo'qFirewall yoki proksi sozlamasi
Ba'zan ishlaydi, ba'zan yo'qPaket yo'qolishi yoki DNS dagi ikki manzil
"Ishlayapti, lekin sekin"Kechikish yoki bufer shishishi (16-bo'lim)
Brauzerda ishlaydi, kodda yo'qSertifikat zanjiri yoki proksi
Keshni unutmang

Nosozlik tuzatilganda ham muammo davom etayotgandek ko'rinishi mumkin - chunki eski javob keshda qolgan.

Tozalash kerak bo'lgan joylar:

KeshTozalash
BrauzerCtrl+Shift+R yoki maxfiy oyna
Operatsion tizim DNS keshiresolvectl flush-caches
ARP jadvaliip neigh flush all
Ilova ichidagi keshIlovani qayta ishga tushirish

DNS uchun 11-bo'limdagi TTL qoidasini eslang: yozuv o'zgargandan keyin ham eski qiymat TTL tugaguncha yashaydi.

Boshqa odamning tarmog'ini skanerlamang

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:

QayerdaIzoh
O'z kompyuteringiz (127.0.0.1)Har doim mumkin
O'z virtual mashinangizHar doim mumkin
Maxsus mashq maydonchalariRuxsat oldindan berilgan
Ish beruvchining tizimiYozma ruxsat bilan

Bu mavzu "Kiberxavfsizlik asoslari" darsligining 12-bo'limida batafsil yoritilgan.

Amaliy topshiriq
  1. Tashxis zinapoyasi misolini ishga tushiring.
  2. Unga TLS tekshiruvi qadamini qo'shing.
  3. Mavjud bo'lmagan nom bering va qaysi qadamda to'xtaganini ko'ring.
  4. Port tekshirish misolini ishga tushiring.
  5. Kutish vaqtini 0.5 soniyaga tushiring - natija o'zgardimi?
  6. ip -br addr va ip route ni ishga tushiring, natijani o'qing.
  7. Standart shlyuzingizga ping qiling.
  8. dig +short bilan uchta saytning manzilini oling.
  9. ss -tlnp bilan kompyuteringizdagi ochiq portlarni ro'yxatlang.
  10. 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.
  • ping javob bermasligi server o'chiq degani emas - ICMP bloklangan bo'lishi mumkin.
  • Aniq tekshiruv uchun nc -vz yoki curl -v ishlating.
  • 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.

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.