Siapa yang membaca /etc/resolv.conf?

16

Server Centos 7 saya tidak menyelesaikan nama domain dengan benar. Dari apa yang saya lihat, dalam sistem Linux modern /etc/resolv.confsering dihasilkan dengan dhclient, dnsmasqatau Network Manager.

Jadi saya punya pertanyaan teoritis umum tentang tumpukan jaringan di Linux modern:

Siapa yang bertanggung jawab membaca /etc/resolv.conf? Pemain apa (subsistem layanan atau kernel) yang terlibat dalam resolusi nama domain?

JAWABAN SINGKAT: Arch linux manual mengatakan bahwa konfigurasi tingkat tinggi dari resolusi nama domain dilakukan di /etc/nsswitch.conf dan bergantung pada glibcAPI Service Service Switch .

glibcmenggunakan nss-resolvefungsi untuk mengirim permintaan DNS ke server DNS.

Biasanya pada sistem CentOS modern nss-resolve bergantung pada systemd-resolved layanan. Jika /etc/resolv.confdihasilkan oleh sesuatu seperti dhclient-script, systemd-resolvedbaca dan bekerja dalam mode kompatibilitas, meniru perilaku sistem yang lebih lama seperti BINDklien DNS.

Boris Burkov
sumber

Jawaban:

20

Perpustakaan klien DNS lakukan.

Pustaka C berisi klien DNS yang membungkus pencarian nama-ke-alamat dalam protokol DNS dan menyerahkannya ke server DNS proksi untuk melakukan semua pekerjaan kasar dari resolusi kueri. Ada banyak klien DNS ini. Yang ada di pustaka runtime C utama dari sistem operasi Anda akan sangat mungkin berasal dari BIND ISC. Tetapi ada banyak lainnya dari Daniel J. Bernsteindns perpustakaan melalui c-ares ke adns.

Meskipun beberapa dari mereka mengandung mekanisme konfigurasi asli mereka sendiri, mereka umumnya memiliki mode kompatibilitas perpustakaan BIND di mana mereka membaca resolv.conf , yang merupakan file konfigurasi untuk pustaka klien BIND C ISC.

NSS berlapis di atas ini, dan dikonfigurasikan oleh nsswitch.conf. Salah satu hal yang dapat dilakukan pencarian NSS secara internal adalah klien DNS, dannsswitch.conf dibaca oleh kode NSS di pustaka C untuk menentukan apakah dan di mana pencarian diberikan ke klien DNS dan bagaimana menangani berbagai tanggapan.

(Ada sedikit komplikasi pada ide ini yang disebabkan oleh Name Services Cache Dæmon, nscd. Tetapi ini hanya menambah klien lapisan atas di perpustakaan C, berbicara protokol istimewa ke server lokal, yang pada gilirannya bertindak sebagai Klien DNS yang mengucapkan protokol DNS ke server DNS proksi. systemd-resolvedMenambahkan komplikasi serupa.)

systemd-resolved, NetworkManager, connman, dhcpcd,resolvconf , Dan lain-lain menyesuaikan BIND DNS file konfigurasi klien untuk klien beralih DNS untuk berbicara dengan berbagai server DNS proxy pada fly. Ini di luar ruang lingkup untuk jawaban ini, terutama karena ada banyak jawaban di situs WWW ini yang sudah berurusan dengan perincian Bizantium yang melibatkan mekanisme semacam itu.

Cara yang lebih tradisional untuk melakukan sesuatu di dunia Unix adalah dengan menjalankan server DNS proksi baik pada mesin itu sendiri atau pada LAN. Oleh karena itu apa yang dikatakan manual FreeBSD tentang sistem yang dikonfigurasikan secara normal, di mana tindakan default pustaka klien DNS tanpa adanya resolv.confkecocokan dengan apa yang biasanya dimiliki oleh administrator sistem Unix, yang merupakan proxy yang mendengarkan server DNS pada 127.0.0.1. (Manual FreeBSD resolv.confsebenarnya adalah doco yang juga berasal dari BIND ISC, dan tentu saja juga dapat ditemukan di mana perpustakaan klien DNS BIND telah dimasukkan ke tempat-tempat lain seperti perpustakaan GNU C.)

Bacaan lebih lanjut

JdeBP
sumber
7

Dari halaman manual FreeBSD yang jauh lebih baik, resolv.conf :

 The resolver configuration file contains information that is read by the
 resolver routines the first time they are invoked by a process.

 On a normally configured system this file should not be necessary.  The
 only name server to be queried will be on the local machine, the domain
 name is determined from the host name, and the domain search path is
 constructed from the domain name.
rampok
sumber
1

File /etc/resolv.confdibaca oleh panggilan * libc yang melakukan resolusi nama host. Ini terutama getaddrinfodan sudah usang gethostbyname.

Jika fungsi-fungsi ini diberikan nama DNS, maka mereka melakukan hal-hal ini dalam urutan sebagai berikut:

  1. Cobalah untuk menyelesaikan nama host secara lokal, yaitu dengan membaca /etc/hosts.
  2. Jika ini gagal, maka permintaan server DNS yang terdaftar di /etc/resolv.conf.
  3. Jika ini juga gagal, maka nama host tidak dapat diselesaikan.

Karena Anda menyebutkan dnsmasq : Ini adalah server DNS yang berjalan secara lokal. Jadi, pada banyak distro Linux modern, /etc/resolv.confsatu - satunya yang menunjuk 127.0.0.1(di sinilah dnsmasq lokal mendengarkan). dnsmasq kemudian dikonfigurasikan untuk meneruskan kueri server DNS Internet; dnsmasq dikonfigurasi oleh Network Manager setelah tersambung ke Internet.

rexkogitans
sumber
Itu bukan panggilan sistem, itu adalah fungsi * libc.
JoshuaRLi
@ JoshuaRLi yakin, saya mengeditnya.
rexkogitans