Resolusi DNS

Peran /etc/hosts dan resolv.conf dalam resolusi nama.

Daftar isi

Aplikasi jarang memakai alamat IP secara langsung, melainkan nama seperti localhost atau nama domain tujuan. Topik ini membahas dua tempat asal jawaban nama pada Linux, yaitu berkas /etc/hosts yang dibaca lokal dan server DNS yang ditunjuk oleh berkas resolv.conf. Cara menguji keduanya juga dibahas sehingga letak masalah resolusi dapat ditentukan dengan pasti.

Dua sumber jawaban nama#

Sistem operasi tidak menanyakan nama ke satu tempat, melainkan mengikuti urutan sumber yang ditetapkan pada berkas nsswitch.conf. Mekanisme ini disebut NSS (Name Service Switch), dan baris hosts: pada berkas itu menyatakan urutan sumber jawaban nama host, mulai dari yang paling diutamakan.

bash
# tampilkan urutan sumber jawaban nama pada sistem ini
grep '^hosts:' /etc/nsswitch.conf
text Keluaran
hosts:          files dns

Keluaran files dns berarti pencarian nama dimulai dari berkas lokal /etc/hosts, dan apabila nama tersebut tidak ditemukan, pencarian diteruskan ke server DNS yang tercantum pada resolv.conf. Jawaban pertama yang diperoleh dipakai, sehingga entri pada /etc/hosts selalu menang atas jawaban DNS untuk nama yang sama. Urutan inilah yang menjelaskan mengapa dua alat penguji nama dapat memberikan jawaban yang berbeda pada mesin yang sama.

Berkas nsswitch.conf juga mengatur urutan sumber untuk basis data lain, seperti passwd untuk akun pengguna, tetapi pembahasan topik ini cukup sampai pada baris hosts:. Konsekuensi praktisnya bersifat satu arah. Menambahkan nama pada /etc/hosts selalu mengubah jawaban aplikasi lokal, sedangkan menghapus entri di sisi DNS tidak menghilangkan jawaban yang masih tersedia pada berkas lokal. Pemahaman arah ini mencegah banyak kebingungan saat konfigurasi nama diubah.

Berkas /etc/hosts#

Berkas /etc/hosts adalah tabel kecil pemetaan alamat ke nama yang dibaca langsung oleh sistem, tanpa menyentuh jaringan. Isi lengkapnya pada sandbox penulisan sebagai berikut.

bash
# baca isi tabel host lokal
cat /etc/hosts
text Keluaran
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
21.0.7.126	c-6ae8a8d9-14127d0f-16c590d2407b

Setiap baris memuat alamat di kolom pertama, kemudian satu nama kanonik, dan boleh ditambah beberapa alias. Baris pertama memetakan 127.0.0.1 ke localhost, sedangkan baris keduanya memetakan ::1, yaitu loopback versi IPv6, ke localhost beserta alias ip6-localhost dan ip6-loopback. Baris fe00::0 dan fe00::1 adalah entri warisan yang jarang dipakai aplikasi modern, tetapi tetap dibawa oleh tata letak bawaan Debian. Baris terakhir memetakan nama host sandbox ini ke alamatnya, 21.0.7.126, dan pada mesin lain baris serupa memuat nama host mesin tersebut.

Pemakaian praktis berkas ini berputar pada dua kebutuhan, yaitu memberi nama pada mesin di jaringan kecil yang belum memiliki DNS dan mengarahkan sebuah nama ke alamat tertentu saat pengujian. Sebuah baris 127.0.0.1 aplikasi-lokal.test membuat nama tersebut dapat dipakai aplikasi apa pun tanpa mengubah server DNS mana pun, karena jawabannya datang dari berkas ini.

Menggabungkan jawaban dengan getent#

Perintah getent menjalankan pencarian nama persis seperti yang dilakukan aplikasi, yaitu mengikuti urutan nsswitch.conf dari berkas lokal menuju DNS. Karena itu, jawaban getent adalah jawaban yang benar-benar diterima aplikasi pada mesin tersebut.

bash
# tanyakan alamat host ini melalui mekanisme NSS
getent hosts $(hostname)
text Keluaran
21.0.7.126      c-6ae8a8d9-14127d0f-16c590d2407b

Perintah $(hostname) dijalankan lebih dulu oleh shell sehingga menghasilkan nama host mesin, lalu nama itu ditanyakan oleh getent. Jawaban 21.0.7.126 datang dari /etc/hosts, bukan dari DNS, dan hal itu dapat dipastikan karena tidak ada server DNS yang mengetahui nama host internal mesin ini. Ketika sebuah aplikasi berhasil menyambung dengan nama tetapi dig gagal menjawab nama yang sama, pola jawaban seperti inilah penyebabnya.

Kebalikannya juga bernilai diagnosis. Untuk nama yang tidak ada di /etc/hosts, getent meneruskan pencariannya ke server DNS, sehingga jawabannya sama dengan jawaban DNS. Namanya berasal dari get entries, yaitu mengambil entri dari basis data NSS yang diminta. Alat ini tidak hanya melayani nama host, melainkan juga pengguna dan grup melalui perintah seperti getent passwd.

resolv.conf dan server DNS#

Berkas /etc/resolv.conf menunjuk server DNS yang ditanyai ketika /etc/hosts tidak memuat nama yang dicari.

bash
# baca konfigurasi resolver sistem
cat /etc/resolv.conf
text Keluaran
nameserver 100.100.2.136
nameserver 100.100.2.138

Setiap baris nameserver memuat satu alamat server DNS, dan urutannya bermakna. Resolver mencoba yang pertama terlebih dahulu, lalu pindah ke yang berikutnya apabila yang pertama tidak menjawab. Sandbox penulisan memakai dua resolver internal penyedia lingkungan tersebut. Berkas yang sama dapat memuat baris search untuk melengkapi nama pendek dan baris options untuk menyetel perilaku resolver.

Menguji server DNS dengan dig#

Perintah dig melewati /etc/hosts dan nsswitch.conf karena berbicara langsung dengan server nama, sehingga digunakan untuk menguji DNS itu sendiri dan bukan jawaban akhir aplikasi.

bash
# tanyakan alamat localhost langsung ke server DNS
dig +short localhost
text Keluaran
127.0.0.1

Server DNS pada sandbox ini menjawab localhost dengan 127.0.0.1, sesuai perilaku khusus yang ditetapkan untuk nama tersebut pada RFC 6761. Perbedaan cara kerja kedua alat penguji dirangkum sebagai berikut.

PerintahSumber jawabanCocok untuk
getent hosts/etc/hosts lebih dulu, lalu DNSMeniru jawaban yang diterima aplikasi
dig +shortServer DNS secara langsungMenguji server DNS itu sendiri

Kedua alat ini dipakai berpasangan pada saat diagnosis. Apabila getent menjawab tetapi dig tidak, jawaban aplikasi datang dari /etc/hosts. Apabila keduanya gagal sementara koneksi internet berjalan, penyebabnya ada pada konfigurasi resolver, misalnya alamat nameserver yang keliru atau servernya memang tidak dapat dijangkau.

Kesalahan umum#

  • Menganggap keluaran dig sebagai jawaban yang diterima aplikasi. dig tidak membaca /etc/hosts, sehingga nama yang dipetakan lokal tidak akan terjawab olehnya. Gunakan getent untuk meniru perilaku aplikasi.
  • Menyunting /etc/hosts tanpa melihat perubahan. Resolver dan layanan seperti systemd-resolved menyimpan cache jawaban, sehingga hasil lama masih terpakai. Bersihkan cache dengan resolvectl flush-caches sebelum menyimpulkan suntingan gagal.
  • Mengubah /etc/resolv.conf secara manual tanpa sadar berkas itu dikelola. Pada sistem dengan klien DHCP atau NetworkManager, isi berkas tersebut ditulis ulang saat konfigurasi jaringan berubah. Ubah server DNS melalui pengelola jaringannya agar tetap bertahan.
  • Menulis baris /etc/hosts dengan format yang keliru. Pemisah antara alamat dan nama boleh spasi maupun tab, tetapi setiap baris harus diawali alamat, dan satu alamat boleh memuat beberapa nama sekaligus.

Ringkasan#

  • Urutan sumber jawaban nama ditetapkan pada nsswitch.conf, yaitu /etc/hosts lebih dulu, kemudian server DNS dari resolv.conf.
  • /etc/hosts memetakan alamat ke nama tanpa jaringan, dan entri di dalamnya selalu menang atas jawaban DNS untuk nama yang sama.
  • getent hosts meniru cara aplikasi bertanya, sedangkan dig +short menguji server DNS secara langsung.
  • Berkas resolv.conf memuat daftar nameserver yang dicoba berurutan, dan pada sistem modern berkas itu sering dikelola oleh resolved atau pengelola jaringan.

Referensi#