Linux에서 /etc/hosts
호스트 이름을 IP 주소로 확인하기 위해 DNS 는 어떻게 작동합니까?
- 에서 호스트 이름을 확인할 수있는 경우
/etc/hosts
DNS/etc/hosts
가 호스트 이름을 확인한 후 적용 하거나 확인 된 IP 주소를
/etc/hosts
“호스트 이름”으로 처리하여 재귀 적으로 해결합니까? -
내 브라우저 (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
웹 사이트에 연결할 수 없도록 다시 적용 되지 않는 이유는 무엇
입니까?
감사.
답변
이것은 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
답변
마지막 질문에 대답하려면 마지막으로 얻은 호스트 이름을 캐싱 /etc/hosts
하기 때문에 즉시 다시 적용되지 않습니다 . 항상 다시 가져 오려면 에서 로 설정 해야 합니다. 더 많은 정보 (약간 구식이지만) here . 이것이 주제가 아닌 경우 죄송합니다.firefox
google.com
network.dnsCacheExpiration
0
about: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()
, 이는 오래 전부터 사용되지 않습니다.
답변
파일 /etc/hosts
과 DNS가 함께 작동하지 않습니다. 독립적 인 이름 확인 (네트워크 이름)을 제공합니다.
그들을 연결하는 접착제는 리눅스 시스템 내부 /etc/nsswitch.conf
에 있습니다 . 에서 /etc/netsvc.conf
AIX 서버에 대한 시스템에서 윈도우 와는 나열 될 수있다 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 서버 (바인드, 언 바운드 등)에 의해 제어됩니다.
그래서:
- / etc / hosts에서 호스트 이름을 확인할 수있는 경우 DNS가 / etc / hosts 뒤에 적용되어 호스트 이름을 확인하거나 / etc / hosts의 확인 된 IP 주소를 “호스트 이름”으로 처리하여 재귀 적으로 해결합니까?
없음
호스트 이름이 해결 될 수있는 경우 /etc/hosts
는가 DNS
(파일이 DNS 이전 인 경우)에는 적용되지 않습니다.
해석 된 IP 주소도 “호스트 이름”으로 취급 되지 않습니다 .
해결 된 주소입니다.
브라우저
브라우저는 모든 방법을 사용하여 이름을 확인합니다 (확인 된 이름의 캐시를 확인한 후). 시스템 제공 방법을 사용하는 경우에만 위에 주어진 순서가 적용됩니다. 브라우저는 다른 프로그램과 마찬가지로 모든 DNS 서버에 직접 연결하도록 선택할 수 있습니다.
시스템 순서가 /etc/hosts
이전 DNS
인 경우 해당 파일의 항목이 DNS
분석 서비스 보다 우선 함을 의미합니다 .
그래서:
- … / etc / hosts가 호스트 이름을 확인하기 위해 DNS를 재정의한다는 의미입니까?
예 (브라우저가 시스템 제공 해상도를 사용하는 경우).
/etc/hosts
웹 사이트에 연결할 수 없도록 다시 적용 되지 않는 이유는 무엇 입니까?
해당 특정 이름에 대해 브라우저 내부 캐시가 지워지거나 시간 초과 될 때까지만 해당 이름이 브라우저 외부에서 다시 검색됩니다.
브라우저의 이름이 캐시에서 확인되면 브라우저는 다시 사용합니다.
또는 브라우저를 닫고 (잠깐 기다렸다가) 브라우저를 다시 시작하십시오.