DNS vositalari
DHCP klient va server asoslari maqolasida ko'rganimizdek, DHCP server klientga IP manzil bilan birga DNS server manzillarini ham beradi. Lekin "DNS server qayerdaligini bilish" bilan undan haqiqatan foydalanish o'rtasida bir nechta Linux’ga xos qatlam bor: /etc/hosts, /etc/nsswitch.conf, resolv.conf va zamonaviy tizimlarda systemd-resolved. DNS protokolining o'zi — so'rov turlari, rekursiv va iterativ resolution, A/AAAA/MX/CNAME yozuvlari — DNS resolution jarayoni maqolasida ko'rib chiqilgan; bu maqola esa Linux hosti nomni aslida qanday resolve qilishini va shu jarayonni aniqlash vositalarini ko'rib chiqadi.
Nom qanday qilib manzilga aylanadi: NSS va nsswitch.conf
Linux’da ilova hostname’ni to'g'ridan-to'g'ri DNS serverga yubormaydi — u glibc ning getaddrinfo()/gethostbyname() funksiyalarini chaqiradi, ular esa qaysi manbalarni va qanday tartibda tekshirishni hal qilish uchun Name Service Switch (NSS) ga murojaat qiladi. Bu tartib /etc/nsswitch.conf dagi hosts: qatorida yozilgan:
files dns shuni anglatadi: avval /etc/hosts ni tekshir, nom u yerda topilmasa, DNS’ga so'rov yubor. Zamonaviy systemd-resolved ishlatadigan tizimlarda bu qatorda ko'pincha resolve moduli ham bo'ladi:
Bu holatda qidiruv avval /etc/hosts ni, so'ng systemd-resolved xizmatini tekshiradi va faqat shu xizmat mavjud bo'lmasa — masalan, u ishlamayotgan bo'lsa — to'g'ridan-to'g'ri DNS’ga o'tadi.
/etc/hosts: lokal, qo'lda boshqariladigan yozuvlar
Format: <IP> <asosiy-nom> [qo'shimcha-nomlar...]. Bu fayldagi yozuvlarning hech qanday DNS server bilan aloqasi yo'q — ular faqat shu muayyan hostda amal qiladi. Odatda bu quyidagilar uchun ishlatiladi:
- DNS server kerak bo'lmagan kichik laboratoriya yoki sinov muhiti;
- hali DNS’da ro'yxatdan o'tmagan yangi xizmatga vaqtincha nom berish;
- muayyan hostname’ni ataylab boshqa IP’ga yo'naltirish — masalan, sinov uchun production domenini lokal serverga yo'naltirish.
Warning
Yuqorida ko'rsatilgan nsswitch.conf tartibiga ko'ra /etc/hosts dagi yozuv har doim DNS’dan ustun turadi. Bu foydali debugging vositasi, lekin unutib qoldirilgan sinov yozuvi production’da chalkash "faqat shu bitta serverda boshqacha ishlayapti" muammolariga sabab bo'lishi mumkin. Sinov tugagach, vaqtinchalik yozuvni doim olib tashlang.
Zamonaviy resolver: systemd-resolved
Ko'p zamonaviy Ubuntu/Debian o'rnatmalarida /etc/resolv.conf haqiqiy DNS server IP’siga emas, lokal stub resolver’ga ishora qiladi:
127.0.0.53 — mashinaning o'zida ishlayotgan systemd-resolved xizmati. Bu xizmat DHCP yoki statik konfiguratsiyadan olingan haqiqiy DNS serverlarni kuzatib boradi, so'rovlarni keshlaydi va ularni haqiqiy serverlarga uzatadi. Haqiqiy, tashqi DNS serverlarni ko'rish uchun cat /etc/resolv.conf yetarli emas — maxsus buyruq kerak:
Link 2 (enp0s3)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.1.1
DNS Servers: 192.168.1.1 1.1.1.1
Current DNS Server — so'rovlar hozir yuborilayotgan server; DNS Servers — shu interfeys uchun mavjud bo'lgan, odatda DHCP orqali olingan to'liq ro'yxat. Interfeys bo'yicha statistika va keshni tozalash:
flush-caches eskirgan keshlangan natijalarni tozalaydi — masalan, DNS yozuvi o'zgargan, lekin resolver hali ham eski IP’ni qaytarayotgan bo'lsa. Bu buyruq xizmatni qayta ishga tushirishni talab qilmaydi va uni ishga tushirish xavfsiz.
Note
systemd-resolved ishlamayotgan tizimlarda yoki minimal tizimlarda (masalan, ayrim konteyner image’larida) /etc/resolv.conf to'g'ridan-to'g'ri haqiqiy DNS server IP’larini o'z ichiga olishi mumkin. resolvectl status muvaffaqiyatli ishlashi yoki xato qaytarishi qaysi holatda ekaningizni ko'rsatadi.
Qo'lda DNS so'rovi yuborish: dig, host, nslookup
Warning
dig, host va nslookup hammasi DNS’ga to'g'ridan-to'g'ri so'rov yuboradi — ular /etc/hosts ni va nsswitch.conf tartibini butunlay e’tiborsiz qoldiradi. Ya’ni dig "to'g'ri" DNS javobini qaytarishi mumkin, xuddi shu hostdagi ilova esa baribir boshqa IP’ga ulanadi, chunki ilova nomni NSS orqali resolve qiladi (u avval /etc/hosts ni va systemd-resolved ni tekshiradi). Nomni ilova qanday resolve qilsa, xuddi shunday resolve qilish uchun getent dan foydalaning:
getent hosts nsswitch.conf dagi to'liq hosts: zanjiri bo'ylab o'tadi, shuning uchun uning javobi faqat xom DNS’ni emas, /etc/hosts dagi qayta belgilashlar va files/resolve modullarini ham aks ettiradi. dig va getent bir-biriga mos kelmasa, xatoning o'zi aynan shu farqda: lokal NSS yo'lidagi biror narsa (ko'pincha /etc/hosts dagi tasodifiy yozuv) DNS’ni qayta belgilayapti.
dig — eng batafsil va skript uchun eng qulay
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 86400 IN A 93.184.216.34
;; Query time: 24 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
Muhim qismlar:
ANSWER SECTION— so'ralgan yozuv turi (bu yerdaA) va qaytarilgan qiymat;86400— TTL (time to live), soniyalarda; boshqa resolver’lar bu javobni shuncha vaqt keshlashi va qayta ishlatishi mumkin — DNS yozuvi o'zgartirilgandan so'ng darhol eski qiymat ko'rinishda davom etishining sababi ko'pincha aynan shu;SERVER— javob qaysi DNS serverdan kelgani.
Boshqa yozuv turini so'rash va qisqa shakldagi javob olish:
Lokal resolver’ni chetlab o'tib, muayyan serverga to'g'ridan-to'g'ri so'rov yuborish:
Bu ayniqsa foydali: agar dig example.com noto'g'ri natija bersa-yu, dig @1.1.1.1 example.com to'g'risini bersa, muammo tashqi DNS’da emas — lokal resolver’da yoki uning keshida.
Teskari qidiruv (IP’dan nomga):
host — qisqa, tezkor tekshiruv
nslookup — eskiroq, lekin hali ham keng uchraydi
nslookup eski hujjatlar va skriptlarda hali ham uchraydi; u funksional jihatdan dig/host bilan bir xil ma’lumot qaytaradi, lekin uning o'z ishlab chiquvchilari murakkabroq diagnostika uchun rasman dig ni tavsiya qiladi.
Amaliy vaziyat: DNS o'zgarishidan keyin bitta server hali ham eski manzilga ishora qilyapti
Muammo: app.example.com uchun DNS yozuvi yangi serverga ishora qiladigan qilib o'zgartirildi, lekin bitta muayyan ilova serveridan yuborilgan so'rov hali ham eski IP’ni qaytaryapti, boshqa serverlar esa to'g'ri resolve qilyapti.
1-qadam — muammoni ajratib olish:
Agar lokal so'rov eski qiymatni, tashqi serverga so'rov esa yangisini qaytarsa, muammo global DNS’da emas — u shu hostning lokal resolution zanjiriga xos.
2-qadam — /etc/hosts ni tekshirish:
Agar bu yerda unutib qoldirilgan sinov yozuvi topilsa, sabab shu — uni olib tashlash kifoya.
3-qadam — /etc/hosts toza bo'lsa, keshni tekshirish:
4-qadam — natija: agar keshni tozalagandan keyin yangi IP ko'rinsa, muammo TTL tugashidan oldin keshlangan eskirgan javob edi. Agar baribir eski IP qaytarilsa, keyingi qadam — DHCP orqali olingan DNS serverlar ro'yxatining o'zi to'g'riligini tekshirish (DHCP klient va server asoslari maqolasida ko'rilgan lease faylidan).
5-qadam — hujjatlashtirish: muammo qaysi qatlamda — hosts faylida, keshda yoki DNS serverning o'zida bo'lganini va u qanday topilganini qayd qiling.
Keng tarqalgan xatolar
/etc/hosts da eski sinov yozuvini unutib qoldirish
Vaqtinchalik yo'naltirish uchun qo'shilgan qator sinovdan keyin qolib ketadi va keyinroq aynan bitta serverda takrorlanadigan chalkash xatolarga sabab bo'ladi. Qo'shgan har bir yozuvingiz qachon olib tashlanishi kerakligini kuzatib boring.
resolv.conf ni qo'lda tahrirlash
systemd-resolved ishlaydigan tizimda /etc/resolv.conf odatda avtomatik yaratiladigan symlink yoki fayl; qo'lda kiritilgan o'zgarishlar u navbatdagi safar qayta yaratilganda yo'qoladi. DNS serverni o'zgartirish uchun buni netplan yoki NetworkManager konfiguratsiyasi orqali qiling.
Eskirgan keshlangan javobni "DNS o'zgarishi ishlamadi" deb talqin qilish
TTL tugaguncha eski javobni qaytarish — xato emas, DNS’ning oddiy xatti-harakati. Xulosa chiqarishdan oldin avval dig chiqishidagi TTL qiymatini, kerak bo'lsa esa lokal keshni tekshiring.
Faqat bitta serverga so'rov yuborib, "DNS butunlay ishlamayapti" deb e’lon qilish
Bitta server vaqtincha ishlamay qolgan bo'lishi mumkin. dig @<boshqa-server> bilan kamida ikkinchi, mustaqil manbani tekshirmasdan xulosaga kelmang.
Intervyuda
Intervyuda tez-tez beriladigan sinov savoli: "rejalashtirilgan migratsiyani tezlashtirish uchun yozuvning TTL’i hozirgina pasaytirildi — bu darhol kuchga kirdimi?" Yo'q. Yozuvni allaqachon keshlagan har qanday resolver uni qancha vaqt ishlatishini hali ham eski TTL belgilaydi; zonadagi TTL’ni pasaytirish faqat kelajakdagi qidiruvlar qancha vaqt keshlanishini o'zgartiradi. Aynan shu sababli DNS migratsiyalari o'tishdan ancha oldin rejalashtiriladi: avval TTL pasaytiriladi, kamida eski muddati davomida tarqalishi uchun qoldiriladi va faqat shundan keyin haqiqiy yozuv o'zgartiriladi.
Mashqlar
/etc/nsswitch.confdagihosts:qatorini toping va undagi har bir kalit so'zning ma’nosini tushuntiring.resolvectl statusdagiCurrent DNS ServervaDNS Serversqiymatlarini solishtiring va ular qayerdan kelganini — statik konfiguratsiyadanmi yoki DHCP’danmi — aniqlang.dig example.com,dig @1.1.1.1 example.comvadig +short MX example.comnatijalarini solishtiring va har biri o'rtasidagi farqni yozing.- Sinov VM’ida
/etc/hostsga ataylab noto'g'ri yozuv qo'shing, unipingyokidigbilan aniqlang, so'ng olib tashlab, natijani qayta tekshiring.
Mashqni bajardim deyish uchun: 4-mashqda olib tashlagandan keyin dig ham, ping ham hostname’ni dig @1.1.1.1 ga yuborilgan mustaqil so'rov qaytaradigan o'sha manzilga resolve qilishi kerak — agar ular hali ham mos kelmasa, yana boshqa keshlangan yoki lokal qayta belgilash ta’sir qilmoqda.
Manbalar
- man7.org:
nsswitch.conf(5): https://man7.org/linux/man-pages/man5/nsswitch.conf.5.html - man7.org:
hosts(5): https://man7.org/linux/man-pages/man5/hosts.5.html - man7.org:
resolv.conf(5): https://man7.org/linux/man-pages/man5/resolv.conf.5.html - freedesktop.org:
resolvectl(1): https://www.freedesktop.org/software/systemd/man/latest/resolvectl.html - freedesktop.org:
systemd-resolved.service(8): https://www.freedesktop.org/software/systemd/man/latest/systemd-resolved.service.html - ISC BIND:
dig(1)qo'llanmasi: https://bind9.readthedocs.io/en/latest/manpages.html#dig-dns-lookup-utility - man7.org:
nslookup(1): https://man7.org/linux/man-pages/man1/nslookup.1.html