Bagaimana `/ etc / hosts` dan DNS bekerja bersama untuk menyelesaikan nama host ke alamat IP?

10

Di Linux, bagaimana cara /etc/hostsdan DNS bekerja bersama untuk menyelesaikan nama host ke alamat IP?

  1. jika nama host dapat diatasi /etc/hosts, apakah DNS berlaku setelah /etc/hosts untuk menyelesaikan nama host atau memperlakukan alamat IP yang diselesaikan dengan /etc/hostssebagai "nama host" untuk menyelesaikan secara rekursif?
  2. Di browser saya (firefox dan google chrome), ketika saya tambahkan ke /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    mengetikkan www.google.com di bilah alamat browser dan menekan masuk tidak akan terhubung ke situs web. Setelah saya menghapus garis itu /etc/hosts, saya dapat terhubung ke situs web. Apakah itu berarti /etc/hostsmengabaikan DNS untuk menyelesaikan nama host?

    Setelah saya menambahkan kembali baris ke /etc/hosts, saya masih dapat terhubung ke situs web, bahkan setelah menyegarkan halaman web. Mengapa tidak /etc/hostsberlaku lagi, sehingga saya tidak dapat terhubung ke situs web?

Terima kasih.

Tim
sumber
9
Berhati-hatilah karena banyak browser Web mengimplementasikan server DNS dan cache DNS mereka sendiri dan tidak berkonsultasi dengan mekanisme pencarian nama apa pun yang telah dikonfigurasi pada sistem. Dengan kata lain, beberapa browser Web benar-benar mengabaikan /etc/hostsdan server nama yang ditentukan secara lokal. Sangat membingungkan untuk menyaksikan pertama kali. (Melihat Anda, browser berbasis Chromium!)
Christopher
@Christopher saya datang ke sini untuk mengatakan hal yang sama. Terkait unix.stackexchange.com/questions/363498/...
Rui F Ribeiro
@Christopher Setelah saya menambahkan kembali baris ke / etc / hosts, saya masih dapat terhubung ke situs web, bahkan setelah menyegarkan halaman web. Mengapa / etc / hosts tidak berlaku lagi, sehingga saya tidak dapat terhubung ke situs web? Apakah karena cache DNS dari Firefox?
Tim
@RuiFRibeiro Build Chromium ini tampaknya menghormati /etc/hostsdan server DNS yang ditentukan sistem: ( github.com/Eloston/ungoogled-chromium ). Instalasi pada MacOS dengan Homebrew: brew cask install eloston-chromium.
Christopher

Jawaban:

21

Ini ditentukan oleh konfigurasi NSS (Name Service Switch) yaitu arahan /etc/nsswitch.conffile hosts. Misalnya, di sistem saya:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Di sini, filesmerujuk ke /etc/hostsfile, dan dnsmerujuk ke sistem DNS. Dan seperti yang dapat Anda bayangkan, mana yang lebih dulu menang .

Juga, lihat man 5 nsswitch.confuntuk mendapatkan lebih banyak ide tentang ini.


Sebagai tambahan, untuk mengikuti pemesanan resolusi host NSS, gunakan getentdengan hostssebagai database misalnya:

getent hosts example.com
heemayl
sumber
Terima kasih. Di bagian 2 saya, apakah itu karena server DNS browser web saya tidak berfungsi, tetapi cache DNS browser web berfungsi?
Tim
Bagaimana systemd.resolverpengaruhnya terhadap resolusi? Di manakah NIS dan LDAP masuk ke dalam sistem resolusi? Urutan apa yang mengikuti sistem MacOS atau sistem Windows ?.
Isaac
@Tim Ya, browser Anda mengambil data dari cache.
heemayl
7

Untuk menjawab hanya pertanyaan terakhir Anda: /etc/hoststidak berlaku lagi dengan segera karena firefoxcaching nama host terakhir yang didapat google.com; jika Anda ingin selalu mengambilnya lagi, Anda harus set network.dnsCacheExpirationke 0dalam about:config. Info lebih lanjut (meskipun agak ketinggalan jaman) di sini . Maaf jika ini offtopic.


Sebagai sidenote, banyak program tidak menggunakan resolver standar ( getaddrinfo(3), getnameinfo(3)[1]) karena sucks .

Pertama, antarmuka tidak sinkron; program apa pun yang cukup kompleks harus menelurkan utas terpisah hanya dengan melakukan getaddrinfo()dan kemudian membuat protokol sendiri untuk berkomunikasi dengannya (dan mari kita bahkan tidak masuk ke dalam getaddrinfo_a(), yang mengirimkan sinyal setelah selesai, jadi itu lebih buruk lagi).

Kedua, implementasi resolver di glibc(pustaka C standar di linux) mengerikan, mengharapkan Anda membiarkannya menarik objek dinamis acak ke dalam ruang alamat melalui dlopen()belakang Anda, dan membuatnya mustahil untuk menampungnya dengan cara apa pun atau menggunakannya secara statis executable terkait.

Karena banyak program tidak menggunakan penyelesai standar langsung, mereka juga tidak repot-repot untuk meniru perilaku tepat, dan mengabaikan beberapa atau semua /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confatau /etc/gai.conf.

[1] dan bahkan tidak menyebutkan non-reentrant, hanya ipv4 gethostbyname(), yang sudah usang sejak zaman dahulu.

Paman Billy
sumber
Terima kasih. Apa maksudmu "non-reentrant"?
Tim
1
Ini berarti bahwa jika Anda melakukan google = GHBN("google.com"); facebook = GHBN("facebook.com")Anda mungkin berakhir dengan keduanya googledan facebookberisi alamat facebook.com. Ketika dua panggilan dilakukan di utas yang berbeda, itu bahkan lebih lucu: Anda dapat mengakhiri dengan alamat yang setengah google dan setengah facebook atau sampah lengkap.
Paman Billy
Apa yang sudah diganti gethostbyname()sekarang?
Tim
1
getaddrinfoadalah fungsi standar untuk itu, tetapi itu sendiri brokrn, seperti yang sudah saya jelaskan, jadi itu tidak digunakan seperti browser atau aplikasi kehidupan nyata lainnya.
Paman Billy
Memang firefox dan Chrome menggunakan resolusi mereka sendiri, misalnya. Terima kasih atas catatannya.
Rui F Ribeiro
6

File /etc/hostsdan DNS tidak bekerja bersama. Mereka memberikan resolusi nama independen (nama jaringan).

Lem yang menghubungkan mereka ada di dalam /etc/nsswitch.confuntuk sistem linux . Di /etc/netsvc.confuntuk server AIX, di sistem untuk Windows dan dapat didaftar dengan lookupd -configuration(cari LookupOrder, mirip dengan:) Cache FF DNS NI DSdi sistem MacOS.

Urutan aktual menjadi kompleks dan biasanya berbelit-belit karena setiap layanan resolusi nama dapat (dan berkali-kali) melihat ke dalam tingkat resolusi lain. Seperti dnsmasq(server DNS ringan umumnya di 127.0.0.1:53, atau ::1:53(atau keduanya)) biasanya membaca dan menyertakan /etc/hostskonten file. Atau seperti systemd.resolver(penyelesai dasar yang semestinya hanya menyelesaikan nama-nama yang tidak bertitik seperti mycomputer) memanggil resolusi DNS langsung untuk nama-nama bertitik ( mycomputer.here.dev.) dalam beberapa kondisi.

Secara umum, layanan dipanggil secara berurutan dan yang pertama tidak gagal akan menang dan diterima sebagai alamat yang benar. Urutan dasar umum adalah: /etc/hosts(file), mDNS (nama tidak putus-putus), DNS, NIS, NIS +, LDAP. Dalam beberapa sistem linux ada resolusi terakhir untuk komputer hostnamedalam layananmyhostname

Misalnya, dalam sistem ini (dari cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Perhatikan bahwa orderentri yang sangat lama (glibc 2.4 dan sebelumnya) ditetapkan/etc/host.conf sebagai:

order hosts,bind,nis

Hanya berlaku untuk layanan nama file (file /etc/hosts).

Efek pada komputer klien (linux) yang terkait dengan NIS dan LDAP ini (biasanya) dikendalikan oleh server DNS yang digunakan (bind, unbound, dll.).

begitu:

  1. Jika nama host dapat diselesaikan di / etc / hosts, apakah DNS berlaku setelah / etc / hosts untuk menyelesaikan nama host atau memperlakukan alamat IP yang diselesaikan oleh / etc / hosts sebagai "hostname" untuk diselesaikan secara rekursif?

Tidak ada

Jika nama host dapat diatasi /etc/hosts, DNSitu tidak berlaku (jika file sebelum DNS).

juga adalah alamat IP yang diselesaikan diperlakukan sebagai "hostname".

Sederhananya adalah: alamat yang diselesaikan.

browser

Peramban dapat menggunakan metode apa pun untuk menyelesaikan nama (setelah memeriksa tembolok dari nama yang diselesaikan). Hanya jika menggunakan metode yang disediakan sistem, urutan yang diberikan di atas berlaku. Browser, seperti program apa pun, dapat memilih untuk menghubungi server DNS secara langsung.

Jika urutan sistem sudah ada /etc/hostssebelumnya DNS, itu berarti bahwa entri dalam file itu akan diutamakan untuk DNSlayanan resolusi.

Begitu:

  1. ... Apakah ini berarti bahwa / etc / hosts mengesampingkan DNS untuk menyelesaikan nama host?

Ya (jika browser menggunakan resolusi yang disediakan sistem).

Mengapa tidak /etc/hostsberlaku lagi, sehingga saya tidak dapat terhubung ke situs web?

Hanya sampai cache internal browser dihapus (atau habis waktu) untuk nama tertentu adalah nama yang dicari di luar browser lagi.

Jika peramban memiliki nama yang diselesaikan dalam cache, peramban menggunakannya lagi.

Gunakan ini untuk menghapus cache .

Atau cukup tutup (tunggu sebentar) dan nyalakan kembali browser.

Ishak
sumber