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.
# tampilkan urutan sumber jawaban nama pada sistem ini
grep '^hosts:' /etc/nsswitch.confhosts: files dnsKeluaran 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.
# baca isi tabel host lokal
cat /etc/hosts127.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-16c590d2407bSetiap 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.
# tanyakan alamat host ini melalui mekanisme NSS
getent hosts $(hostname)21.0.7.126 c-6ae8a8d9-14127d0f-16c590d2407bPerintah $(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.
# baca konfigurasi resolver sistem
cat /etc/resolv.confnameserver 100.100.2.136
nameserver 100.100.2.138Setiap 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.
# tanyakan alamat localhost langsung ke server DNS
dig +short localhost127.0.0.1Server 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.
| Perintah | Sumber jawaban | Cocok untuk |
|---|---|---|
getent hosts | /etc/hosts lebih dulu, lalu DNS | Meniru jawaban yang diterima aplikasi |
dig +short | Server DNS secara langsung | Menguji 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. Gunakangetentuntuk meniru perilaku aplikasi. - Menyunting
/etc/hoststanpa melihat perubahan. Resolver dan layanan seperti systemd-resolved menyimpan cache jawaban, sehingga hasil lama masih terpakai. Bersihkan cache denganresolvectl flush-cachessebelum menyimpulkan suntingan gagal. - Mengubah
/etc/resolv.confsecara 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/hostsdengan 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/hostslebih dulu, kemudian server DNS dariresolv.conf. /etc/hostsmemetakan alamat ke nama tanpa jaringan, dan entri di dalamnya selalu menang atas jawaban DNS untuk nama yang sama.getent hostsmeniru cara aplikasi bertanya, sedangkandig +shortmenguji server DNS secara langsung.- Berkas
resolv.confmemuat daftarnameserveryang dicoba berurutan, dan pada sistem modern berkas itu sering dikelola oleh resolved atau pengelola jaringan.
Referensi#
- hosts(5) — Linux man-pages project
— Format berkas
/etc/hostsbeserta aturan pemetaannya. - resolv.conf(5) — Linux man-pages project
— Opsi konfigurasi resolver, termasuk
nameserverdansearch. - nsswitch.conf(5) — Linux man-pages project — Mekanisme NSS dan urutan sumber jawaban nama.
- Special-Use Domain Names (RFC 6761) — IETF
— Spesifikasi nama khusus, termasuk perilaku
localhostmenuju alamat loopback.