วิธีกำหนดค่า systemd-modified และ systemd-networkd เพื่อใช้เซิร์ฟเวอร์ DNS ภายในสำหรับการแก้ไขโดเมนท้องถิ่นและเซิร์ฟเวอร์ DNS ระยะไกลสำหรับโดเมนระยะไกล


26

ฉันเชื่อมต่อกับเครือข่ายท้องถิ่นที่มีการเข้าถึงอินเทอร์เน็ตผ่านเกตเวย์ มีเซิร์ฟเวอร์ DNS ในเครือข่ายท้องถิ่นที่สามารถแก้ไขชื่อโฮสต์ของคอมพิวเตอร์จากเครือข่ายท้องถิ่นได้

ฉันต้องการกำหนดค่าsystemd-modifiedและsystemd-networkdเพื่อให้การร้องขอการค้นหาชื่อโฮสต์ในท้องถิ่นจะถูกส่งไปยังเซิร์ฟเวอร์ DNS เฉพาะที่และส่งคำขอการค้นหาชื่อโฮสต์อื่นทั้งหมดไปยังเซิร์ฟเวอร์ DNS ระยะไกลอื่น

สมมติว่าฉันไม่รู้ว่าไฟล์การกำหนดค่านั้นอยู่ที่ไหนหรือฉันควรจะเพิ่มไฟล์มากขึ้นหรือไม่และต้องการให้ระบุพา ธ ในคำตอบ

คำตอบ:


28

ในไฟล์การกำหนดค่าสำหรับอินเตอร์เฟสเครือข่ายท้องถิ่นเราต้องระบุว่าเราต้องการได้รับที่อยู่เซิร์ฟเวอร์ DNS ในเครื่องจากเซิร์ฟเวอร์ DHCP โดยใช้DHCP=ตัวเลือก :

[Network]
DHCP=yes

หรือระบุที่อยู่อย่างชัดเจนโดยใช้DNS=ตัวเลือก :

[Network]
DNS=10.0.0.1

นอกจากนี้เราต้องระบุ (ในหมวดเดียวกัน) โดเมนท้องถิ่นโดยใช้Domains=ตัวเลือก

Domains=domainA.example domainB.example ~example

เราระบุโดเมนในตัวเครื่องdomainA.example domainB.exampleเพื่อรับพฤติกรรมดังต่อไปนี้ (จากsystemd-resolve.service,หน้าคนที่แก้ไขด้วยระบบ ):

การค้นหาชื่อโฮสต์ที่ลงท้ายด้วยโดเมนหนึ่งต่อโดเมนจะถูกส่งไปยังอินเตอร์เฟสที่ตรงกันเท่านั้น

วิธีนี้hostX.domainA.exampleจะได้รับการแก้ไขโดยเฉพาะโดยเซิร์ฟเวอร์ DNS ท้องถิ่นของเรา

เราระบุ~exampleด้วยว่าโดเมนทั้งหมดที่ลงท้ายด้วยexampleจะต้องถูกใช้เป็นโดเมนแบบเราต์เท่านั้นเพื่อรับการทำงานต่อไปนี้ (จากคำอธิบายของการส่งข้อมูลนี้ ):

เซิร์ฟเวอร์ DNS ที่มีโดเมนเฉพาะเส้นทางเท่านั้นควรใช้สำหรับโดเมนที่ระบุเท่านั้น

วิธีนี้hostY.on.the.internetจะได้รับการแก้ไขโดยเฉพาะจากทั่วโลก DNS เซิร์ฟเวอร์ระยะไกลของเรา

บันทึก

ตามหลักการแล้วเมื่อใช้โปรโตคอล DHCP ชื่อโดเมนท้องถิ่นควรได้รับจากเซิร์ฟเวอร์ DHCP แทนที่จะระบุไว้อย่างชัดเจนในไฟล์กำหนดค่าของอินเทอร์เฟซเครือข่ายด้านบน ดูตัวเลือกUseDomains= อย่างไรก็ตามยังคงมีปัญหาที่ค้างอยู่กับคุณลักษณะนี้ - ดูปัญหาตัวเลือกโดเมนการค้นหา systemd-networkd DHCP

เราจำเป็นต้องระบุเซิร์ฟเวอร์ DNS ระยะไกลเป็นเซิร์ฟเวอร์ DNS ทั่วโลกของเรา เราสามารถทำได้ใน/etc/systemd/resolved.confไฟล์:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

อย่าลืมโหลดการกำหนดค่าและเริ่มบริการใหม่:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

ข้อควรระวัง!

ดังกล่าวข้างต้นค้ำประกันใช้เฉพาะเมื่อชื่อจะได้รับการแก้ไขโดยsystemd แก้ไข - ดูหน้าคนสำหรับNSS-มติ libnss_resolve.so.2และหน้าคนสำหรับ systemd-resolved.service, systemd

ดูสิ่งนี้ด้วย:

อ้างอิง:


6
คุณถือว่าไม่ได้ใช้.localในตัวอย่างนี้หรือไม่? แน่นอนกับ avahi นี่ควรจะสงวนไว้สำหรับ MDNS และการใช้ในทางที่ผิดมันก็ไม่ใช่เรื่องใหญ่ มันจะเป็นที่ชัดเจนกับผมที่จะใช้example.comหรือ.example
sourcejedi

1
@sourcejedi สำหรับการอ้างอิง.localถูกกำหนดให้เป็นโดเมนพิเศษใน RFC 6762 - Multicast DNSในส่วนMulticast DNS ชื่อ ขอบคุณคง
Piotr Dobrogost

บันทึกที่ไม่เกี่ยวข้อง: คุณสามารถยอมรับคำตอบเองได้เช่นกัน
intelfx

2
ฉันคิดว่ามันจะเป็นประโยชน์ในการเพิ่มสถานที่ตั้งของแฟ้มการกำหนดค่าสำหรับการเชื่อมต่อเครือข่ายท้องถิ่น ไม่แน่ใจว่าถูกต้อง/etc/systemd/network/*.networkหรือไม่ พบได้ที่นี่superuser.com/a/1365864
Pierre Cordier

1
ฉันสังเกตว่าคำตอบนี้ของ "ในแฟ้มการกำหนดค่า ... " ไม่ตอบสนองต่อ OP ของ "สมมติว่าฉันไม่ทราบว่าไฟล์การกำหนดค่าที่ ... " เป็นคนที่มาถึงที่นี่ในสถานะเดียวกันของความไม่รู้เกี่ยวกับ ตำแหน่งของไฟล์การกำหนดค่าเฉพาะคำตอบนี้ไม่สมบูรณ์
Eric Towers

1

เพียงเพื่อขยายคำตอบที่ยอดเยี่ยมของ @piotrDobrogost อย่าลืมกำหนดค่า/etc/nsswitch.confให้ใช้systemd-resolvedเป็นแหล่งความละเอียด DNS hostsคำสั่งของคุณควรมีลักษณะดังต่อไปนี้สำหรับกรณีการใช้งานเฉพาะของคุณ:

/etc/nsswitch.conf

hosts:  files resolve dns

ดังนั้นหากคุณ จำกัด การแก้ปัญหาเฉพาะโดเมนที่ระบุไว้ในDomainsคำสั่งใน/etc/systemd/resolved.confรายละเอียด Piotr ด้านบน DNS ควรได้รับการพิจารณาในลำดับถัดไปตามลำดับแหล่งที่มาของการจำแนกชื่อที่ระบุ/etc/nsswitch.confเมื่อไม่พบโดเมนในDomainsคำสั่ง:

การอ้างอิงการเชื่อมโยงต่อไปนี้ความต้องการที่จะระบุการแก้ปัญหาใน/etc/nsswitch.confเพื่อให้systemd-resolvedเป็นที่ปรึกษาในระหว่างการแก้ปัญหาชื่อ:

https://github.com/systemd/systemd/issues/940

เอกสาร SystemD ฉันพบว่าน่ากลัว ฉันต้องเข้าใจร่วมกันจากลิงก์หลายแห่งรวมถึงคำตอบของ Piotr ด้านบน ;-)


เมื่อใช้โหมดการทำงานที่แนะนำของsystemd-resolซึ่ง/etc/resolve.confเป็น symlink ไปยัง/run/systemd/resolve/stub-resolv.confไฟล์ซึ่งในทางกลับกันจะมีที่อยู่ของตัวแก้ไข DNS stub ของตัวแก้ไขsystemdไม่จำเป็นต้องวางresolveคำสั่งไว้ใน/etc/nsswitch.confไฟล์เนื่องจากคำร้องขอ DNS จะถูกนำ (เนื่องจากnss-dnsคำสั่งมาตรฐาน) ตัวแก้ไข stub ซึ่งทำหน้าที่ตามกฎของ systemd-modified
Piotr Dobrogost

@PiotrDobrogost คุณจะควบคุมแหล่งที่มาของการแก้ไข DNS ได้อย่างไรโดยไม่ต้องใช้/etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" files ") จะถูกตรวจสอบสำหรับIPแบบคงที่:การแมปชื่อและหากไม่พบระบบจะทำการแก้ไข stub ที่แก้ไขต่อไป . ผมไม่เห็นว่ามันจะเป็นไปได้ดังนั้นแหล่งขั้นตอนของการแก้ปัญหา DNS /etc/nsswitch.confโดยไม่ต้องใช้ ฉันไม่มีเคล็ดลับที่นี่หรือไม่
F1Linux

ฉันไม่ได้บอกว่า/etc/nsswitch.confไม่จำเป็น ฉันกำลังบอกว่าเมื่อมีคนใช้ตัวแก้ไข DNS stub DNS ของ systemd- แก้ไขแล้วก็เพียงพอที่จะมีdnsคำสั่งที่ระบุไว้ในhosts:บรรทัด (สันนิษฐานว่าหลังจากfileคำสั่ง) ไม่จำเป็นต้องresolveมีคำสั่งเนื่องจากเป็นตัวแก้ไข stub ที่เป็นจุดเริ่มต้นไปยังตรรกะของระบบที่แก้ไขแล้วและไม่ใช่nss-resolveโมดูลปลั๊กอิน ...
Piotr Dobrogost

... กล่าวอีกนัยหนึ่งคุณสามารถเข้าถึง ตรรกะของresolve systemd- แก้ไขทั้งผ่านdirective ➟ nss- resol โมดูลปลั๊กอิน NSS S systemd- แก้ไขหรือผ่านdnsคำสั่ง➟ nss-dnsโมดูลปลั๊กอิน NSS resol systemd แก้ไขของ stub DNS แก้ไข systemd
Piotr Dobrogost

@PiotrDobrogost ฉันคิดว่าฉันมาถึงตอนfilesนั้นresolveใน/etc/nsswitch.confส่วนที่ 2 จากคำถามของคุณ อ่านอีกครั้งดูเหมือนว่าคุณกำลังพูดถึงการตรวจสอบแคชในเครื่องสำหรับIP: การจับคู่ชื่อแล้วเอื้อมมือไปที่ผู้ส่งหากไม่พบ ฉันมักจะตั้งค่าfilesDNS แหล่งที่มาแรกของความละเอียดที่จะเลี่ยง DNS เพื่อให้ฉันทดสอบและไม่ตีโฮสต์การผลิต - T
F1Linux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.