Làm thế nào để `/ etc / hosts` và DNS phối hợp với nhau để phân giải tên máy chủ thành địa chỉ IP?


10

Trong Linux, làm thế nào /etc/hostsvà DNS phối hợp với nhau để phân giải tên máy chủ thành địa chỉ IP?

  1. nếu tên máy chủ có thể được giải quyết /etc/hosts, DNS có áp dụng sau /etc/hosts để phân giải tên máy chủ hoặc xử lý địa chỉ IP được phân giải bằng /etc/hosts"tên máy chủ" để giải quyết đệ quy không?
  2. Trong trình duyệt của tôi (firefox và google chrome), khi tôi thêm vào /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    nhập www.google.com vào thanh địa chỉ của trình duyệt và nhấn vào sẽ không kết nối với trang web. Sau khi tôi xóa dòng đó /etc/hosts, tôi có thể kết nối với trang web. Có nghĩa là /etc/hostsghi đè DNS để giải quyết tên máy chủ?

    Sau khi tôi thêm lại dòng /etc/hosts, tôi vẫn có thể kết nối với trang web, ngay cả sau khi làm mới trang web. Tại sao không /etc/hostsáp dụng lại, để tôi không thể kết nối với trang web?

Cảm ơn.


9
Coi chừng nhiều trình duyệt Web triển khai máy chủ DNS và bộ đệm DNS của riêng họ và không tham khảo bất kỳ cơ chế tra cứu tên nào đã được định cấu hình trên hệ thống. Nói cách khác, một số trình duyệt Web hoàn toàn bỏ qua /etc/hostsvà các máy chủ tên được xác định cục bộ. Lần đầu tiên chứng kiến ​​điều đó thật khó hiểu. (Nhìn vào bạn, các trình duyệt dựa trên Chromium!)
Christopher

@Christopher Tôi đã đến đây để nói điều tương tự. Liên quan unix.stackexchange.com/questions/363498/iêu
Rui F Ribeiro

@Christopher Sau khi tôi thêm lại dòng vào / etc / hosts, tôi vẫn có thể kết nối với trang web, ngay cả sau khi làm mới trang web. Tại sao không / etc / hosts áp dụng lại, do đó tôi không thể kết nối với trang web? Có phải vì bộ đệm DNS của Firefox?
Tim

@RuiFRibeiro Bản dựng Chromium này có vẻ tôn trọng /etc/hostsvà các máy chủ DNS do hệ thống xác định: ( github.com/Eloston/ungoogled-chromium ). Cài đặt trên macOS với Homebrew : brew cask install eloston-chromium.
Christopher

Câu trả lời:


21

Điều này được quyết định bởi cấu hình NSS (Name Service Switch) tức là chỉ thị /etc/nsswitch.confcủa tệp hosts. Ví dụ: trên hệ thống của tôi:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Ở đây, filesđề cập đến /etc/hoststệp và dnsđề cập đến hệ thống DNS. Và như bạn có thể tưởng tượng cái nào đến trước sẽ thắng .

Ngoài ra, xem man 5 nsswitch.confđể có thêm ý tưởng về điều này.


Bên cạnh đó, để tuân theo thứ tự độ phân giải máy chủ NSS, hãy sử dụng getentvới hostscơ sở dữ liệu, ví dụ:

getent hosts example.com

Cảm ơn. Trong phần 2 của tôi, có phải vì máy chủ DNS của trình duyệt web của tôi không hoạt động, nhưng bộ đệm DNS của trình duyệt web hoạt động?
Tim

Làm thế nào để systemd.resolverảnh hưởng đến nghị quyết? NIS và LDAP phù hợp với hệ thống giải quyết ở đâu? Thứ tự nào theo hệ thống MacOS hoặc hệ thống Windows?.
Isaac

@Tim Có, trình duyệt của bạn đang tìm nạp dữ liệu từ bộ đệm.
heemayl

7

Để trả lời câu hỏi cuối cùng của bạn: /etc/hostskhông áp dụng lại ngay lập tức vì firefoxđang lưu trữ tên máy chủ cuối cùng mà nó nhận được google.com; nếu bạn muốn nó luôn lấy nó một lần nữa, bạn sẽ phải thiết lập network.dnsCacheExpirationđể 0about:config. Thêm thông tin (mặc dù hơi lỗi thời) ở đây . Xin lỗi nếu điều này là không chính đáng.


Là một sidenote, nhiều chương trình không sử dụng trình phân giải tiêu chuẩn ( getaddrinfo(3), getnameinfo(3)[1]) vì nó hút .

Đầu tiên, giao diện không đồng bộ; bất kỳ chương trình phức tạp vừa phải nào cũng sẽ phải tạo ra một luồng riêng biệt chỉ thực hiện getaddrinfo()và sau đó phát minh ra giao thức của chính nó để giao tiếp với nó (và thậm chí không nhập vào getaddrinfo_a(), nó đang gửi tín hiệu khi hoàn thành, do đó thậm chí còn tệ hơn).

Thứ hai, việc triển khai trình phân giải trong glibc(thư viện C tiêu chuẩn trong linux) thật kinh khủng, hy vọng bạn sẽ để nó kéo các đối tượng động ngẫu nhiên vào không gian địa chỉ qua dlopen()sau lưng và khiến nó không thể chứa nó theo bất kỳ cách nào hoặc sử dụng nó trong tĩnh thực thi liên kết.

Kể từ khi nhiều chương trình không sử dụng phân giải tiêu chuẩn trực tiếp, họ cũng không bận tâm để tái tạo chính xác hành vi của nó, và bỏ qua một số hoặc toàn bộ /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confhoặc /etc/gai.conf.

[1] và thậm chí không đề cập đến người không reentrant, chỉ ipv4 gethostbyname(), đã bị từ chối từ lâu.


Cảm ơn. Bạn có nghĩa là "không tái sinh" là gì?
Tim

1
Điều đó có nghĩa là nếu bạn đang thực hiện, google = GHBN("google.com"); facebook = GHBN("facebook.com")bạn có thể kết thúc bằng cả hai googlefacebookchứa địa chỉ của facebook.com. Khi hai cuộc gọi được thực hiện trong các luồng khác nhau, điều đó thậm chí còn vui hơn: bạn có thể kết thúc bằng một địa chỉ là một nửa google và một nửa facebook hoặc rác hoàn chỉnh.
Chú Billy

Những gì đã thay thế gethostbyname()bây giờ?
Tim

1
getaddrinfolà chức năng tiêu chuẩn cho điều đó, nhưng bản thân nó là brokrn, như tôi đã giải thích, vì vậy nó không được sử dụng như các trình duyệt hoặc các ứng dụng thực tế khác.
Chú Billy

Thật vậy, firefox và Chrome sử dụng các giải pháp riêng của họ, ví dụ. Cảm ơn các ghi chú sâu sắc.
Rui F Ribeiro

6

Tệp /etc/hostsvà DNS không hoạt động cùng nhau. Họ cung cấp độ phân giải độc lập của tên (tên mạng).

Chất keo liên kết chúng là bên trong /etc/nsswitch.confcho các hệ thống linux . Trong /etc/netsvc.confcác máy chủ AIX, trong hệ thống dành cho Windows và có thể được liệt kê vớilookupd -configuration (tìm kiếm Tra cứu, tương tự như Cache FF DNS NI DS:) trong các hệ thống MacOS.

Trật tự thực tế trở nên phức tạp và thường bị xáo trộn vì mỗi dịch vụ phân giải tên có thể (và nhiều lần làm) nhìn vào các cấp độ phân giải khác. Giống như dnsmasq(một máy chủ DNS nhẹ nói chung tại 127.0.0.1:53, hoặc ::1:53(hoặc cả hai)) thường đọc và bao gồm /etc/hostsnội dung tệp. Hoặc like systemd.resolver(một trình phân giải cơ bản chỉ nên giải quyết các tên không được chấm như mycomputer) gọi trực tiếp độ phân giải DNS cho các tên được chấm ( mycomputer.here.dev.) trong một số điều kiện.

Nói chung, các dịch vụ được gọi theo thứ tự và dịch vụ đầu tiên không thắng và được chấp nhận là địa chỉ chính xác. Thứ tự cơ bản chung là: /etc/hosts(tệp), mDNS (tên không được chấm), DNS, NIS, NIS +, LDAP. Trong một số hệ thống linux có độ phân giải cuối cùng cho máy tínhhostname trong dịch vụmyhostname

Ví dụ: trong hệ thống này (từ cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Lưu ý rằng rất cũ (glibc 2.4 trở về trước) orderentry bộ trong/etc/host.conf như:

order hosts,bind,nis

Chỉ áp dụng cho các tập tin (tập tin /etc/hosts dịch vụ tên ).

Các hiệu ứng trên máy khách (linux) này liên quan đến NIS và LDAP là (thường) được kiểm soát bởi máy chủ DNS được sử dụng (liên kết, không gắn kết, v.v.).

vì thế:

  1. Nếu tên máy chủ có thể được phân giải trong / etc / hosts, DNS có áp dụng sau / etc / hosts để phân giải tên máy chủ hoặc coi địa chỉ IP được giải quyết bằng / etc / hosts làm "tên máy chủ" để giải quyết đệ quy không?

Không ai.

Nếu tên máy chủ có thể được giải quyết /etc/hosts, DNSthì không áp dụng (nếu tệp nằm trước DNS).

địa chỉ IP được giải quyết cũng không được coi là "tên máy chủ".

Nó chỉ đơn giản là: địa chỉ được giải quyết.

trình duyệt

Một trình duyệt có thể sử dụng bất kỳ phương pháp nào để phân giải tên (sau khi nó đã kiểm tra bộ đệm của các tên đã phân giải). Chỉ khi nó sử dụng một hệ thống được cung cấp phương pháp, thứ tự được đưa ra ở trên mới áp dụng. Trình duyệt, như bất kỳ chương trình nào, có thể chọn liên hệ trực tiếp với bất kỳ máy chủ DNS nào.

Nếu thứ tự hệ thống có /etc/hoststrước DNS, điều đó có nghĩa là một mục trong tệp đó sẽ được ưu tiên cho DNSdịch vụ phân giải.

Vì thế:

  1. ... Điều đó có nghĩa là / etc / hosts ghi đè DNS để phân giải tên máy chủ?

Có (nếu trình duyệt sử dụng hệ thống cung cấp độ phân giải).

Tại sao không /etc/hostsáp dụng lại, để tôi không thể kết nối với trang web?

Chỉ cho đến khi bộ nhớ cache bên trong của trình duyệt bị xóa (hoặc hết thời gian) cho tên cụ thể đó là tên đó được tìm kiếm bên ngoài trình duyệt một lần nữa.

Nếu trình duyệt có tên được giải quyết trong bộ đệm, trình duyệt sẽ sử dụng lại.

Sử dụng để xóa bộ nhớ cache .

Hoặc chỉ cần đóng (chờ một lát) và khởi động lại trình duyệt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.