/etc/resolv.conf 에 DNS 서버를 두 대 적었다. 한 대는 사내 시스템 이름을, 다른 한 대는 AD 도메인 이름을 알고 있다. 순서를 바꾸면 한쪽은 풀리고 다른 쪽이 안 풀린다. 두 대를 동시에 제대로 쓸 수 없다.
resolv.conf 의 nameserver 항목은 여러 개를 적어도 질의를 나눠 보내지 않는다. 리졸버는 첫 번째 서버에 묻고, 타임아웃이 나야 다음 서버로 넘어간다.
여기서 핵심은 "모른다" 는 응답도 응답 이라는 점이다. 첫 번째 서버가 NXDOMAIN 을 돌려주면 리졸버는 답을 받은 것이므로 두 번째 서버에 묻지 않는다. 두 번째 서버가 그 이름을 알고 있어도 소용없다.
즉 이 구성이 동작하는 경우는 첫 번째 서버가 응답 자체를 하지 않을 때 뿐이고, 그때는 타임아웃만큼 매번 느려진다.
options timeout:1 attempts:2
이런 옵션은 실패를 빨리 넘기게 해 줄 뿐, NXDOMAIN 상황에는 아무 도움이 되지 않는다.
클라이언트는 DNS 서버 한 대만 보게 하고, 그 서버가 자기가 모르는 존을 다른 서버에 넘기도록 구성한다. 이것이 정석이다.
zone "ad.example.com" IN {
type forward;
forwarders { 192.0.2.53; };
forward only;
};
options {
forwarders { 198.51.100.53; };
};
ad.example.com 으로 끝나는 질의만 AD DNS 로 넘기고, 나머지는 기본 포워더로 보낸다.
DNS 관리 콘솔의 조건부 전달자(Conditional Forwarders) 에 도메인과 대상 서버를 등록한다. AD 환경에서는 이쪽이 더 자연스럽다.
가벼운 대안이다. 클라이언트 쪽에 두어도 된다.
server=/ad.example.com/192.0.2.53
server=198.51.100.53
도메인별로 인터페이스와 서버를 지정할 수 있다.
resolvectl domain eth1 '~ad.example.com'
resolvectl dns eth1 192.0.2.53
resolvectl status
당장 넘겨야 한다면 다음이 있다. 모두 임시다.
/etc/hosts 에 필요한 이름을 직접 적는다. 대상이 몇 개뿐이고 IP 가 바뀌지 않을 때만.resolv.conf 의 search 목록에 두 도메인을 모두 넣는다. 짧은 이름을 붙여 쓰는 경우에는 도움이 되지만, FQDN 질의에는 영향이 없다.search example.com ad.example.com
nameserver 198.51.100.53
search 항목이 많으면 이름 하나를 푸는 데 질의가 여러 번 나간다. 6개를 넘기지 않는다.
dig +short app.example.com
dig +short @192.0.2.53 dc01.ad.example.com
resolvectl query dc01.ad.example.com
서버를 지정한 질의가 성공하는데 지정하지 않은 질의가 실패하면, 리졸버가 그 서버를 쓰지 않고 있다는 뜻이다. 포워딩 설정을 본다.
_kerberos._tcp 같은 SRV 레코드가 조회되는지도 확인한다.resolv.conf 를 덮어쓴다. 직접 고친 내용이 재부팅 후 사라진다면 연결 프로파일 쪽에서 설정하거나 관리를 끈다.resolv.conf 를 그대로 쓰지 않는다. 클러스터 DNS 가 앞에 있으므로 그쪽의 포워딩 설정을 본다.