จะหลีกเลี่ยงข้อขัดแย้งระหว่าง dnsmasq และ systemd-แก้ปัญหาได้อย่างไร?


57

ฉันเพิ่งติดตั้งdnsmasqเพื่อทำหน้าที่เป็นเซิร์ฟเวอร์ DNS สำหรับเครือข่ายท้องถิ่นของฉัน dnsmasq รอฟังพอร์ต 53 ซึ่งใช้งานอยู่แล้วโดยผู้ฟัง DNS stub ในระบบจากระบบที่แก้ไขแล้ว

เพียงหยุดการแก้ไข systemd แล้วรีสตาร์ทหลังจาก dnsmasq กำลังทำงานแก้ปัญหานี้ แต่กลับมาหลังจากรีบูต: systemd-modified เริ่มต้นด้วยการตั้งค่าและ dnsmasq จะไม่เริ่มทำงานเนื่องจากพอร์ต 53 ถูกใช้งานแล้ว

คำถามแรกที่เห็นได้ชัดฉันเดาว่าฉันควรทำอย่างไรให้ระบบดีที่สุดเข้าใจว่ามันไม่ควรเริ่มฟัง DNS stub ในเครื่องและทำให้พอร์ต 53 ใช้งานโดย dnsmasq

อย่างไรก็ตามคำถามที่น่าสนใจมากขึ้นก็คือวิธีการที่ทั้งสองบริการมักจะหมายถึงการทำงานร่วมกัน พวกเขาหมายถึงการทำงานเคียงข้างกันหรือไม่ได้รับการแก้ไข systemd ในทางถ้าคนใช้ dnsmasq?


4
คุณได้ลองปิดการใช้งานผ่านsudo systemctl disable systemd-resolvedหรือไม่ dnsmasq หากการกำหนดค่าอย่างถูกต้องควรจัดการความละเอียดโดเมนฉันคิดว่า
pbhj

1
คุณต้องแก้ไขsudo systemctl stop systemd-resolvedหากมีการใช้งาน ใช้ sudo systemctl status systemd-resolvedเพื่อตรวจสอบ
Bruce Barnett

คำตอบ:


42

ตั้งแต่systemd 232 (เปิดตัวในปี 2560) คุณสามารถแก้ไข/etc/systemd/resolved.confและเพิ่มบรรทัดนี้:

DNSStubListener=no

นี่จะเป็นการปิดการเชื่อมกับพอร์ต 53

ตัวเลือกที่อธิบายไว้ในรายละเอียดเพิ่มเติมในmanpage resolved.conf

คุณสามารถค้นหารุ่น systemd ที่ระบบของคุณกำลังรันด้วย:

systemctl --version

2
ทำการเปิดการเชื่อมต่ออินเทอร์เน็ตนี้
Ravinder

2
@Ravinder: มันจะปิดการใช้งานเซิร์ฟเวอร์ systemd DNS ใช่ หากระบบของคุณได้รับการกำหนดค่าให้ใช้เซิร์ฟเวอร์นี้จะมีลักษณะเหมือนการเชื่อมต่ออินเทอร์เน็ตหยุดทำงาน (เพราะคุณปิดอยู่) คุณจะต้องกำหนดค่าระบบของคุณเพื่อใช้เซิร์ฟเวอร์ DNS อื่นแทน โดยทั่วไปแล้วผู้คนจะปิดการผูกที่พอร์ต 53 เพราะพวกเขาต้องการเรียกใช้เซิร์ฟเวอร์ DNS ของตัวเองที่นั่นแทนดังนั้นจึงไม่ใช่ปัญหา
Malvineous

18

คุณสามารถปิดการใช้งานจากการโหลดที่บูตใช้systemd-resolvedsudo systemctl disable systemd-resolved

หากคุณต้องการรันทั้งสองพร้อมกันคุณสามารถเปลี่ยนเส้นทางsystemd-resolvedไปใช้ localhost เป็นเนมเซิร์ฟเวอร์หลัก สิ่งนี้จะทำให้แน่ใจว่าแบบสอบถามทั้งหมดถูกนำไปยัง dnsmasq เพื่อการแก้ไขก่อนที่จะกดเซิร์ฟเวอร์ DNS ภายนอก สามารถทำได้โดยการเพิ่มบรรทัดnameserver 127.0.0.1ที่ด้านบนของ/etc/resolv.confไฟล์ของคุณ สิ่งนี้จะปิดใช้งานการแคชในระบบของ systemd

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิกิพีเดีย Arch ลินุกซ์ ฉันคัดลอกสิ่งนี้จากที่นั่นและครอบคลุมมันค่อนข้างดี

อย่างไรก็ตามสิ่งนี้ไม่สามารถหลีกเลี่ยงข้อผิดพลาดในเวลาบูตได้อย่างน่าเชื่อถือนั่นคือ dnsmasq จะยังคงล้มเหลวหากการแก้ไขระบบเกิดขึ้นเพื่อเริ่มต้นก่อน ถ้ารุ่นของคุณsystemdเป็นของใหม่พอจะใช้คำตอบโดยMalvineous ถ้ารุ่นของคุณsystemdเก่าเกินไปคุณสามารถหลีกเลี่ยงปัญหานี้โดยการปรับเปลี่ยนหน่วย dnsmasq: ในส่วนที่เพิ่ม[Unit]Before=systemd-resolved

หลังจากนี้ถ้าคุณต้องการคุณสามารถสร้างแยก/etc/dnsmasq-resolv.confแฟ้มสำหรับเซิร์ฟเวอร์ต้นน้ำและผ่านมันไปใช้-rหรือ--resolv-fileตัวเลือกหรือเพิ่มเซิร์ฟเวอร์ต้นน้ำเพื่อแฟ้มการกำหนดค่า dnsmasq และใช้-Rหรือ--no-resolvตัวเลือก วิธีนี้คุณมี localhost ในตัวคุณ/etc/resolv.confและทุกอย่างต้องผ่าน dnsmasq


2
ฉันต้องลบความคิดเห็นก่อนหน้าของฉันเนื่องจากฉันไม่สามารถยืนยันได้ว่านี่แก้ปัญหาได้แล้ว ฉันอ่าน wiki ก่อนถามที่นี่และฉันมีไฟล์ resolv.conf กับเนมเซิร์ฟเวอร์ localhost ที่ด้านบน สิ่งนี้ไม่ได้ช่วย ฉันทำตามคำแนะนำของคุณเพื่อย้ายเนมเซิร์ฟเวอร์ภายนอกไปยังไฟล์ที่สองสำหรับ dnsmasq หลังจากรีบูตครั้งแรก dnsmasq โหลดก่อนดังนั้นจึงไม่เกิดปัญหาขึ้น ในการรีบูตครั้งที่สองให้แก้ไขโหลดก่อนเพื่อให้ dnsmasq ออกจากด้วยข้อผิดพลาดที่อธิบาย ฉันเคยเป็นมาก่อน
vic

6
ในหน่วย dnsmasq ให้ใส่ a Before=systemd-resolvedใน[Unit]ส่วน ด้วยวิธีนี้ dnsmasq จะเริ่มต้นก่อนเสมอ
มูนีร์

7

การตัดสินจาก systemd manpages มันไม่ได้ตั้งใจที่จะปิดการใช้งานเซิร์ฟเวอร์ stub DNS ด้วยตนเอง ที่น่าสนใจฉันสังเกตเห็นปัญหาที่อธิบายไว้หลังจากอัปเกรด systemd จาก 230 เป็น 231 เท่านั้น

การปิดใช้งานการแก้ไขระบบนั้นไม่มีตัวเลือกสำหรับฉันเพราะฉันต้องการให้จัดการกับเซิร์ฟเวอร์ DNS upstream ที่ได้รับผ่าน DHCP

โซลูชันของฉันทำให้ dnsmasq หยุด systemd แก้ไขก่อนที่จะเริ่มและเริ่มใหม่หลังจากนั้นอีกครั้ง

ฉันสร้างการกำหนดค่าแบบดรอปดาวน์ใน/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

นี่ดูเหมือนจะเป็นวิธีที่ค่อนข้างแฮ็ค แต่มันใช้งานได้


2
เฮ้จริง ๆ แล้ววิธีนี้มันค่อนข้างเนียน มันยังคงอยู่แม้หลังจากอัพเดตแพ็กเกจเพราะมันเก็บไฟล์หน่วยดั้งเดิม ทำได้ดีมาก ต่อไปนี้มีการระบุไว้DNSStubListenerในคู่มือที่ได้รับการแก้ไขแล้ว: "โปรดทราบว่าตัวรับฟัง DNS stub จะถูกปิดใช้งานโดยปริยายเมื่อฟังที่อยู่และพอร์ตที่ใช้งานอยู่" นั่นคือเหตุผลที่วิธีนี้ใช้ได้ผลฉันคิดว่า
Jonathan Komar

โซลูชัน A ++ !!!
sjas

ฉันต้องเปลี่ยน / usr / bin / systemctl เป็น / bin / systemctl
Bruce Barnett

5

ฉันเพิ่งเปิดใช้งานตัวเลือก "ผูกอินเทอร์เฟซ" โดยการลบ '#' ที่จุดเริ่มต้นของบรรทัดใน /etc/dnsmasq.conf

ฉันสามารถเริ่ม dnsmasq อีกครั้ง:

  • dnsmasq ผูกพอร์ต DNS บนทุกอินเตอร์เฟส (รวมถึง 127.0.0.1) พอร์ต 53,
  • systemd-resolv คอยฟังใน 127.0.0 53 : 53

ฉันชี้ไปที่โซลูชันนี้โดยการสนทนานี้ได้รับการแก้ไข: เพิ่มตัวเลือกเพื่อปิดการใช้งานตัวแก้ไข stub


นี่คือคำตอบที่ดีที่สุดสำหรับสิ่งที่ไฟไหม้ถังขยะ ไม่มีเหตุผล systemd ควรครอบครองพอร์ตนั้นแม้ในลูปแบ็ค
Jonathan S. Fisher

4

จะมีตัวเลือกในsystemdเวอร์ชัน232เพื่อปิดการใช้งานฟังต้นขั้ว ดูhttps://github.com/systemd/systemd/pull/4061


2

หากคุณกำลังใช้ตั้งค่าเริ่มต้น 18.04 Ubuntu นี้อาจจะเกิดจากความขัดแย้งระหว่างsystemd-resolved(เซิร์ฟเวอร์ DNS ที่เริ่มต้น) dnsmasqและ หากคุณติดตั้งdnsmasqด้วยตนเองโดยเจตนาเพราะคุณต้องการมันอย่างชัดเจนดังนั้นหนึ่งในคำตอบอื่น ๆ ของคำถามนี้การอธิบายวิธีการปิดการใช้งานsystemd-resolvedอาจเป็นผลดีสำหรับคุณ หากคุณไม่ได้ติดตั้งอย่างชัดเจนdnsmasqอาจเป็นเพราะคุณใช้งานlxdอยู่ อาจเป็นเพราะคุณใช้lxdเพื่อจัดการกับคอนเทนเนอร์จริง ๆแต่เป็นไปได้มากว่าเป็นเพราะ snaps ใช้lxdเพื่อปกป้องคุณเมื่อติดตั้งแอพ จากมุมมองของฉันฉันต้องการเก็บไว้dnsmasq(เพราะlxdต้องการ) แต่ฉันก็อยากจะเก็บไว้systemd-resolved เป็นเซิร์ฟเวอร์ DNS (เพราะเป็นสิ่งที่ทีม Ubuntu เลือกและฉันเชื่อมั่นพวกเขามากกว่าตัวเอง)

ดังนั้นนี่เป็นlxdปัญหาที่หัวใจ ถ้าเป็นเช่นนั้นวิธีที่ฉันแก้ไขตามที่ประกาศในรายชื่อผู้รับจดหมาย lxd-usersคือ:

$ lxc network edit lxdbr0

สิ่งนี้จะแก้ไขการกำหนดค่าของคุณในเทอร์มินัลเอดิเตอร์ มันจะมีลักษณะดังนี้:

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

เพิ่มสามบรรทัด:

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

และควรทำให้เกิดdnsmasqซึ่งจะถูกดำเนินการโดยlxdการตรวจสอบ DNS ลูป อย่างน้อยสำหรับฉันก็แก้ปัญหาและหยุดsystemd-resolvedและdnsmasqใช้ CPU 100%


2

นี่คือทางออกสำหรับ (X) Ubuntu 18.04 Bionic

ติดตั้ง dnsmasq

sudo apt install dnsmasq

ปิดการใช้ฟังตัวแก้ไข systemd ที่พอร์ต 53 (อย่าแตะ /etc/systemd/resolved.conf เนื่องจากอาจถูกเขียนทับเมื่ออัพเกรด):

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

และเริ่มต้นใหม่

$ sudo systemctl restart systemd-resolved

(หรือปิดใช้งานอย่างสมบูรณ์โดย$ sudo systemctl disable systemd-resolved.service )

ลบ /etc/resolv.conf และสร้างอีกครั้ง สิ่งนี้มีความสำคัญเนื่องจาก resolv.conf เป็นลิงก์สัญลักษณ์ไปยัง /run/systemd/resolve/stub-resolv.conf ตามค่าเริ่มต้น หากคุณจะไม่ลบลิงก์สัญลักษณ์ไฟล์จะถูกเขียนทับโดย systemd เมื่อรีบูตเครื่อง (แม้ว่าเราจะปิดการใช้งาน systemd-modified!) NetworkManager (NM) จะตรวจสอบว่าเป็นลิงก์สัญลักษณ์เพื่อตรวจสอบการกำหนดค่าที่ระบบแก้ไขหรือไม่

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

ปิดใช้งานการเขียนทับของ /etc/resolv.conf โดย NM (นอกจากนี้ยังมีตัวเลือก rc-manager แต่มันไม่ทำงานแม้ว่ามันจะอธิบายไว้ในคู่มือ NM):

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

และรีสตาร์ทมัน:

$ sudo systemctl restart NetworkManager

บอก dnsmasq ให้ใช้ resolv.conf จาก NM:

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

และรีสตาร์ทมัน:

$ sudo systemctl restart dnsmasq

ใช้ dnsmasq สำหรับการแก้ปัญหา:

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

1
หลังจากลองใช้วิธีแก้ปัญหาอื่น ๆ แล้วคุณก็เป็นคนที่แก้ปัญหาของฉันใน Linux Mint 19.1 ขอบคุณมาก!
Renan Lazarotto

1

ฉันแก้ไขมันด้วยวิธีนี้:

เพิ่มหรือยกเลิกหมายเหตุบรรทัดต่อไปนี้ใน/ etc / default / dnsmasq :

IGNORE_RESOLVCONF=yes

สร้างไฟล์ resolv ของคุณเอง (/etc/resolv.personal) เพื่อกำหนดเนมเซิร์ฟเวอร์ คุณสามารถใช้เนมเซิร์ฟเวอร์ใดก็ได้ที่นี่ ฉันได้รับสองรายการจากhttps://www.opennic.org

nameserver 5.132.191.104
nameserver 103.236.162.119

ใน/etc/dnsmasq.confเพิ่มหรือยกเลิกหมายเหตุบรรทัดต่อไปนี้:

resolv-file=/etc/resolv.personal

จากนั้นรีสตาร์ท dnsmasq และปิดการใช้งานตัวแก้ไขค่าเริ่มต้น: systemd-resolve

sudo service dnsmasq restart

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

1

ฉันไม่แน่ใจว่าทำไมบริการทั้งสองพยายามใช้ที่อยู่เดียวกัน บางทีคุณสามารถจัดเรียงพวกเขาในกรณีของฉันใน Xubuntu 18.04.1 ซึ่งการกำหนดค่าของพวกเขามีดังต่อไปนี้:

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 

ในการแก้ไข systemd โดยใช้ dnsmasq ฉันเพิ่งตั้ง:

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

ในการกำหนดค่า dnsmasq ของฉันฉันตั้งค่าเนมเซิร์ฟเวอร์ภายนอกของฉัน:

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

หลังจากรีสตาร์ททุกอย่าง:

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

แก้ไข systemd จะตั้งค่าเซิร์ฟเวอร์ DNS เริ่มต้นเป็น dnsmasq ใน:

#/etc/resolv.conf
nameserver 127.0.0.1

บรรทัดสุดท้ายนั้นทำให้ฉันประหลาดใจดังนั้นฉันจึงเงยหน้าขึ้นมอง มันเสียงเหมือนในกรณีของคุณ/etc/resolv.confเป็น symlink /run/systemd/resolve/resolv.confไป เห็นได้ชัดว่านี่เป็นหนึ่งในสี่โหมดที่แตกต่างกัน (!) ที่เป็นไปได้ที่ systemd ที่แก้ไขแล้วสามารถใช้งานได้ฉันคิดว่ามันขึ้นอยู่กับการกระจายของคุณตั้งค่าเช่นมันเป็นจริงสำหรับ Xubuntu 18.04.1 ของคุณ แต่อาจแตกต่างกัน ระบบ
sourcejedi

0

ฉันไม่สามารถรับ dnsmasq เพื่อเริ่มใช้โซลูชันที่พบทางออนไลน์เช่นการปิดการใช้งานระบบที่แก้ไขแล้วเปลี่ยน dnsmasq.conf ให้ทำ "ผูกแบบไดนามิก" แทนที่จะเป็น "ผูกอินเทอร์เฟซ" ฉันสามารถเริ่มต้นตอนบูทได้โดยให้เริ่ม dnsmasq หลังจาก network-online.service แทน 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

ขอบคุณสำหรับการโพสต์วิธีการที่คุณใช้ โปรดทราบว่าตามปกติเมื่อคุณสั่งซื้อกับ network-online.target คุณยังควรจะเพิ่ม network-online.target Wants=ไปยังรายการของ freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi

0

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน (หลังจากผ่านไปหลายชั่วโมงของความเจ็บปวด) ใน Ubuntu 18.10 Cosmic Cuttlefish ฉันทำสิ่งนี้เพื่อใช้ประโยชน์จากdnsmasqกลไกการแคชที่แข็งแกร่งกว่าและเพื่อหลีกเลี่ยงช่องโหว่ของตัวแก้ไข NGINXช่องโหว่จำแนก โปรดทราบว่าฉันกำลังใช้รุ่น Ubuntu Server (ไม่ใช่NetworkManager/ nmcliเพียงsystemd-networkd) และนี่ทำงานบน AWS EC2 ดังนั้นฉันจึงต้องการให้ DNS และ DHCP ทำงานกับโดเมนการค้นหา EC2 เริ่มต้นด้วย ฉันไม่ต้องการที่จะปิดการใช้งานsystemd-resolvedทั้งหมดเพราะฉันไม่รู้ว่าจะมีผลต่อการอัพเดตในอนาคตอย่างไร ทุกสิ่งที่นี่ถูกเรียกใช้เป็นรูท / sudo เว้นแต่จะมีการระบุไว้เป็นอย่างอื่น (เกิดขึ้นตามค่าเริ่มต้นเมื่อส่งผ่านเป็นข้อมูลผู้ใช้ 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

ยืนยันว่า 127.0.0.1#53มีการใช้สำหรับการแก้ปัญหาและ DNSSEC ทำงานกับบางอย่างเช่นdig +trace facebook.com


คุณรู้หรือไม่ว่าทำไมคุณยังต้องการแฮ็คไฟล์นี้ในกรณีที่คุณตั้งค่าไว้DNSStubListener=no?
sourcejedi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.