Dnsmasq और systemd- हल के बीच संघर्ष से कैसे बचें?


56

मैंने हाल ही में अपने स्थानीय नेटवर्क के लिए DNS सर्वर के रूप में कार्य करने के लिए dnsmasq स्थापित किया है । dnsmasq पोर्ट 53 पर सुनता है जो पहले से ही स्थानीय DNS ठूंठ श्रोता द्वारा सिस्टमड-हल किए गए उपयोग में है

बस सिस्टमडब्लड-सॉल्व्ड को रोकना और फिर dnsmasq चलाने के बाद इसे पुनः आरंभ करना इस समस्या को हल करता है। लेकिन यह एक रिबूट के बाद लौटता है: सिस्टमड-सॉल्यूड को प्राथमिकता के साथ शुरू किया गया है और डेन्मसामक शुरू नहीं होगा क्योंकि पोर्ट 53 पहले से ही उपयोग में है।

पहला स्पष्ट प्रश्न, मुझे लगता है, मैं कैसे सबसे अच्छा सिस्टमड-सॉल्यूशन को समझ सकता हूं कि यह स्थानीय डीएनएस स्टब श्रोता को शुरू नहीं करना चाहिए और इस तरह dnsmasq द्वारा उपयोग के लिए पोर्ट 53 रखना चाहिए?

एक और दिलचस्प सवाल है, हालांकि, यह है कि दो सेवाओं को आम तौर पर एक साथ काम करने के लिए कैसे किया जाता है। क्या वे भी कंधे से कंधा मिलाकर काम करने के लिए हैं या सिस्टमैड-सॉल्यूशन सिर्फ उसी तरह से हैं जैसे कि अगर किसी ने डम्मसैक का इस्तेमाल किया है?


4
क्या आपने बस के माध्यम से अक्षम करने की कोशिश की है sudo systemctl disable systemd-resolved? dnsmasq यदि ठीक से कॉन्फ़िगर किया गया है तो मुझे लगता है कि डोमेन रिज़ॉल्यूशन को संभालना चाहिए।
pbhj

1
sudo systemctl stop systemd-resolvedअगर चल रहा है तो आपको भी जारी करना होगा। sudo systemctl status systemd-resolvedजांच के लिए उपयोग करें
ब्रूस बार्नेट

जवाबों:


41

के रूप में systemd 232 (2017 में जारी) आप संपादित कर सकते /etc/systemd/resolved.confहैं और इस पंक्ति जोड़ें:

DNSStubListener=no

यह बाध्यकारी पोर्ट 53 पर स्विच करेगा।

विकल्प को अधिक विवरण में हल किया गया हैहल मैनपेज

आप पा सकते हैं systemd संस्करण आपके सिस्टम के साथ चल रहा है:

systemctl --version

2
इंटरनेट कनेक्शन के इस मोड़ को करते हुए
रविंदर

2
@ रविंदर: यह सिस्टमड डीएनएस सर्वर को निष्क्रिय कर देगा, हां। यदि आपका सिस्टम इस सर्वर का उपयोग करने के लिए कॉन्फ़िगर किया गया है तो ऐसा लगेगा कि इंटरनेट कनेक्शन काम करना बंद कर देता है (क्योंकि आपने इसे बंद कर दिया था)। आपको इसके बजाय किसी अन्य DNS सर्वर का उपयोग करने के लिए अपने सिस्टम को कॉन्फ़िगर करने की आवश्यकता होगी। आमतौर पर लोग पोर्ट 53 पर बाइंडिंग बंद कर देते हैं क्योंकि वे इसके बजाय अपना DNS सर्वर चलाना चाहते हैं, इसलिए यह कोई समस्या नहीं है।
माल्विनस

18

आप systemd-resolvedबूट का उपयोग करके लोड करने से अक्षम कर सकते हैं sudo systemctl disable systemd-resolved

यदि आप दोनों को एक साथ चलाना चाहते हैं, तो आप systemd-resolvedप्राथमिक नाम के रूप में स्थानीयहोस्ट का उपयोग करने के लिए पुनर्निर्देशित कर सकते हैं । यह सुनिश्चित करेगा कि सभी प्रश्नों को बाहरी DNS सर्वर से टकराने से पहले समाधान के लिए dnsmasq को निर्देशित किया जाए। यह nameserver 127.0.0.1आपकी /etc/resolv.confफ़ाइल के शीर्ष पर लाइन जोड़कर किया जा सकता है । यह सिस्टमैड की स्थानीय कैशिंग को भी अक्षम कर देगा।

आप आर्क लिनक्स विकी पर अधिक पढ़ सकते हैं । मैंने इसे वहां से कॉपी किया और इसे काफी अच्छी तरह से कवर किया।

हालाँकि, यह बूट समय पर त्रुटि से नहीं बचता है, अर्थात अगर सिस्टमड-सॉल्यूशन पहले शुरू होता है तो dnsmasq अभी भी विफल रहेगा। यदि आपका संस्करण systemdकाफी नया है, तो Malvineous द्वारा उत्तर का उपयोग करें । यदि आपका संस्करण systemdबहुत पुराना है, तो आप dnsmasq यूनिट को संशोधित करके इस समस्या को हल कर सकते हैं: [Unit]अनुभाग में, जोड़ें Before=systemd-resolved

इसके बाद, यदि आप चाहें, तो आप /etc/dnsmasq-resolv.confअपस्ट्रीम नेमसर्वर के लिए एक अलग फाइल बना सकते हैं -rया इसे या --resolv-fileऑप्शन का उपयोग करके पास कर सकते हैं या फिर अपस्ट्रीम नेमसर्वर को dnsmasq कॉन्फ़िगरेशन फाइल में जोड़ सकते हैं -Rया --no-resolvऑप्शन का उपयोग कर सकते हैं । इस तरह से आपके पास केवल लोकलहोस्ट है /etc/resolv.confऔर सब कुछ dnsmasq से होकर गुजरता है।


2
मुझे अपनी पिछली टिप्पणी को हटाना पड़ा क्योंकि मैं अब इस बात की पुष्टि नहीं कर सकता कि इससे समस्या हल हो गई। मैंने यहाँ पूछने से पहले विकि को पढ़ा था, और मेरे पास पहले से ही लोकलहोस्ट नेमसेवर के साथ एक resolv.conf फ़ाइल थी। यह मदद नहीं की। मैंने तब आपके नामों का अनुसरण करने के लिए बाहरी नेमसर्वर को dnsmasq की दूसरी फ़ाइल में ले जाने के लिए कहा था। पहली रिबूट के बाद, dnsmasq ने पहले लोड किया ताकि समस्या उत्पन्न न हो। दूसरे रिबूट पर, पहले से लोड किए गए समाधान को हल किया गया ताकि वर्णित त्रुटि के साथ बाहर निकले। मैं पहले जैसा ही हूं।
vic

6
Dnsmasq यूनिट Before=systemd-resolvedमें, [Unit]सेक्शन में डालें । इस तरह, dnsmasq हमेशा पहले शुरू होगा।
मुनिर

7

सिस्टमड मैनपेज को देखते हुए यह स्टब डीएनएस सर्वर को मैन्युअल रूप से अक्षम करने में सक्षम नहीं है। दिलचस्प है कि मैंने केवल सिस्टम को अपग्रेड करने के बाद 230 से 231 तक वर्णित समस्या पर ध्यान दिया।

Systemd-solve को अक्षम करना मेरे लिए कोई विकल्प नहीं था क्योंकि मुझे DHCP के माध्यम से प्राप्त अपस्ट्रीम DNS सर्वर को संभालने की आवश्यकता है।

मेरा समाधान शुरू होने से पहले और बाद में इसे फिर से शुरू करने से पहले dnsmasq stop systemd-resolution बना रहा था।

मैंने एक ड्रॉप-इन कॉन्फ़िगरेशन बनाया /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 स्टब श्रोता को तब बंद कर दिया जाता है जब उसका सुनने का पता और पोर्ट पहले से ही उपयोग में हो।" यही कारण है कि इस विधि ठीक काम करता है मुझे लगता है।
जोनाथन कोमर

ए ++ समाधान !!!
sjas

मुझे / usr / bin / systemctl को / bin / systemctl में बदलना होगा
Bruce Barnett

5

मैंने /etc/dnsmasq.conf में लाइन की शुरुआत में '#' को हटाकर "बाइंड-इंटरफेस" विकल्प को सक्षम किया।

मैं फिर से dnsmasq शुरू करने में सक्षम था:

  • dnsmasq सभी इंटरफेस (127.0.0.1 सहित) पोर्ट 53 पर DNS पोर्ट को बांधता है,
  • systemd-resolv 127.0.0 पर सुनता रहता है। 53 : 53

मुझे इस चर्चा को इस समाधान द्वारा इंगित किया गया था : स्टब रिज़ॉल्वर को अक्षम करने के लिए एक विकल्प जोड़ें


यह एक डंपस्टर आग क्या है के लिए सबसे अच्छा जवाब है। कोई कारण नहीं है कि सिस्टम लूपबैक पर भी उस पोर्ट पर कब्जा कर ले।
जोनाथन एस। फिशर


2

यदि आप एक डिफ़ॉल्ट उबंटू 18.04 सेटअप का उपयोग कर रहे हैं, तो यह (डिफ़ॉल्ट डीएनएस सर्वर) और के बीच संघर्ष के कारण हो सकता है । यदि आपने खुद को जानबूझकर स्थापित किया है क्योंकि आप स्पष्ट रूप से यह चाहते थे, तो इस प्रश्न के अन्य उत्तरों में से एक, यह समझाते हुए कि कैसे निष्क्रिय करना है , शायद आपके लिए अच्छा होगा। यदि आपने स्पष्ट रूप से स्थापित नहीं किया है , तो इसकी संभावना है क्योंकि आप उपयोग कर रहे हैं । यह इसलिए हो सकता है क्योंकि आप वास्तव में कंटेनरों का प्रबंधन करने के लिए उपयोग करते हैं , लेकिन यह सबसे अधिक होने की संभावना है क्योंकि ऐप इंस्टॉल होने पर स्नैप्स आपकी रक्षा करने के लिए उपयोग करते हैं। अपने दृष्टिकोण से, मैं रखना चाहता हूं (क्योंकि चाहता है) लेकिन मैं भी रखना चाहता हूंsystemd-resolveddnsmasqdnsmasqsystemd-resolveddnsmasqlxdlxdlxddnsmasqlxdsystemd-resolved DNS सर्वर के रूप में (क्योंकि यह उबंटू टीम ने चुना है और मुझे उन पर खुद से ज्यादा भरोसा है)।

तो, यह 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है। यह, कम से कम मेरे लिए, समस्या को हल किया systemd-resolvedऔर dnsmasq100% सीपीयू का उपयोग करना बंद कर दिया ।


2

यहाँ (X) Ubuntu 18.04 बायोनिक के लिए समाधान है।

Dnsmasq स्थापित करें

sudo apt install dnsmasq

पोर्ट 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 का एक प्रतीकात्मक लिंक है। यदि आप प्रतीकात्मक लिंक को नहीं हटाएंगे, तो सिस्टम रिबूट पर सिस्टमड द्वारा अधिलेखित हो जाएगा (भले ही हमने अक्षम-हल किया गया हो!)। साथ ही NetworkManager (NM) यह जाँचता है कि यह सिस्टमड-सॉल्यूस्ड कॉन्फ़िगरेशन का पता लगाने के लिए एक प्रतीकात्मक लिंक है या नहीं।

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

NM द्वारा /etc/resolv.conf की ओवर राइटिंग अक्षम करें (एक विकल्प rc-manager भी है, लेकिन यह काम नहीं करता है, इसके बावजूद NM मैनुअल में वर्णित है):

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

और इसे पुनः आरंभ करें:

$ sudo systemctl restart NetworkManager

NM से resolv.conf का उपयोग करने के लिए dnsmasq बताएं:

$ 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
कुछ अन्य समाधानों की कोशिश करने के बाद, आपका वह था जिसने लिनक्स टकसाल 19.1 पर मेरी समस्या को हल किया। आपका बहुत बहुत धन्यवाद!
रेनन लजारोटो

1

मैंने इसे इस तरह हल किया:

निम्नलिखित लाइन को / etc / default / dnsmasq में जोड़ें या असहज करें :

IGNORE_RESOLVCONF=yes

नेमसर्वर को परिभाषित करने के लिए अपनी स्वयं की रेजोल्व फाइल (/etc/resolv.personal) बनाएं। आप यहां किसी भी नेमसर्वर का उपयोग कर सकते हैं। मैंने https://www.opennic.org से दो लिया

nameserver 5.132.191.104
nameserver 103.236.162.119

में /etc/dnsmasq.conf जोड़ सकते हैं या निम्न पंक्ति uncomment:

resolv-file=/etc/resolv.personal

फिर dnsmasq को पुनरारंभ करें और डिफ़ॉल्ट रिज़ॉल्वर को अक्षम करें: systemd-solve।

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 

मैं अभी-अभी अपने सेट का उपयोग करके अपने-अपने dnsmasq को व्यवस्थित करने के लिए:

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

मेरे dnsmasq config में मैंने अपने बाहरी नेमसर्वर सेट किए हैं:

#/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-resolution डिफ़ॉल्ट DNS सर्वर को dnsmasq में सेट करेगा:

#/etc/resolv.conf
nameserver 127.0.0.1

उस आखिरी लाइन ने मुझे चौंका दिया, इसलिए मैंने इसे देखा। ऐसा लगता है कि आपके मामले में, /etc/resolv.confएक सहानुभूति है /run/systemd/resolve/resolv.conf। जाहिरा तौर पर यह चार (!) संभव विभिन्न तरीकों में से एक है जिसे सिस्टमड-सॉल्यूशन में संचालित किया जा सकता है। मुझे लगता है कि यह निर्भर करता है कि आपका वितरण इसे कैसे सेट करता है, अर्थात यह आपके Xubuntu 18.04.1 के लिए सही है, लेकिन यह दूसरे पर अलग हो सकता है सिस्टम।
sourcejedi

0

मैं ऑनलाइन पाए गए समाधानों का उपयोग शुरू करने के लिए dnsmasq प्राप्त करने में असमर्थ था, अर्थात सिस्टमड-समाधान को अक्षम करना, "bind इंटरफेस" के बजाय "bind डायनामिक" करने के लिए dnsmasq.conf को बदलना। मैं इसे शुरू करने में सक्षम था dnsmasq start होने के बाद बूट करने के लिए।

[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

यहां मेरे लिए उबंटू 18.10 कॉस्मिक कटलफ़िश में (दर्द के घंटों के बाद) काम किया गया था। मैंने dnsmasqतुलनात्मक रूप से अधिक मजबूत कैशिंग तंत्र का लाभ उठाने के लिए और NGINX रिज़ॉल्वर की कमजोरियों से बचने के लिए ऐसा किया । ध्यान दें कि मैं Ubuntu सर्वर संस्करण (नहीं NetworkManager/ nmcli, सिर्फ systemd-networkd) का उपयोग कर रहा हूं और यह AWS EC2 पर चल रहा है, इसलिए मुझे DNS और DHCP को डिफ़ॉल्ट EC2 खोज डोमेन के साथ काम करने की आवश्यकता है। मैं systemd-resolvedपूरी तरह से अक्षम नहीं करना चाहता था क्योंकि मुझे नहीं पता कि भविष्य के अपडेट को कैसे प्रभावित किया जा सकता है। यहां सब कुछ रूट / सुडो के रूप में चलाया जाता है जब तक कि अन्यथा नोट नहीं किया जाता (यह डिफ़ॉल्ट रूप से तब होता है जब ईसी 2 उपयोगकर्ता डेटा के रूप में पारित किया जाता है)।

## 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.