누가 /etc/resolv.conf를 읽습니까?


16

My Centos 7 서버가 도메인 이름을 올바르게 확인하지 못합니다. 내가 보는 바로는, 현대 리눅스 시스템에서 /etc/resolv.conf종종 생성됩니다 dhclient, dnsmasq또는 Network Manager.

따라서 현대 리눅스의 네트워크 스택에 대한 일반적인 이론적 질문이 있습니다.

읽을 책임은 누구에게 /etc/resolv.conf있습니까? 도메인 이름 확인과 관련된 플레이어 (서비스 또는 커널 하위 시스템)는 무엇입니까?

SHORT ANSWER : Arch linux 매뉴얼에 따르면 도메인 이름 확인에 대한 고급 구성은 Name Service Switch API 에서 수행 /etc/nsswitch.conf 되며 사용됩니다 glibc.

glibcnss-resolveDNS 요청을 DNS 서버로 보내는 기능을 사용 합니다.

일반적으로 최신 CentOS 시스템 nss-resolve systemd-resolved 서비스에 의존합니다 . 경우 /etc/resolv.conf처럼 뭔가에 의해 생성 된 dhclient-script, systemd-resolved그것을 읽고 같은 구형 시스템의 행동을 모방, 호환성 모드에서 작동하는 BINDDNS 클라이언트를.

답변:


20

DNS 클라이언트 라이브러리

C 라이브러리에는 DNS 프로토콜에서 이름 대 주소 조회를 마무리하고 프록시 DNS 서버로 넘겨서 DNS 문제를 해결하는 DNS 클라이언트가 포함되어 있습니다. 이러한 DNS 클라이언트가 많이 있습니다. 운영 체제의 기본 C 런타임 라이브러리에있는 것이 ISC의 BIND에있는 것일 것입니다. 그러나 Daniel J. Bernstein의 dns도서관에서 c-ares를 통해 adns에 이르기까지 많은 사람들이 있습니다.

이들 중 일부는 고유 한 기본 구성 메커니즘을 포함하지만 일반적으로 resolv.confISC의 BIND C 클라이언트 라이브러리에 대한 구성 파일 인 BIND 라이브러리 호환성 모드를 읽습니다 .

NSS는이 위에 계층화되며에 의해 구성됩니다 nsswitch.conf. NSS 조회가 내부적으로 호출 할 수있는 것 중 하나는 DNS 클라이언트이며, nsswitch.confC 라이브러리의 NSS 코드에 의해 읽혀져 조회가 DNS 클라이언트에 전달되는지 여부와 다양한 응답을 처리하는 방법을 결정합니다.

nscd의 Name Services Cache Dæmon으로 인해이 아이디어에 약간의 합병증이 발생하지만 이는 단순히 C 라이브러리에 추가 상위 계층 클라이언트를 추가하여 로컬 서버에 특유의 프로토콜을 말하며, 이는 결국 서버 역할을합니다. DNS 프로토콜을 프록시 DNS 서버에 말하고있는 DNS 클라이언트 systemd-resolved유사한 합병증을 추가합니다.)

systemd-resolved, NetworkManager, connman, dhcpcd, resolvconf, 등은 즉시 다른 프록시 DNS 서버에 대화에 스위치 클라이언트에 DNS BIND DNS 클라이언트 구성 파일을 조정합니다. 이 WWW 사이트에는 이미 그러한 메커니즘과 관련된 비잔틴 세부 사항을 다루는 많은 답변이 있기 때문에 이것은이 답변의 범위를 벗어납니다.

유닉스 세계에서 작업을 수행하는보다 전통적인 방법은 머신 자체 또는 LAN에서 프록시 DNS 서버를 실행하는 것입니다. 따라서 FreeBSD 매뉴얼은 정상적으로 구성된 시스템에 대해 말하지만, 부재시 DNS 클라이언트 라이브러리의 기본 동작은 resolv.conf일반적으로 Unix 시스템 관리자가 갖는 것과 일치합니다. 127.0.0.1에서 수신 대기하는 프록시 DNS 서버입니다. (대한 FreeBSD의 매뉴얼은 resolv.conf그 DOCO 실제로 또한 ISC의 BIND에서 유래하고, BIND DNS 클라이언트 라이브러리가 같은 GNU C 라이브러리와 같은 다른 장소에 통합 된 곳도 찾을 수 물론 한 수 있습니다.)

추가 자료


7

훨씬 더 나은 FreeBSD 매뉴얼 페이지에서 resolv.conf :

 The resolver configuration file contains information that is read by the
 resolver routines the first time they are invoked by a process.

 On a normally configured system this file should not be necessary.  The
 only name server to be queried will be on the local machine, the domain
 name is determined from the host name, and the domain search path is
 constructed from the domain name.

1

/etc/resolv.conf호스트 이름 확인을 수행하는 * libc 호출 이 파일 을 읽습니다. 이것은 주로 getaddrinfo사용되지 않습니다 gethostbyname.

이러한 기능에 DNS 이름이 전달되면 다음 순서로 수행됩니다.

  1. 호스트 이름을 로컬에서 확인하십시오 /etc/hosts.
  2. 실패하면에 나열된 DNS 서버를 쿼리하십시오 /etc/resolv.conf.
  3. 이것도 실패하면 호스트 이름을 확인할 수 없습니다.

dnsmasq 를 언급 했으므로 로컬로 실행되는 DNS 서버입니다. 따라서 많은 현대 Linux 배포판에서 /etc/resolv.conf유일한 지적 사항 127.0.0.1은 로컬 dnsmasq가 청취하는 곳입니다. 그런 다음 dnsmasq는 쿼리 인터넷 DNS 서버를 전달하도록 구성됩니다. dnsmasq는 인터넷에 연결할 때 Network Manager에 의해 구성됩니다.


그것들은 시스템 호출이 아니며 * libc 함수입니다.
JoshuaRLi

@JoshuaRL 확실히 편집했습니다.
rexkogitans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.