Ubuntu 16.10+ ใช้systemd-resolvedเป็นโปรแกรมแก้ไข DNS
ฉันชอบการตั้งค่าที่ใช้ 16.04 dnsmasqเป็นตัวแก้ไข
ฉันจะทำอย่างนั้นกับ 16.10+ โดยเฉพาะใน 17.04 ได้อย่างไร
Ubuntu 16.10+ ใช้systemd-resolvedเป็นโปรแกรมแก้ไข DNS
ฉันชอบการตั้งค่าที่ใช้ 16.04 dnsmasqเป็นตัวแก้ไข
ฉันจะทำอย่างนั้นกับ 16.10+ โดยเฉพาะใน 17.04 ได้อย่างไร
คำตอบ:
dnsmasq แพคเกจยังคงมีอยู่ใน 16.10 และ 17.04
ติดตั้งdnsmasqและการอ้างอิง (หรือดาวน์โหลดแพคเกจอย่างน้อย) ก่อนที่จะปิดการใช้งานsystemd-resolved :
sudo apt-get install dnsmasq
ปิดใช้งานsystemd-resolvedและตรวจสอบว่าdnsmasqกำลังทำงาน:
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
systemctl status dnsmasq
ปรุงdnsmasqรส หลังจากใช้การตั้งค่าของคุณให้รีสตาร์ทdnsmasq:
sudo systemctl stop dnsmasq
sudo systemctl start dnsmasq
หลังจากขั้นตอนที่ 2 คุณอาจไม่มีตัวแก้ไขระบบที่ใช้งานได้จนกว่าขั้นตอนที่ 3 จะเสร็จสมบูรณ์ คุณอาจต้องรีสตาร์ทระบบย่อยการเชื่อมต่อเครือข่าย (หรือเพียงแค่รีบูต) เพื่อให้สามารถdnsmasqทำงานกับการกำหนดค่าเริ่มต้นได้ ในการทดสอบของฉันการเพิ่มเซิร์ฟเวอร์ DNS ที่รู้จัก/etc/dnsmasq.confและเริ่มใหม่dnsmasqก็เพียงพอที่จะทำให้มันทำงานในสภาพแวดล้อม liveCD
dns=dnsmasqไปที่/etc/NetworkManager/NetworkManager.conf
นอกจากคำตอบของ @quixotic:
ตรวจสอบให้แน่ใจว่าคุณมี /etc/NetworkManager/NetworkManager.conf:
[main]
dns=dnsmasq
หากคุณต้องการเพิ่มรีสตาร์ท NetworkManager ดังนี้:
sudo systemctl restart NetworkManager
และ/etc/resolv.confความต้องการที่จะเป็น symlink /var/run/NetworkManager/resolv.confไป สามารถทำได้เช่นนี้
sudo rm /etc/resolv.conf; sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
dns=defaultและทำงานได้ดีเพราะฉันมีชื่อเซิร์ฟเวอร์ที่กำหนดโดย NetworkManager แทนการกำหนดไว้ใน dnsmasq; สิ่งนี้ใช้ได้กับฉัน - NM ได้รับเนมเซิร์ฟเวอร์จากการตั้งค่าที่ทำในการกำหนดค่า NM ของ KDE ผ่านซิสเต็มเทรย์ ฉันใช้ IP คงที่ในเครือข่ายในบ้านของฉัน FWIW
ตามคู่มือของsystemd-modified , systemd-modified ให้กับบริการจำแนกชื่อผ่านสามอินเตอร์เฟสที่แตกต่างกัน:
glibc getaddrinfo (3) API ตามที่กำหนดโดย RFC3493 และฟังก์ชั่นตัวแก้ไขที่เกี่ยวข้องรวมถึง gethostbyname (3) API นี้ได้รับการสนับสนุนอย่างกว้างขวางรวมถึงนอกเหนือจากแพลตฟอร์ม Linux ในรูปแบบปัจจุบันจะไม่เปิดเผยข้อมูลสถานะการตรวจสอบความถูกต้อง DNSSEC และเป็นแบบซิงโครนัสเท่านั้น API นี้ได้รับการสนับสนุนโดย glibc Name Service Switch (nss (5)) การใช้งานโมดูล glibc NSS จำเป็นต้องมีการแก้ไข nss (8) เพื่อให้ฟังก์ชันตัวแก้ไข NSS ของ glibc สามารถแก้ไขชื่อโฮสต์ผ่านระบบที่แก้ไขแล้ว
ดูเหมือนว่าอินเทอร์เฟซสองรายการแรกจะไม่รบกวนการแก้ไข DNS ปกติและสำหรับฉันปัญหาน่าจะอยู่ที่สาม
ในคู่มือการแก้ไข nss :
ในการเปิดใช้งานโมดูล NSS ให้เพิ่ม "แก้ไข" ไปยังบรรทัดที่ขึ้นต้นด้วย "hosts:" ใน /etc/nsswitch.conf ขอแนะนำให้วาง "แก้ไข" ก่อนเวลาใน /etc/nsswitch.conf ของ "โฮสต์:" บรรทัด (แต่หลังจากรายการ "ไฟล์" หรือ "mymachines") ก่อนหน้ารายการ "dns" หากมีอยู่แล้วตามด้วย "[! UNAVAIL = return]" เพื่อให้แน่ใจว่ามีการส่งการสอบถาม DNS ผ่านการแก้ไขระบบเสมอ (8) ถ้ามันกำลังทำงานอยู่ แต่จะถูกส่งไปยัง nss-dns หากบริการนี้ไม่พร้อมใช้งาน
ดังนั้นสิ่งที่เป็นสิ่งจำเป็นที่จะทำให้ "DNS" แจ๋ว "แก้ไข" ใน "เจ้าภาพ" สายของ/etc/nsswitch.conf และจากนั้นก็getaddrinfoควรที่จะปฏิบัติตามเพียง/etc/resolv.conf
โซลูชันนี้ป้องกันระบบที่แก้ไขไม่ได้จากการจัดการการร้องขอการแก้ไข DNS ทั้งหมดและไม่ได้ จำกัด อยู่ที่ผู้จัดการเครือข่ายเฉพาะ และยังทำให้แน่ใจว่าบริการ LLMNR และ mDNS ทำงานตามปกติ
(ฉันไม่คุ้นเคยกับการแก้ปัญหาชื่อภายใต้ Linux และยังไม่แน่ใจเกี่ยวกับสิ่งที่ฉันเข้าใจจากคู่มือเหล่านี้ Pleaes ชี้ให้เห็นว่าฉันมีอะไรผิดปกติขอบคุณ :))
สำหรับ (X) Ubuntu 18.04 (ดูคำตอบของฉันที่ stackexchange )
นี่คือสำเนาของมัน (ฉันควรทำสำเนาหรือไม่)
นี่คือวิธีแก้ปัญหาสำหรับ (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- แก้ไขแล้ว!) NetworkManager (NM) จะตรวจสอบว่าเป็นลิงค์สัญลักษณ์เพื่อตรวจสอบการกำหนดค่าที่ระบบแก้ไขหรือไม่
$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf
ปิดใช้งานการเขียนทับของ /etc/resolv.conf โดย NM (นอกจากนี้ยังมีตัวเลือก rc-manager แต่มันไม่ทำงานแม้ว่ามันจะอธิบายไว้ในคู่มือ):
$ 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