Saya baru-baru ini menginstal dnsmasq untuk bertindak sebagai Server DNS untuk jaringan lokal saya. dnsmasq mendengarkan pada port 53 yang sudah digunakan oleh pendengar rintisan DNS lokal dari systemd-diselesaikan .
Hanya menghentikan systemd-diselesaikan dan kemudian restart setelah dnsmasq berjalan menyelesaikan masalah ini. Tapi itu kembali setelah reboot: systemd-diselesaikan dimulai dengan preferensi dan dnsmasq tidak akan mulai karena port 53 sudah digunakan.
Pertanyaan pertama yang jelas, saya kira, adalah bagaimana cara terbaik membuat systemd-diselesaikan memahami bahwa seharusnya tidak memulai pendengar rintisan DNS lokal dan dengan demikian menjaga port 53 untuk digunakan oleh dnsmasq?
Namun, pertanyaan yang lebih menarik adalah bagaimana kedua layanan tersebut pada umumnya dimaksudkan untuk bekerja sama. Apakah mereka bahkan dimaksudkan untuk bekerja berdampingan atau apakah sistemd diselesaikan hanya jika seseorang menggunakan dnsmasq?
sudo systemctl disable systemd-resolved
? dnsmasq jika dikonfigurasi dengan benar harus menangani resolusi domain yang saya pikir.sudo systemctl stop systemd-resolved
jika sedang berjalan. Gunakansudo systemctl status systemd-resolved
untuk memeriksaJawaban:
Pada systemd 232 (dirilis pada 2017) Anda dapat mengedit
/etc/systemd/resolved.conf
dan menambahkan baris ini:Ini akan mematikan ikatan ke port 53.
Opsi ini dijelaskan secara lebih rinci di halaman resolved.conf .
Anda dapat menemukan versi systemd yang dijalankan oleh sistem Anda:
sumber
Anda dapat menonaktifkan
systemd-resolved
pemuatan saat boot menggunakansudo systemctl disable systemd-resolved
.Jika Anda ingin menjalankan keduanya bersama-sama, Anda dapat mengarahkan ulang
systemd-resolved
untuk menggunakan localhost sebagai server nameserver utama. Ini akan memastikan bahwa semua permintaan diarahkan ke dnsmasq untuk resolusi sebelum mengenai server DNS eksternal. Ini dapat dilakukan dengan menambahkan barisnameserver 127.0.0.1
di bagian atas/etc/resolv.conf
file Anda . Ini juga akan menonaktifkan caching lokal systemd.Anda dapat membaca lebih lanjut di wiki Arch Linux . Saya menyalin ini dari sana dan itu mencakup dengan cukup baik.
Namun ini tidak secara andal menghindari kesalahan pada saat boot, yaitu dnsmasq masih akan gagal jika systemd-diselesaikan terjadi untuk memulai lebih dulu. Jika versi Anda
systemd
cukup baru, gunakan jawabannya oleh Malvineous . Jika versi Andasystemd
terlalu lama, Anda dapat mengatasi masalah ini dengan memodifikasi unit dnsmasq: di[Unit]
bagian, tambahkanBefore=systemd-resolved
.Setelah ini, jika Anda suka, Anda dapat membuat terpisah
/etc/dnsmasq-resolv.conf
file untuk nameserver hulu dan menyebarkannya menggunakan-r
atau--resolv-file
pilihan, atau menambahkan nameserver hulu ke file konfigurasi dnsmasq dan menggunakan-R
atau--no-resolv
pilihan. Dengan cara ini Anda hanya memiliki localhost di Anda/etc/resolv.conf
dan semuanya berjalan melalui dnsmasq.sumber
Before=systemd-resolved
di[Unit]
bagian. Dengan begitu, dnsmasq akan selalu dimulai lebih dulu.Dilihat dari halaman manual systemd itu tidak dimaksudkan untuk dapat secara manual menonaktifkan server DNS stub. Menariknya saya hanya memperhatikan masalah yang dijelaskan setelah memutakhirkan systemd dari 230 ke 231.
Menonaktifkan systemd-diselesaikan tidak ada pilihan bagi saya karena saya membutuhkannya untuk menangani server DNS upstream yang diterima melalui DHCP.
Solusi saya adalah membuat dnsmasq berhenti systemd-diselesaikan sebelum memulai dan memulainya lagi.
Saya membuat konfigurasi drop-in di
/etc/systemd/system/dnsmasq.service.d/resolved-fix.conf
:Tampaknya ini solusi yang agak meretas tetapi berhasil.
sumber
DNSStubListener
di bawah di manual resolved.conf: "Perhatikan bahwa pendengar rintisan DNS dimatikan secara implisit ketika alamat dan port pendengarannya sudah digunakan." Itulah mengapa metode ini berfungsi dengan baik menurut saya.Saya baru saja mengaktifkan opsi "bind-interfaces" dengan menghapus '#' pada awal baris di /etc/dnsmasq.conf.
Saya dapat memulai dnsmasq lagi:
Saya diarahkan ke solusi ini dengan diskusi ini diselesaikan: tambahkan opsi untuk menonaktifkan resolver stub
sumber
Akan ada opsi dalam
systemd
versi232
untuk menonaktifkan pendengar rintisan. Lihat https://github.com/systemd/systemd/pull/4061 .sumber
Jika Anda menggunakan pengaturan Ubuntu 18.04 default, ini mungkin disebabkan oleh konflik antara
systemd-resolved
(server DNS default) dandnsmasq
. Jika Anda menginstaldnsmasq
sendiri dengan sengaja karena Anda menginginkannya secara eksplisit, maka salah satu jawaban lain untuk pertanyaan ini, menjelaskan cara menonaktifkansystemd-resolved
, mungkin akan baik untuk Anda. Jika Anda tidak menginstal secara eksplisitdnsmasq
, maka itu kemungkinan karena Anda menggunakanlxd
. Ini mungkin karena Anda benar-benar menggunakanlxd
untuk mengelola wadah, tetapi kemungkinan besar karena terkunci digunakanlxd
untuk melindungi Anda ketika aplikasi diinstal. Dari sudut pandang saya, saya ingin tetapdnsmasq
(karenalxd
menginginkannya) tetapi saya juga ingin tetapsystemd-resolved
sebagai server DNS (karena itulah yang dipilih oleh tim Ubuntu dan saya lebih memercayai mereka daripada diri saya sendiri).Jadi, ini tampaknya menjadi
lxd
masalah di hati. Jika demikian, cara saya memperbaikinya, sesuai dengan posting milis lxd-pengguna , adalah ini:$ lxc network edit lxdbr0
Ini akan mengedit konfigurasi Anda dalam editor terminal. Akan terlihat seperti ini:
Tambahkan tiga baris ke dalamnya:
dan ini akan menyebabkan
dnsmasq
, yang dijalankan olehlxd
, untuk mendeteksi loop DNS. Ini, setidaknya bagi saya, menyelesaikan masalah dan berhentisystemd-resolved
dandnsmasq
menggunakan CPU 100%.sumber
Ini adalah solusi untuk (X) Ubuntu 18.04 Bionic.
Instal dnsmasq
Nonaktifkan pendengar yang diselesaikan systemd pada port 53 (jangan menyentuh /etc/systemd/resolved.conf, karena dapat ditimpa saat upgrade):
dan mulai kembali
(Atau nonaktifkan sepenuhnya dengan
$ sudo systemctl disable systemd-resolved.service
)Hapus /etc/resolv.conf dan buat kembali. Ini penting, karena resolv.conf adalah tautan simbolis ke /run/systemd/resolve/stub-resolv.conf secara default. Jika Anda tidak akan menghapus tautan simbolis, file akan ditimpa oleh systemd saat reboot (walaupun kami menonaktifkan systemd-resolved!). NetworkManager (NM) juga memeriksa apakah itu adalah tautan simbolis untuk mendeteksi konfigurasi yang diselesaikan sistem.
Nonaktifkan overwriting dari /etc/resolv.conf oleh NM (ada juga opsi rc-manager, tetapi tidak berfungsi, meskipun dijelaskan dalam manual NM):
dan mulai lagi:
Beri tahu dnsmasq untuk menggunakan resolv.conf dari NM:
dan mulai lagi:
Gunakan dnsmasq untuk menyelesaikan:
sumber
Saya memecahkannya dengan cara ini:
Tambahkan atau batalkan komentar pada baris berikut di / etc / default / dnsmasq :
Buat file resolv Anda sendiri (/etc/resolv.personal) untuk mendefinisikan nameserver. Anda dapat menggunakan server nama apa pun di sini. Saya mengambil dua dari https://www.opennic.org
Di /etc/dnsmasq.conf tambahkan atau batalkan komentar pada baris berikut:
Kemudian restart dnsmasq dan nonaktifkan resolver default: systemd-resolved.
sumber
Saya tidak yakin mengapa kedua layanan mencoba menggunakan alamat yang sama. Mungkin Anda dapat mengaturnya seperti dalam kasus saya di Xubuntu 18.04.1, di mana konfigurasinya adalah sebagai berikut:
Untuk membuat systemd-diselesaikan menggunakan dnsmasq saya, saya hanya mengatur:
Di config dnsmasq saya, saya menetapkan nameserver eksternal saya:
Setelah memulai kembali semuanya:
systemd-diselesaikan akan menetapkan server DNS default ke dnsmasq di:
sumber
/etc/resolv.conf
adalah symlink ke/run/systemd/resolve/resolv.conf
. Rupanya ini adalah salah satu dari empat (!) Kemungkinan mode berbeda yang dapat diselesaikan oleh systemd. Saya kira itu tergantung bagaimana distribusi Anda mengaturnya, yaitu benar untuk Xubuntu 18.04.1 Anda, tetapi mungkin berbeda pada yang lain sistem.Saya tidak dapat membuat dnsmasq untuk mulai menggunakan solusi yang ditemukan online, yaitu menonaktifkan systemd-resolved, mengubah dnsmasq.conf untuk melakukan "bind dynamic", bukannya "bind interfaces". Saya bisa memulainya saat boot dengan meminta dnsmasq memulai Setelah network-online.service daripada network.service:
sumber
Wants=
. freedesktop.org/wiki/Software/systemd/NetworkTargetInilah yang bekerja untuk saya (setelah berjam-jam kesakitan) di Ubuntu 18.10 Cosmic Cuttlefish. Saya melakukan ini untuk mengambil keuntungan
dnsmasq
dari mekanisme caching yang relatif lebih kuat dan untuk menghindari kerentanan resolver NGINX . Perhatikan bahwa saya menggunakan edisi Ubuntu Server (noNetworkManager
/nmcli
, justsystemd-networkd
) dan ini berjalan pada AWS EC2, jadi saya juga perlu menjaga DNS dan DHCP bekerja dengan domain pencarian EC2 default. Saya tidak ingin menonaktifkansystemd-resolved
sepenuhnya karena saya tidak tahu bagaimana itu dapat mempengaruhi pembaruan di masa depan. Semuanya di sini dijalankan sebagai root / sudo kecuali dinyatakan sebaliknya (ini terjadi secara default ketika dilewatkan sebagai Data Pengguna EC2).Verifikasi bahwa
127.0.0.1#53
sedang digunakan untuk resolusi dan DNSSEC bekerja dengan sesuatu sepertidig +trace facebook.com
sumber
DNSStubListener=no
?