Bagaimana cara mengkonfigurasi systemd-resolved dan systemd-networkd untuk menggunakan server DNS lokal untuk menyelesaikan domain lokal dan server DNS jarak jauh untuk domain jarak jauh?

26

Saya terhubung ke jaringan area lokal dengan akses ke Internet melalui gateway. Ada server DNS di jaringan lokal yang mampu menyelesaikan nama host komputer dari jaringan lokal.

Saya ingin mengkonfigurasi systemd-diselesaikan dan systemd-networkd sehingga permintaan pencarian untuk nama host lokal akan diarahkan (dialihkan) secara eksklusif ke server DNS lokal dan permintaan pencarian untuk semua nama host lainnya akan diarahkan secara eksklusif ke server DNS lain yang jauh.

Mari kita asumsikan saya tidak tahu di mana file-file konfigurasi itu atau apakah saya harus menambahkan lebih banyak file dan memerlukan path mereka untuk ditentukan dalam jawaban.

Piotr Dobrogost
sumber

Jawaban:

28

Dalam file konfigurasi untuk antarmuka jaringan lokal kita harus menentukan kita ingin mendapatkan alamat server DNS lokal dari server DHCP menggunakan DHCP=opsi :

[Network]
DHCP=yes

atau tentukan alamatnya secara eksplisit menggunakan DNS=opsi :

[Network]
DNS=10.0.0.1

Selain itu kami perlu menentukan (di bagian yang sama) domain lokal menggunakan Domains=opsi

Domains=domainA.example domainB.example ~example

Kami menentukan domain lokal domainA.example domainB.exampleuntuk mendapatkan perilaku berikut (dari systemd-resolved.service, halaman manual systemd-resolved ):

Pencarian untuk nama host yang diakhiri dengan salah satu domain per-antarmuka secara eksklusif dialihkan ke antarmuka yang sesuai.

Cara ini hostX.domainA.exampleakan diselesaikan secara eksklusif oleh server DNS lokal kami.

Kami menetapkan ~examplebahwa semua domain yang diakhiri exampleharus diperlakukan sebagai domain hanya rute untuk mendapatkan perilaku berikut (dari uraian komit ini ):

Server DNS yang memiliki domain hanya rute hanya boleh digunakan untuk domain yang ditentukan.

Cara ini hostY.on.the.internetakan diselesaikan secara eksklusif oleh server DNS global kami yang jarak jauh.

Catatan

Idealnya, saat menggunakan protokol DHCP, nama domain lokal harus diperoleh dari server DHCP alih-alih ditentukan secara eksplisit dalam file konfigurasi antarmuka jaringan di atas. Lihat UseDomains=opsi . Namun masih ada masalah luar biasa dengan fitur ini - lihat masalah opsi pencarian domain systemd-networkd DHCP .

Kita perlu menentukan server DNS jarak jauh sebagai server DNS global kami yang mencakup seluruh sistem. Kita dapat melakukan ini di /etc/systemd/resolved.conffile:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

Jangan lupa memuat ulang konfigurasi dan memulai kembali layanan:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

Peringatan!

Jaminan di atas hanya berlaku ketika nama sedang diselesaikan oleh systemd-diselesaikan - lihat halaman manual untuk nss-resolve, libnss_resolve.so.2 dan halaman manual untuk systemd-resolved.service, systemd-diselesaikan .

Lihat juga:

Referensi:

Piotr Dobrogost
sumber
6
Sudahkah Anda mempertimbangkan untuk tidak menggunakan .localdalam contoh ini? Tentu dengan avahi, ini seharusnya dicadangkan untuk MDNS dan menyalahgunakannya adalah no-no besar. Akan lebih jelas bagi saya untuk menggunakan example.comatau .example .
sourcejedi
1
@sourcejedi Untuk referensi .localdidefinisikan sebagai domain khusus dalam RFC 6762 - DNS Multicast di bagian Nama DNS Multicast . Terima kasih sudah diperbaiki.
Piotr Dobrogost
Catatan yang tidak terkait: Anda dapat menerima sendiri jawaban juga.
intelfx
2
Saya pikir akan bermanfaat untuk menambahkan lokasi file konfigurasi untuk antarmuka jaringan lokal . Tidak yakin benar kan /etc/systemd/network/*.network? Ditemukan di sini superuser.com/a/1365864
Pierre Cordier
1
Saya mengamati bahwa jawaban ini "Dalam file konfigurasi ..." tidak responsif terhadap OP "Mari kita asumsikan saya tidak tahu di mana file konfigurasi ..." Sebagai seseorang yang telah tiba di sini dalam keadaan ketidaktahuan yang sama tentang lokasi file konfigurasi tertentu, jawaban ini tidak lengkap.
Eric Towers
1

Hanya untuk memperluas jawaban yang sangat bagus dari @piotrDobrogost, jangan lupa konfigurasi /etc/nsswitch.confuntuk digunakan systemd-resolvedsebagai sumber resolusi DNS. hostsArahan Anda harus terlihat sebagai berikut untuk kasus penggunaan khusus Anda:

/etc/nsswitch.conf

hosts:  files resolve dns

Jadi, jika Anda membatasi resolusi hanya untuk domain yang ditentukan dalam Domainsdirektif /etc/systemd/resolved.confsebagai rincian Piotr di atas, DNS selanjutnya harus dikonsultasikan dalam urutan sumber resolusi nama yang ditentukan /etc/nsswitch.confketika domain TIDAK ditemukan dalam Domainsdirektif:

Link berikut referensi persyaratan untuk menentukan tekad di /etc/nsswitch.confsehingga systemd-resolveddikonsultasikan selama resolusi nama:

https://github.com/systemd/systemd/issues/940

Dokumentasi SystemD yang saya temukan mengerikan. Saya harus mengumpulkan pemahaman dari banyak tautan, termasuk jawaban Piotr di atas ;-)

F1Linux
sumber
Bila menggunakan direkomendasikan modus operasi dari systemd-diselesaikan mana /etc/resolve.confadalah sebuah symlink ke /run/systemd/resolve/stub-resolv.conffile yang yang pada gilirannya berisi alamat systemd-tekad ini penyelesai DNS rintisan tidak perlu ke tempat resolvedirektif dalam /etc/nsswitch.conffile sebagai permintaan DNS akan diarahkan (karena standar nss-dnsdirektif) ke resolver stub yang bertindak sesuai dengan aturan yang diselesaikan oleh systemd .
Piotr Dobrogost
@PiotrDobrogost Bagaimana Anda bisa mengendalikan sumber pesanan dari resolusi DNS dikonsultasikan tanpa menggunakan /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" file ") akan diperiksa untuk IP statis : pemetaan nama dan jika tidak ada yang ditemukan, rintisan yang diselesaikan dengan systemd yang diselesaikan selanjutnya akan dikonsultasikan . Saya tidak bisa melihat bagaimana mungkin untuk itu sumber tahap resolusi DNS tanpa menggunakan /etc/nsswitch.conf. Apakah saya melewatkan trik di sini?
F1Linux
Saya tidak mengatakan /etc/nsswitch.conftidak diperlukan. Saya mengatakan bahwa ketika seseorang menggunakan resolver DNS rintisan systemd-resolved maka cukup memiliki dnsdirektif terdaftar hosts:sesuai (mungkin setelah filedirektif). Tidak perlu resolvedirektif di sana karena rintisan resolver yang merupakan titik masuk ke logika systemd-resolved dan bukan nss-resolvemodul plug-in ...
Piotr Dobrogost
... Dengan kata lain Anda dapat mencapai logika systemd-resolved baik melalui resolvedirektif ➟ nss- resolved modul plug-in NSS ➟ systemd-resolved atau melalui dnsdirektif ➟ nss-dns modul plug-in NSS ➟ moduled resolved 'stub DNS resolver ➟ systemd-diselesaikan
Piotr Dobrogost
@PiotrDobrogost saya pikir saya tiba di fileskemudian resolvethingy di /etc/nsswitch.confdari bagian 2 dari pertanyaan Anda. Membaca ulang, sepertinya Anda baru saja berbicara tentang mengecek cache lokal untuk IP: pemetaan nama kemudian menjangkau forwarder jika tidak ditemukan. Saya biasanya menetapkan filessumber resolusi DNS pertama untuk mem-bypass DNS agar saya dapat menguji dan tidak menekan host produksi- T
F1Linux