`/ etc / hosts`와 DNS는 어떻게 호스트 이름을 IP 주소로 해석합니까?


10

Linux에서 /etc/hosts호스트 이름을 IP 주소로 확인하기 위해 DNS 는 어떻게 작동합니까?

  1. 에서 호스트 이름을 확인할 수있는 경우 /etc/hostsDNS /etc/hosts 가 호스트 이름을 확인한 후 적용 하거나 확인 된 IP 주소를 /etc/hosts"호스트 이름"으로 처리하여 재귀 적으로 해결합니까?
  2. 내 브라우저 (firefox 및 Google 크롬)에서 /etc/hosts다음을 추가하면 :

    127.0.0.1 google.com www.google.com
    

    브라우저의 주소 표시 줄에 www.google.com을 입력하고 입력을 누르면 웹 사이트에 연결되지 않습니다. 에서 해당 줄을 제거한 후 /etc/hosts웹 사이트에 연결할 수 있습니다. /etc/hosts호스트 이름을 확인하기 위해 DNS를 재정의 한다는 의미 입니까?

    에 줄을 다시 추가 한 /etc/hosts후에도 웹 페이지를 새로 고친 후에도 웹 사이트에 계속 연결할 수 있습니다. /etc/hosts웹 사이트에 연결할 수 없도록 다시 적용 되지 않는 이유는 무엇 입니까?

감사.


9
많은 웹 브라우저가 자체 DNS 서버와 DNS 캐시를 구현하고 시스템에 구성된 이름 조회 메커니즘을 참조하지 않도록주의하십시오. 즉, 일부 웹 브라우저 /etc/hosts는 로컬로 정의 된 이름 서버를 완전히 무시 합니다. 처음으로 목격하는 것은 매우 혼란 스럽습니다. (Chromium 기반 브라우저를보고 있습니다!)
— Christopher

@Christopher 나는 똑같은 말을하기 위해 여기에 왔습니다. 관련 unix.stackexchange.com/questions/363498/…
— Rui F Ribeiro

@Christopher / etc / hosts에 줄을 다시 추가 한 후에도 웹 페이지를 새로 고친 후에도 웹 사이트에 연결할 수 있습니다. 웹 사이트에 연결할 수 없도록 / etc / hosts가 다시 적용되지 않는 이유는 무엇입니까? Firefox의 DNS 캐시 때문입니까?
— Tim

@RuiFRibeiro이 Chromium 빌드 /etc/hosts는 시스템 정의 DNS 서버 ( github.com/Eloston/ungoogled-chromium ) 를 존중하는 것으로 보입니다 . Homebrew를 사용하여 macOS에 설치 : brew cask install eloston-chromium.
— Christopher

답변:


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 캐시가 작동하기 때문입니까?
— Tim

어떻게 systemd.resolver해상도에 영향을 미친다? NIS와 LDAP는 해상도 시스템에서 어디에 적합합니까? MacOS 시스템 또는 Windows 시스템의 순서는 무엇입니까?
— Isaac

@Tim 예, 브라우저가 캐시에서 데이터를 가져오고 있습니다.
— heemayl

7

마지막 질문에 대답하려면 마지막으로 얻은 호스트 이름을 캐싱 /etc/hosts하기 때문에 즉시 다시 적용되지 않습니다 . 항상 다시 가져 오려면 에서 로 설정 해야 합니다. 더 많은 정보 (약간 구식이지만) here . 이것이 주제가 아닌 경우 죄송합니다.firefoxgoogle.comnetwork.dnsCacheExpiration0about:config


(!) 참고로, 많은 프로그램은 표준 리졸버를 사용하지 않는 ( getaddrinfo(3), getnameinfo(3)[1]) 때문에 이 안됐다 .

먼저 인터페이스가 비동기 적이 지 않습니다. 중간 정도의 복잡한 프로그램은 그냥 수행하는 별도의 스레드를 생성 한 getaddrinfo()다음 자체 프로토콜을 발명하여 통신해야합니다 (그리고 완료되면 신호 를 getaddrinfo_a()보내는 조차 입력하지 마십시오 . 심지어 더 나쁩니다).

둘째, glibc(리눅스의 표준 C 라이브러리)에서 리졸버 구현 은 끔찍합니다. 임의의 동적 객체를 등 dlopen()뒤를 통해 주소 공간으로 가져 와서 어떤 식 으로든 포함하거나 정적으로 사용할 수 없게합니다. 연결된 실행 파일

많은 프로그램이 직접 표준 리졸버를 사용하지 않기 때문에, 그들은 또한 정확하게 동작을 복제하는 데 방해, 일부 또는 전부 무시하지 않는 /etc/resolv.conf, /etc/hosts, /etc/nsswitch.conf또는 /etc/gai.conf.

[1] 그리고 재 진행되지 않은 ipv4-only는 언급하지 않았으며 gethostbyname(), 이는 오래 전부터 사용되지 않습니다.


감사. "비 참가자"는 무엇을 의미합니까?
— Tim

1
그것은 당신이하고 있다면 주소 와 주소를 google = GHBN("google.com"); facebook = GHBN("facebook.com")모두 포함 할 수 있음을 의미합니다 . 두 개의 전화가 다른 스레드에서 수행되면 더 재미 있습니다 .Google 및 절반 페이스 북 또는 전체 쓰레기의 주소로 끝날 수 있습니다. googlefacebookfacebook.com
— Billy 삼촌

gethostbyname()지금 무엇을 대체 했습니까?
— Tim

1
getaddrinfo그에 대한 표준 기능이지만 이미 설명한 바와 같이 자체적으로 작동하므로 브라우저 또는 기타 실제 응용 프로그램에서 사용되지 않습니다.
— Billy 삼촌

실제로 Firefox와 Chrome은 자체 해결 방법을 사용합니다. 통찰력있는 메모에 감사드립니다.
— Rui F Ribeiro

6

파일 /etc/hosts과 DNS가 함께 작동하지 않습니다. 독립적 인 이름 확인 (네트워크 이름)을 제공합니다.

그들을 연결하는 접착제는 리눅스 시스템 내부 /etc/nsswitch.conf에 있습니다 . 에서 /etc/netsvc.confAIX 서버에 대한 시스템에서 윈도우 와는 나열 될 수있다 lookupd -configuration: (유사에 LookupOrder 검색, Cache FF DNS NI DS맥 OS 시스템에서).

각 이름 확인 서비스가 다른 수준의 확인을 조사 할 수 있기 때문에 실제 순서는 복잡해지고 일반적으로 복잡합니다. 마찬가지로 dnsmasq(일반적으로 가벼운 DNS 서버 127.0.0.1:53, 또는 ::1:53(또는 둘 다)) 일반적으로는 읽고 포함 /etc/hosts파일의 내용을. 또는 (와 같이 systemd.resolver점이없는 이름 만 확인해야하는 기본 확인자 )는 일부 조건에서 mycomputer점으로 구분 된 이름 ( mycomputer.here.dev.)에 대한 DNS 확인을 직접 호출 합니다.

일반적으로 서비스는 순서대로 호출되며 실패하지 않은 첫 번째 서비스가 우선하며 올바른 주소로 승인됩니다. 일반적인 기본 순서는 /etc/hosts(파일), mDNS (점으로 구분되지 않은 이름), DNS, NIS, NIS +, LDAP입니다. 일부 리눅스 시스템 에서는 서비스 의 컴퓨터 에 대한 최후의 해결책 이 있습니다 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) 이름 서비스 에만 적용하십시오 .

NIS 및 LDAP와 관련된이 (리눅스) 클라이언트 컴퓨터에 미치는 영향은 일반적으로 사용되는 DNS 서버 (바인드, 언 바운드 등)에 의해 제어됩니다.

그래서:

  1. / etc / hosts에서 호스트 이름을 확인할 수있는 경우 DNS가 / etc / hosts 뒤에 적용되어 호스트 이름을 확인하거나 / etc / hosts의 확인 된 IP 주소를 "호스트 이름"으로 처리하여 재귀 적으로 해결합니까?

없음

호스트 이름이 해결 될 수있는 경우 /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.