`/ etc / hosts` และ DNS ทำงานร่วมกันเพื่อแก้ไขชื่อโฮสต์ให้เป็นที่อยู่ IP ได้อย่างไร


10

ใน Linux จะทำอย่างไร/etc/hostsและ DNS ทำงานร่วมกันเพื่อแก้ไขชื่อโฮสต์ให้เป็นที่อยู่ IP ได้อย่างไร

  1. หากชื่อโฮสต์สามารถแก้ไขได้/etc/hostsDNS จะนำไปใช้หลังจาก/etc/hosts แก้ไขชื่อโฮสต์หรือจัดการที่อยู่ IP ที่ได้รับการแก้ไขแล้วด้วยการ /etc/hostsเป็น "ชื่อโฮสต์" เพื่อแก้ไขปัญหาซ้ำ ๆ หรือไม่
  2. ในเบราว์เซอร์ของฉัน (firefox และ google chrome) เมื่อฉันเพิ่มไปที่ /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    พิมพ์ www.google.com ลงในแถบที่อยู่ของเบราว์เซอร์และกดปุ่ม Enter จะไม่เชื่อมต่อกับเว็บไซต์ หลังจากที่ฉันลบบรรทัดนั้นออก/etc/hostsแล้วฉันสามารถเชื่อมต่อกับเว็บไซต์ได้ หมายความว่า/etc/hostsแทนที่ DNS สำหรับการแก้ไขชื่อโฮสต์หรือไม่

    หลังจากที่ฉันเพิ่มบรรทัดอีกครั้ง/etc/hostsฉันยังคงสามารถเชื่อมต่อกับเว็บไซต์ได้แม้หลังจากรีเฟรชหน้าเว็บแล้ว เหตุใดจึงไม่ /etc/hostsใช้อีกครั้งดังนั้นฉันจึงไม่สามารถเชื่อมต่อกับเว็บไซต์ได้

ขอบคุณ


9
ระวังว่าเว็บเบราว์เซอร์จำนวนมากใช้เซิร์ฟเวอร์ DNS ของตัวเองและแคช DNS และไม่ปรึกษากลไกการค้นหาชื่อที่กำหนดค่าไว้ในระบบ กล่าวอีกนัยหนึ่งเว็บเบราว์เซอร์บางตัวจะไม่สนใจ/etc/hostsและเซิร์ฟเวอร์ชื่อที่กำหนดในเครื่อง มันค่อนข้างสับสนเมื่อได้เห็นเป็นครั้งแรก (มองคุณเบราว์เซอร์ที่ใช้ Chromium!)
Christopher

@ คริสโตเฟอร์ฉันมาที่นี่เพื่อพูดในสิ่งเดียวกัน unix.stackexchange.com/questions/363498/
Rui F Ribeiro

@Christopher หลังจากที่ฉันเพิ่มบรรทัดไปยัง / etc / hosts ฉันยังคงสามารถเชื่อมต่อกับเว็บไซต์แม้หลังจากรีเฟรชหน้าเว็บ เหตุใดจึงไม่ใช้ / etc / hosts อีกครั้งดังนั้นฉันจึงไม่สามารถเชื่อมต่อกับเว็บไซต์ได้ เป็นเพราะแคช DNS ของ Firefox หรือไม่
ทิม

@RuiFRibeiro งานสร้าง Chromium นี้น่าเคารพ/etc/hostsและเซิร์ฟเวอร์ DNS ที่ระบบกำหนด: ( github.com/Eloston/ungoogled-chromium ) การติดตั้งบน MacOS กับ brew cask install eloston-chromiumHomebrew:
คริสโตเฟอร์

คำตอบ:


21

สิ่งนี้ถูกกำหนดโดยการกำหนดค่า NSS (Name Service Switch) เช่นคำสั่ง/etc/nsswitch.confของไฟล์ hostsตัวอย่างเช่นในระบบของฉัน:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

ที่นี่filesอ้างถึง/etc/hostsไฟล์และdnsอ้างอิงถึงระบบ DNS และในขณะที่คุณสามารถจินตนาการใดมาชนะครั้งแรก

ดูman 5 nsswitch.confเพิ่มเติมเพื่อรับทราบแนวคิดเพิ่มเติมเกี่ยวกับเรื่องนี้


หากต้องการทำตามคำสั่งการแก้ปัญหาโฮสต์ NSS ให้ใช้getentกับhostsฐานข้อมูลเช่น:

getent hosts example.com

ขอบคุณ ในส่วนที่ 2 ของฉันเป็นเพราะเซิร์ฟเวอร์ DNS ของเว็บเบราว์เซอร์ของฉันไม่ทำงาน แต่แคช DNS ของเว็บเบราว์เซอร์ทำงานได้หรือไม่
ทิม

วิธีการที่ไม่systemd.resolverส่งผลกระทบต่อความละเอียด? NIS และ LDAP เหมาะสมกับระบบแก้ไขปัญหาอย่างไร ลำดับใดบ้างที่เป็นไปตามระบบ MacOS หรือระบบ Windows
ไอแซค

@Tim ใช่เบราว์เซอร์ของคุณกำลังดึงข้อมูลจากแคช
heemayl

7

เพื่อที่จะตอบเพียงคำถามสุดท้ายของคุณ/etc/hostsไม่ได้ใช้อีกครั้งทันทีเพราะfirefoxแคชชื่อโฮสต์ที่ผ่านมามันก็สำหรับgoogle.com; ถ้าคุณต้องการให้ดึงข้อมูลมันก็อีกครั้งคุณจะต้องตั้งnetwork.dnsCacheExpirationไปใน0 about:configข้อมูลเพิ่มเติม (แม้ว่าบิตล้าสมัย) ที่นี่ ขออภัยถ้านี่เป็นคำย่อ


ในฐานะ sidenote หลายโปรแกรมไม่ได้ใช้ตัวแก้ไขมาตรฐาน ( getaddrinfo(3), getnameinfo(3)[1]) เพราะมันแย่มาก

ก่อนอินเตอร์เฟสจะไม่เป็นแบบอะซิงโครนัส โปรแกรมที่ซับซ้อนในระดับปานกลางจะต้องวางไข่เธรดที่แยกต่างหากซึ่งทำเพียงแค่getaddrinfo()และประดิษฐ์โพรโทคอลของตัวเองเพื่อสื่อสารกับมัน (และอย่าแม้แต่จะเข้าไปgetaddrinfo_a()ที่ซึ่งกำลังส่งสัญญาณเมื่อเสร็จสิ้นดังนั้นจึงยิ่งแย่ลง)

ประการที่สองการใช้งานตัวแก้ไขในglibc(ไลบรารี C มาตรฐานใน linux) นั้นแย่มากคาดว่าคุณจะปล่อยให้มันดึงวัตถุไดนามิกแบบสุ่มเข้าไปในพื้นที่ที่อยู่ผ่านทางdlopen()ด้านหลังของคุณและทำให้มันเป็นไปไม่ได้ที่จะเก็บมันไว้ในทางใดทางหนึ่ง executables ที่เชื่อมโยง

ตั้งแต่หลายโปรแกรมที่ไม่ได้ใช้จำแนกมาตรฐานโดยตรงที่พวกเขายังไม่รำคาญที่จะทำซ้ำพฤติกรรมของมันตรงและไม่สนใจบางส่วนหรือทั้งหมด/etc/resolv.conf, /etc/hosts, หรือ/etc/nsswitch.conf/etc/gai.conf

[1] และอย่าเอ่ยถึงผู้ที่ไม่ได้เป็นผู้อ้างอิงซ้ำเท่านั้น ipv4 เท่านั้นgethostbyname()ซึ่งเลิกใช้มานานแล้ว


ขอบคุณ คุณหมายถึง "ผู้ที่ไม่ได้กลับมา"
ทิม

1
มันหมายความว่าถ้าคุณกำลังทำgoogle = GHBN("google.com"); facebook = GHBN("facebook.com")คุณอาจจบลงด้วยการที่ทั้งสองgoogleและที่มีอยู่ของfacebook facebook.comเมื่อมีการโทรสองครั้งในหัวข้อที่แตกต่างกันมันก็สนุกกว่า: คุณอาจลงท้ายด้วยที่อยู่ซึ่งเป็นครึ่ง google และครึ่ง facebook หรือขยะสมบูรณ์
ลุงบิลลี่

gethostbyname()ตอนนี้มีอะไรมาแทนที่
ทิม

1
getaddrinfoเป็นฟังก์ชั่นมาตรฐานสำหรับสิ่งนั้น แต่เป็นปัญหาที่เกิดขึ้นตามที่ฉันได้อธิบายไปแล้วดังนั้นจึงไม่ได้ใช้โดยเบราว์เซอร์หรือแอปอื่น ๆ ในชีวิตจริง
ลุงบิลลี่

ตัวอย่างเช่น Firefox และ Chrome ใช้การแก้ไขของตนเองเช่น ขอบคุณสำหรับบันทึกย่อที่ชาญฉลาด
Rui F Ribeiro

6

ไฟล์/etc/hostsและ DNS ไม่ทำงานร่วมกัน พวกเขาให้ความละเอียดอิสระชื่อ (ชื่อเครือข่าย)

กาวที่เชื่อมโยงพวกเขาเป็นภายใน/etc/nsswitch.confสำหรับระบบลินุกซ์ ใน/etc/netsvc.confสำหรับเซิร์ฟเวอร์ AIX ในระบบสำหรับWindowsและสามารถแสดงรายการด้วยlookupd -configuration(ค้นหา LookupOrder คล้ายกับ:) Cache FF DNS NI DSในระบบ MacOS

คำสั่งซื้อที่เกิดขึ้นจริงนั้นซับซ้อนและมักจะสับสนเนื่องจากบริการระบุชื่อแต่ละรายการสามารถ (และหลายต่อหลายครั้ง) ในการแก้ปัญหาระดับอื่น กดdnsmasqไลค์ (เซิร์ฟเวอร์ DNS แบบเบาโดยทั่วไปที่127.0.0.1:53หรือ::1:53(หรือทั้งสองอย่าง)) มักจะอ่านและรวม/etc/hostsเนื้อหาไฟล์ หรือไลค์systemd.resolver(ตัวแก้ไขพื้นฐานที่ควรแก้ไขชื่อที่ไม่ได้ประเช่นmycomputer) เรียกการแก้ปัญหา DNS โดยตรงสำหรับชื่อที่ประ ( mycomputer.here.dev.) ภายใต้เงื่อนไขบางประการ

โดยทั่วไปบริการจะถูกเรียกตามลำดับและบริการแรกที่ไม่ชนะจะล้มเหลวและได้รับการยอมรับว่าเป็นที่อยู่ที่ถูกต้อง คำสั่งพื้นฐานทั่วไปคือ: /etc/hosts(ไฟล์), mDNS (ชื่อที่ไม่ได้ประ), DNS, NIS, NIS +, LDAP ในระบบ linux บางระบบมีวิธีแก้ปัญหาสุดท้ายสำหรับคอมพิวเตอร์hostnameในบริการmyhostname

ตัวอย่างเช่นในระบบนี้ (จากcat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

โปรดทราบว่าเก่ามาก (glibc 2.4 และก่อนหน้า) orderเข้าชุดใน/etc/host.confนาม:

order hosts,bind,nis

ใช้กับ/etc/hostsบริการชื่อไฟล์ (ไฟล์) เท่านั้น

ผลกระทบต่อคอมพิวเตอร์ไคลเอนต์ (linux) นี้ที่เกี่ยวข้องกับ NIS และ LDAP นั้น (ปกติ) ควบคุมโดยเซิร์ฟเวอร์ DNS ที่ใช้ (ผูก, ไม่ถูกผูกไว้, ฯลฯ )

ดังนั้น:

  1. หากชื่อโฮสต์สามารถแก้ไขได้ใน / etc / hosts DNS จะนำไปใช้หลังจาก / etc / hosts เพื่อแก้ไขชื่อโฮสต์หรือจัดการที่อยู่ IP ที่ได้รับการแก้ไขโดย / etc / hosts เป็น "hostname" เพื่อแก้ปัญหาแบบเรียกซ้ำ?

ไม่มี.

หากชื่อโฮสต์สามารถแก้ไขได้ใน/etc/hostsการDNSใช้ไม่ได้ (ถ้าไฟล์ก่อน DNS)

และไม่ได้แก้ไขที่อยู่ IP ซึ่งถือว่าเป็น "ชื่อโฮสต์"

เป็นเพียงที่อยู่ที่แก้ไขแล้ว

เบราว์เซอร์

เบราว์เซอร์สามารถใช้วิธีการใดก็ได้เพื่อแก้ไขชื่อ (หลังจากตรวจสอบแคชของชื่อที่แก้ไขแล้ว) เฉพาะเมื่อมันใช้ระบบที่ให้วิธีการสั่งซื้อที่ได้รับข้างต้นใช้ เบราว์เซอร์เช่นเดียวกับโปรแกรมใด ๆ สามารถเลือกที่จะติดต่อเซิร์ฟเวอร์ DNS ใดก็ได้โดยตรง

หากคำสั่งของระบบมี/etc/hostsมาก่อนDNSนั่นหมายความว่ารายการในไฟล์นั้นจะมีความสำคัญกว่าการDNSแก้ไขปัญหา

ดังนั้น:

  1. ... มันหมายความว่า / etc / hosts แทนที่ DNS สำหรับการแก้ไขชื่อโฮสต์หรือไม่

ใช่ (ถ้าเบราว์เซอร์ใช้ระบบที่ให้ความละเอียด)

เหตุใดจึงไม่/etc/hostsใช้อีกครั้งดังนั้นฉันจึงไม่สามารถเชื่อมต่อกับเว็บไซต์ได้

จนกว่าแคชภายในของเบราว์เซอร์จะถูกล้างออก (หรือหมดเวลา) สำหรับชื่อเฉพาะนั้นคือชื่อที่ค้นหานอกเบราว์เซอร์อีกครั้ง

หากเบราว์เซอร์มีชื่อที่แก้ไขในแคชเบราว์เซอร์จะใช้อีกครั้ง

ใช้นี้เพื่อล้างแคช

หรือเพียงแค่ปิด (รอสักครู่) แล้วเริ่มเบราว์เซอร์ใหม่

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