`/ 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 호스트 확인 순서를 따르려면 다음 getenthosts같이 데이터베이스로 사용하십시오 .

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.