Dnsmasq ve systemd-resolved arasındaki çatışmaları nasıl önleyebilirim?


57

Son zamanlarda yerel ağım için DNS Sunucusu olarak çalışmak üzere dnsmasq'ı kurdum . dnsmasq, sistemd çözümlemeli yerel DNS saplayıcısı dinleyicisi tarafından zaten kullanımda olan 53 numaralı bağlantı noktasını dinler .

Dsmasq çalıştırıldıktan sonra sadece systemd-resolved komutunu durdurup ardından yeniden başlatın. Ancak yeniden başlatmanın ardından geri dönüyor: systemd-resolved tercihi ile başlıyor ve 53 numaralı bağlantı noktası zaten kullanımda olduğundan dnsmasq başlamıyor.

Sanırım ilk bariz soru, en iyi şekilde sistematik olarak yerel DNS saplama dinleyicisini başlatmaması ve böylece bağlantı noktasını dnsmasq tarafından kullanılmak üzere tutmaması gerektiğini anlatabilir miyim?

Bununla birlikte, daha ilginç bir soru, iki hizmetin genellikle birlikte nasıl çalışması gerektiğidir. Yan yana çalışacaklar mı, yoksa dnsmasq kullanıyorlarsa, sistemd çözümlenir mi?


4
Sadece devre dışı bırakmayı denedin sudo systemctl disable systemd-resolvedmi? dnsmasq düzgün yapılandırılmışsa bence etki alanı çözünürlüğünü işlemelidir.
pbhj

1
Çalışıp sudo systemctl stop systemd-resolvedçalışmadığını da sorun . sudo systemctl status systemd-resolvedKontrol etmek için kullanın
Bruce Barnett

Yanıtlar:


42

İtibariyle systemd 232 (2017 yılında yayımlanan) düzenleyebilir /etc/systemd/resolved.confve bu satırı ekleyin:

DNSStubListener=no

Bu, 53 numaralı bağlantı noktasına bağlanmayı kapatır.

Bu seçenek resolved.conf manpage sayfasında daha ayrıntılı olarak açıklanmaktadır .

Sisteminizin çalıştığı systemd sürümünü bulabilirsiniz:

systemctl --version

2
İnternet bağlantısının bu dönüşünü yapmak
Ravinder

2
@Ravinder: systemd DNS sunucusunu devre dışı bırakacaktır, evet. Sisteminiz bu sunucuyu kullanacak şekilde yapılandırılmışsa, İnternet bağlantısının çalışması durmuş gibi görünecektir (çünkü siz onu kapattınız). Sisteminizi bunun yerine başka bir DNS sunucusu kullanacak şekilde yapılandırmanız gerekir. Genelde insanlar bağlantı noktası 53'ü kapatır çünkü kendi DNS sunucularını orada çalıştırmak isterler, bu yüzden sorun olmaz.
Malvineous

18

systemd-resolvedÖnyükleme sırasında yükleme işlemini devre dışı bırakabilirsiniz sudo systemctl disable systemd-resolved.

İkisini birlikte çalıştırmak istiyorsanız systemd-resolved, yerel ana bilgisayarı birincil ad sunucusu olarak kullanmak üzere yönlendirebilirsiniz . Bu, harici DNS sunucusuna dokunmadan önce tüm sorguların çözüm için dnsmasq'a yönlendirilmesini sağlar. Bu, dosyanın nameserver 127.0.0.1üstüne bir satır ekleyerek yapılabilir /etc/resolv.conf. Bu aynı zamanda sistemin yerel önbelleğini de devre dışı bırakacaktır.

Arch Linux wiki'de daha fazlasını okuyabilirsiniz . Bunu oradan kopyaladım ve oldukça iyi örttü.

Bununla birlikte, bu önyükleme sırasındaki hatayı güvenilir bir şekilde önlemez, yani sistem çözülürse ilk önce başlanırsa dnsmasq yine başarısız olur. Sürümünüz systemdyeterince yeni ise, cevabı Malvineous tarafından kullanın . Sürümünüz systemdçok eskiyse, dnsmasq birimini değiştirerek bu soruna geçici bir çözüm bulabilirsiniz: [Unit]bölümde, ekleyin Before=systemd-resolved.

Bundan sonra, isterseniz, giriş /etc/dnsmasq-resolv.confyönündeki ad sunucuları için ayrı bir dosya oluşturabilir -rveya veya --resolv-fileseçeneğini kullanarak iletebilir veya giriş yönündeki ad sunucularını dnsmasq yapılandırma dosyasına ekleyebilir -Rveya kullanabilirsiniz --no-resolv. Bu şekilde sadece yerel ana makinenizde bulunur /etc/resolv.confve her şey dnsmasq içinden geçer.


2
Bu sorunu çözdüğümü onaylayamadığım için önceki yorumumu kaldırmak zorunda kaldım. Buraya sormadan önce wikiyi okudum ve en üstte localhost ad sunucusuyla bir resolv.conf dosyası vardı. Bu yardımcı olmadı. Sonra dış ad sunucularını dnsmasq için ikinci bir dosyaya taşımak için talimatlarınızı takip ettim. İlk yeniden başlatmadan sonra, dnsmasq ilk olarak yüklenmiştir, böylece sorun ortaya çıkmamıştır. İkinci yeniden başlatmada, önce yüklenen çözüldü, böylece dnsmasq açıklanan hatayla çıktı. Ben eskisi kadar uzaktayım.
vic,

6
Dnsmasq biriminde, bir koyun Before=systemd-resolvediçinde [Unit]bölüm. Bu şekilde, dnsmasq her zaman önce başlayacaktır.
Munir,

7

Sistemin man sayfalarına bakılırsa, taslak DNS sunucusunu manuel olarak devre dışı bırakma amacı gütmez. İlginçtir ki, anlatılan sorunu sadece systemd'i 230'dan 231'e yükselttikten sonra fark ettim.

Systemd-resolved'i devre dışı bırakmak benim için bir seçenek değildi, çünkü DHMS üzerinden alınan upstream DNS sunucularını işlemesine ihtiyacım vardı.

Benim çözümüm, başlamadan ve tekrar başlatmadan önce dnsmasq stop systemd-çözüldü.

Bir drop-in config yaptım /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

Bu oldukça kaba bir çözüm gibi görünüyor ama işe yarıyor.


2
Hey aslında bu çözüm oldukça kaygan. Orijinal birim dosyasını sakladığından, paket güncellemelerinden sonra bile kalıcıdır. Güzel bitti. DNSStubListenerÇözünürlük.conf kılavuzunda aşağıdakiler belirtilmiştir : "DNS saplama dinleyicisinin, dinleme adresi ve bağlantı noktası zaten kullanımdayken, dolaylı olarak kapatıldığını unutmayın." Bence bu yöntem iyi çalışıyor bence.
Jonathan Komar

A ++ çözümü !!!
sjas

/ Usr / bin / systemctl 'i / bin / systemctl' e değiştirmek zorunda kaldım
Bruce Barnett

5

Ben sadece /etc/dnsmasq.conf içindeki satırın başındaki '#' işaretini kaldırarak "bind-interface" seçeneğini etkinleştirdim.

Dnsmasq’a tekrar başladım:

  • dnsmasq, tüm arayüzlerde DNS portunu bağlar (127.0.0.1 dahil) port 53,
  • systemd-resolv, 127.0.0'da dinlemeye devam ediyor. 53 : 53

Bu çözüme bu çözüme ulaşıldığına dikkat çekildi: çözüldü: saplama çözücüsünü devre dışı bırakmak için bir seçenek ekle


Bir çöp tenekesi yangını için en iyi cevap budur. Sistemin, geridönüşümde bile bu bağlantı noktasını işgal etmesinin bir nedeni yoktur.
Jonathan S. Fisher


2

Bir varsayılan Ubuntu 18.04 kurulumu kullanıyorsanız, bu olabilir bir arasındaki çatışma kaynaklanabilir systemd-resolved(varsayılan DNS sunucusu) ve dnsmasq. dnsmasqAçıkça istemiş olduğunuz için kendinizi kasten kurduysanız , bu sorunun diğer cevaplarından biri, nasıl devre dışı systemd-resolvedbırakılacağını açıklayan , muhtemelen sizin için iyi olacaktır. Eğer varsa vermedi açıkça yüklemek dnsmasq, o zaman kullandığınız çünkü yerinde muhtemeldir lxd. Bunun nedeni lxdkapsayıcıları gerçekten kullanıyor olmanız olabilir , ancak lxduygulamaların yüklendiğinde sizi korumak için anlık bağlantıların kullanılmasından kaynaklanıyor olabilir. Benim bakış açıma göre tutmak istiyorum dnsmasq(çünkü lxdistiyor) ama bende tutmak istiyorumsystemd-resolved DNS sunucusu olarak (Ubuntu ekibinin seçtiği ve onlara kendimden daha fazla güvendiğim için).

Yani, bu lxdkalbinde bir sorun gibi görünüyor . Öyleyse, bir lxd kullanıcılarının posta listesi gönderisine göre düzelttiğim yol şudur:

$ lxc network edit lxdbr0

Bu, konfigürasyonunuzu bir terminal editöründe düzenleyecektir. Bu gibi bir şey görünecek:

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

Buna üç satır ekle:

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

ve bu , DNS döngülerini algılamak dnsmasqiçin çalıştırılmaya neden olmalıdır lxd. Bu, en azından benim için, sorunu çözdü systemd-resolvedve dnsmasq% 100 CPU kullanarak durdu .


2

(X) Ubuntu 18.04 Biyonik için çözüm.

Dnsmasq yükleyin

sudo apt install dnsmasq

53 numaralı bağlantı noktasındaki sistem çözülmüş dinleyiciyi devre dışı bırakın (yükseltme sırasında üzerine yazılabileceğinden /etc/systemd/resolved.conf adresine dokunmayın):

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

ve yeniden başlat

$ sudo systemctl restart systemd-resolved

(alternatif olarak tamamen devre dışı bırakın $ sudo systemctl disable systemd-resolved.service )

/Etc/resolv.conf dosyasını silin ve tekrar oluşturun. Bu önemlidir, çünkü resolv.conf varsayılan olarak /run/systemd/resolve/stub-resolv.conf ile sembolik bir bağlantıdır. Sembolik bağlantıyı silmeyecek olursanız, yeniden başlatma sırasında dosyanın üzerine systemd yazılır (biz systemd-çözüldü! Ayrıca NetworkManager (NM), sistemin çözümlediği konfigürasyonu tespit etmek için sembolik bir bağlantı olup olmadığını kontrol eder.

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

/Etc/resolv.conf dosyasının üzerine NM'nin üzerine yazmayı devre dışı bırakın (ayrıca bir seçenek rc yöneticisi de vardır, ancak NM kılavuzunda açıklandığı halde çalışmaz):

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

ve yeniden başlatın:

$ sudo systemctl restart NetworkManager

Dnsmasq'a NM'den resolv.conf kullanmasını söyleyin:

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

ve yeniden başlatın:

$ sudo systemctl restart dnsmasq

Çözmek için dnsmasq kullanın:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1

1
Birkaç başka çözüm denedikten sonra, sizinkini Linux Mint 19.1'deki sorunumu çözen sendin. Çok teşekkürler!
Renan Lazarotto

1

Bunu bu şekilde çözdüm:

/ Etc / default / dnsmasq dizinine şu satırı ekleyin veya ekleyin :

IGNORE_RESOLVCONF=yes

Ad sunucularını tanımlamak için kendi resolv dosyanızı (/etc/resolv.personal) oluşturun. Burada herhangi bir ad sunucusunu kullanabilirsiniz. Https://www.opennic.org adresinden iki tane aldım

nameserver 5.132.191.104
nameserver 103.236.162.119

Gelen /etc/dnsmasq.conf eklemek veya aşağıdaki satırı kaldırın:

resolv-file=/etc/resolv.personal

Ardından dnsmasq'ı yeniden başlatın ve varsayılan çözümleyiciyi devre dışı bırakın: systemd-resolved.

sudo service dnsmasq restart

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

1

Her iki hizmetin de aynı adresi kullanmaya çalıştığından emin değilim. Belki bunları benim durumumda olduğu gibi Xubuntu 18.04.1'deki gibi düzenleyebilirsiniz, burada konfigürasyonları aşağıdaki gibidir:

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 

Benim dnsmasq kullanarak sistemd-çözümlenmiş yapmak için sadece ayarladım:

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

Dnsmasq config programında harici isim sunucularını belirledim:

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

Her şeyi yeniden başlattıktan sonra:

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

systemd-resolved: varsayılan DNS sunucusunu dnsmasq olarak ayarlayacaktır:

#/etc/resolv.conf
nameserver 127.0.0.1

Bu son çizgi beni şaşırttı, ben de araştırdım. Sizin durumunuzda gibi görünüyor /etc/resolv.conf, bir bağlantı /run/systemd/resolve/resolv.conf. Görünüşe göre bu sistemde çözülebilen dört (!) Olası farklı moddan biri olabilir. Sanırım dağıtımınızın nasıl kurulduğuna bağlı, yani Xubuntu 18.04.1 için doğru olabilir, ancak diğerlerinden farklı olabilir sistemleri.
kaynakjedi

0

Çevrimiçi bulunan çözümleri kullanmaya başlayabilmek için dnsmasq'ı alamadım, yani sistemin devre dışı bırakılmasını engelledim, dnsmasq.conf'u "arayüzleri bağlamak" yerine "dinamik bağlama" yapmak için değiştirdim. Dnsmasq'ı başlatarak önyüklemede başlatmayı başarabildim. Network.service yerine network-online.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

Kullanmakta olduğunuz yaklaşımı yayınladığınız için teşekkür ederiz. Normal olarak network-online.target'a karşı sipariş verirken, listeye network-online.target eklemeniz gerektiğini de unutmayın Wants=. freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi

0

İşte benim için işe yarayan şey (saatler süren acıdan sonra) Ubuntu 18.10 Kozmik Mürekkepbalığı. Bunu dnsmasqnispeten daha güçlü önbellekleme mekanizmasından yararlanmak ve NGINX çözümleyici güvenlik açıklarından kaçınmak için yaptım . Ubuntu Sunucu sürümünü kullanıyorum ( sadece NetworkManager/ / nmclisadece değil systemd-networkd) ve bunun AWS EC2'de çalıştığını ve DNS ve DHCP'nin varsayılan EC2 arama alanıyla çalışmasını sağlamak için gerekli olduğunu unutmayın. systemd-resolvedTamamen devre dışı bırakmak istemedim çünkü gelecekteki güncellemeleri nasıl etkileyebileceği hakkında hiçbir fikrim yok. Buradaki her şey, aksi belirtilmediği sürece root / sudo olarak çalıştırılır (bu, EC2 Kullanıcı Verileri olarak iletildiğinde varsayılan olarak gerçekleşir).

## 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

127.0.0.1#53Çözünürlük için kullanıldığını ve DNSSEC’nin böyle bir şeyle çalıştığını doğrulayın.dig +trace facebook.com


Ayarladığınızda, neden bu birim dosya indirme kesmesine ihtiyaç duyduğunuzu biliyor musunuz DNSStubListener=no?
kaynakjedi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.