Bagaimana cara menghindari konflik antara dnsmasq dan systemd-diselesaikan?

57

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?

vic
sumber
4
Apakah Anda sudah mencoba menonaktifkan saja sudo systemctl disable systemd-resolved? dnsmasq jika dikonfigurasi dengan benar harus menangani resolusi domain yang saya pikir.
pbhj
1
Anda juga harus mengeluarkan sudo systemctl stop systemd-resolvedjika sedang berjalan. Gunakan sudo systemctl status systemd-resolveduntuk memeriksa
Bruce Barnett

Jawaban:

42

Pada systemd 232 (dirilis pada 2017) Anda dapat mengedit /etc/systemd/resolved.confdan menambahkan baris ini:

DNSStubListener=no

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:

systemctl --version
Malvine
sumber
2
Melakukan pergantian koneksi internet ini
Ravinder
2
@Ravinder: Ini akan menonaktifkan server DNS systemd, ya. Jika sistem Anda dikonfigurasikan untuk menggunakan server ini, maka itu akan terlihat seperti koneksi Internet berhenti bekerja (karena Anda mematikannya). Anda harus mengkonfigurasi sistem Anda untuk menggunakan server DNS lain sebagai gantinya. Biasanya orang mematikan ikatan pada port 53 karena mereka ingin menjalankan server DNS mereka sendiri di sana, jadi itu bukan masalah.
Malvineous
18

Anda dapat menonaktifkan systemd-resolvedpemuatan saat boot menggunakan sudo systemctl disable systemd-resolved.

Jika Anda ingin menjalankan keduanya bersama-sama, Anda dapat mengarahkan ulang systemd-resolveduntuk 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 baris nameserver 127.0.0.1di bagian atas /etc/resolv.conffile 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 systemdcukup baru, gunakan jawabannya oleh Malvineous . Jika versi Anda systemdterlalu lama, Anda dapat mengatasi masalah ini dengan memodifikasi unit dnsmasq: di [Unit]bagian, tambahkan Before=systemd-resolved.

Setelah ini, jika Anda suka, Anda dapat membuat terpisah /etc/dnsmasq-resolv.conffile untuk nameserver hulu dan menyebarkannya menggunakan -ratau --resolv-filepilihan, atau menambahkan nameserver hulu ke file konfigurasi dnsmasq dan menggunakan -Ratau --no-resolvpilihan. Dengan cara ini Anda hanya memiliki localhost di Anda /etc/resolv.confdan semuanya berjalan melalui dnsmasq.

Munir
sumber
2
Saya harus menghapus komentar saya sebelumnya karena saya tidak dapat lagi mengkonfirmasi bahwa ini menyelesaikan masalah. Saya memang membaca wiki sebelum bertanya di sini, dan saya sudah memiliki file resolv.conf dengan server nama localhost di bagian atas. Ini tidak membantu. Saya kemudian mengikuti instruksi Anda untuk memindahkan nameserver eksternal ke file kedua untuk dnsmasq. Setelah reboot pertama, dnsmasq dimuat terlebih dahulu sehingga masalahnya tidak muncul. Pada reboot kedua, diselesaikan dimuat terlebih dahulu sehingga dnsmasq keluar dengan kesalahan yang dijelaskan. Saya sejauh sebelumnya.
vic
6
Di unit dnsmasq, masukkan Before=systemd-resolveddi [Unit]bagian. Dengan begitu, dnsmasq akan selalu dimulai lebih dulu.
Munir
7

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:

[Unit]
After=systemd-resolved.service

[Service]
ExecStartPre=/usr/bin/systemctl stop systemd-resolved.service
ExecStartPost=/usr/bin/systemctl start systemd-resolved.service

Tampaknya ini solusi yang agak meretas tetapi berhasil.

orang aneh
sumber
2
Hei sebenarnya solusi ini cukup apik. Ini persisten bahkan setelah pembaruan paket karena itu menyimpan file unit asli. Bagus sekali. Berikut ini dinyatakan DNSStubListenerdi 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.
Jonathan Komar
Solusi ++
sjas
Saya harus mengubah / usr / bin / systemctl ke / bin / systemctl
Bruce Barnett
5

Saya baru saja mengaktifkan opsi "bind-interfaces" dengan menghapus '#' pada awal baris di /etc/dnsmasq.conf.

Saya dapat memulai dnsmasq lagi:

  • dnsmasq mengikat port DNS pada semua antarmuka (termasuk 127.0.0.1) port 53,
  • systemd-resolv terus mendengarkan pada 127.0.0. 53 : 53

Saya diarahkan ke solusi ini dengan diskusi ini diselesaikan: tambahkan opsi untuk menonaktifkan resolver stub

tomtom
sumber
Ini adalah jawaban terbaik untuk apa itu api tempat sampah. Tidak ada alasan systemd harus menempati port itu, bahkan pada loopback.
Jonathan S. Fisher
2

Jika Anda menggunakan pengaturan Ubuntu 18.04 default, ini mungkin disebabkan oleh konflik antara systemd-resolved(server DNS default) dan dnsmasq. Jika Anda menginstal dnsmasqsendiri dengan sengaja karena Anda menginginkannya secara eksplisit, maka salah satu jawaban lain untuk pertanyaan ini, menjelaskan cara menonaktifkan systemd-resolved, mungkin akan baik untuk Anda. Jika Anda tidak menginstal secara eksplisit dnsmasq, maka itu kemungkinan karena Anda menggunakan lxd. Ini mungkin karena Anda benar-benar menggunakan lxduntuk mengelola wadah, tetapi kemungkinan besar karena terkunci digunakan lxduntuk melindungi Anda ketika aplikasi diinstal. Dari sudut pandang saya, saya ingin tetap dnsmasq(karena lxdmenginginkannya) 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 lxdmasalah 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:

config:
  ipv4.address: 10.216.134.1/24
  ipv4.nat: "true"
  ipv6.address: none
  ipv6.nat: "true"
name: lxdbr0
type: bridge

Tambahkan tiga baris ke dalamnya:

config:
  ipv4.address: 10.216.134.1/24
  ipv4.nat: "true"
  ipv6.address: none
  ipv6.nat: "true"
  raw.dnsmasq: |
    auth-zone=lxd
    dns-loop-detect
name: lxdbr0
type: bridge

dan ini akan menyebabkan dnsmasq, yang dijalankan oleh lxd, untuk mendeteksi loop DNS. Ini, setidaknya bagi saya, menyelesaikan masalah dan berhenti systemd-resolveddan dnsmasqmenggunakan CPU 100%.

sil
sumber
2

Ini adalah solusi untuk (X) Ubuntu 18.04 Bionic.

Instal dnsmasq

sudo apt install dnsmasq

Nonaktifkan pendengar yang diselesaikan systemd pada port 53 (jangan menyentuh /etc/systemd/resolved.conf, karena dapat ditimpa saat upgrade):

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

dan mulai kembali

$ sudo systemctl restart systemd-resolved

(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.

$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf

Nonaktifkan overwriting dari /etc/resolv.conf oleh NM (ada juga opsi rc-manager, tetapi tidak berfungsi, meskipun dijelaskan dalam manual NM):

$ cat /etc/NetworkManager/conf.d/disableresolv.conf 
[main]
dns=none

dan mulai lagi:

$ sudo systemctl restart NetworkManager

Beri tahu dnsmasq untuk menggunakan resolv.conf dari NM:

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

dan mulai lagi:

$ sudo systemctl restart dnsmasq

Gunakan dnsmasq untuk menyelesaikan:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1
sena
sumber
1
Setelah mencoba beberapa solusi lain, milik Anda yang memecahkan masalah saya di Linux Mint 19.1. Terima kasih banyak!
Renan Lazarotto
1

Saya memecahkannya dengan cara ini:

Tambahkan atau batalkan komentar pada baris berikut di / etc / default / dnsmasq :

IGNORE_RESOLVCONF=yes

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

nameserver 5.132.191.104
nameserver 103.236.162.119

Di /etc/dnsmasq.conf tambahkan atau batalkan komentar pada baris berikut:

resolv-file=/etc/resolv.personal

Kemudian restart dnsmasq dan nonaktifkan resolver default: systemd-resolved.

sudo service dnsmasq restart

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
Daniel Pernold
sumber
1

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:

xy@zq:~$ sudo netstat -tulpn | grep 53
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      13549/systemd-resol 
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      9632/dnsmasq 

Untuk membuat systemd-diselesaikan menggunakan dnsmasq saya, saya hanya mengatur:

#/etc/systemd/resolved.conf 
[Resolve]
DNS=127.0.0.1

Di config dnsmasq saya, saya menetapkan nameserver eksternal saya:

#/etc/dnsmasq.conf
nameserver x.x.x.x
nameserver y.y.y.y

Setelah memulai kembali semuanya:

# sudo systemctl restart systemd-resolved.service
# sudo systemctl restart dnsmasq.service

systemd-diselesaikan akan menetapkan server DNS default ke dnsmasq di:

#/etc/resolv.conf
nameserver 127.0.0.1
JonnyTischbein
sumber
Baris terakhir itu mengejutkan saya, jadi saya mencarinya. Kedengarannya seperti dalam kasus Anda, /etc/resolv.confadalah 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.
sourcejedi
0

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:

[Unit]
Description=dnsmasq - A lightweight DHCP and caching DNS server
Requires=network.target
Wants=nss-lookup.target
Before=nss-lookup.target
After=network-online.target #This line changed
omegahelix
sumber
Terima kasih telah memposting pendekatan yang Anda gunakan. Perhatikan bahwa biasanya ketika Anda memesan terhadap network-online.target, Anda juga seharusnya menambahkan network-online.target ke daftar Wants=. freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi
0

Inilah yang bekerja untuk saya (setelah berjam-jam kesakitan) di Ubuntu 18.10 Cosmic Cuttlefish. Saya melakukan ini untuk mengambil keuntungan dnsmasqdari mekanisme caching yang relatif lebih kuat dan untuk menghindari kerentanan resolver NGINX . Perhatikan bahwa saya menggunakan edisi Ubuntu Server (no NetworkManager/ nmcli, just systemd-networkd) dan ini berjalan pada AWS EC2, jadi saya juga perlu menjaga DNS dan DHCP bekerja dengan domain pencarian EC2 default. Saya tidak ingin menonaktifkan systemd-resolvedsepenuhnya 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).

## Configure dnsmasq to work with systemd-resolved
# Set static hostname with hostnamectl
hostnamectl set-hostname mydomainname
# Add an entry for the hostname to /etc/hosts
tee --append /etc/hosts <<EOF
127.0.0.1 mydomainname
EOF
# Disable stub listener for resolvconf and set DNS to loopback
tee --append /etc/systemd/resolved.conf <<EOF
DNSStubListener=no
DNS=127.0.0.1
EOF
# Tell dnsmasq to ignore resolvconf
tee --append /etc/default/dnsmasq <<EOF
IGNORE_RESOLVCONF=yes
EOF
# Create dropin directory
mkdir -p /etc/systemd/system/dnsmasq.service.d
# Create systemd dropin to make sure systemd-resolved stops before dnsmasq starts
tee /etc/systemd/system/dnsmasq.service.d/resolved-fix.conf <<EOF
[Unit]
After=systemd-resolved.service
[Service]
ExecStartPre=bin/systemctl stop systemd-resolved.service
ExecStartPost=bin/systemctl start systemd-resolved.service
EOF
# Create custom resolvconf with name servers (I usec cloudflare)
tee /etc/resolv.mydomainname <<EOF
nameserver 1.1.1.1
nameserver 1.0.0.1 
nameserver [2606:4700:4700::1111] 
nameserver [2606:4700:4700::1001] 
EOF
# Configure dnsmasq
tee /etc/dnsmasq.d/mydomainname.conf <<EOF
# Region comes from:
# EC2_AVAIL_ZONE=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
# EC2_REGION=${EC2_AVAIL_ZONE%?}
domain=$EC2_REGION.compute.internal
resolv-file=/etc/resolv.mydomainname
listen-address=127.0.0.1
port=53
interface=lo
bind-dynamic
domain-needed
bogus-priv
dnssec
dns-forward-max=300
cache-size=1000
neg-ttl=3600
EOF
# Reload to pick up dropin
systemctl daemon-reload
# Stop systemd-resolved
systemctl stop systemd-resolved
# Start dnsmasq
systemctl restart dnsmasq

Verifikasi bahwa 127.0.0.1#53sedang digunakan untuk resolusi dan DNSSEC bekerja dengan sesuatu sepertidig +trace facebook.com

Justin Garrick
sumber
Apakah Anda tahu mengapa Anda masih memerlukan dropin hack unit file ini, ketika Anda telah mengatur DNSStubListener=no?
sourcejedi