전달자(forwarder) 는 자기 영역에 없는 이름을 스스로 재귀 질의로 풀지 않고 지정한 상위 DNS 로 넘기는 설정이다. AD 통합 DNS 를 쓰는 환경에서 내부 이름은 내부에서 풀고 외부 이름만 밖으로 보내는 구조를 만들 때 쓴다.
조건부 전달자(conditional forwarder) 는 여기서 한 단계 더 좁혀, 특정 도메인만 지정한 서버로 보낸다. 다른 조직의 도메인이나 사내 별도 구간을 붙일 때 쓴다.
이름 하나를 받았을 때 DNS 서버가 보는 순서다. 위에서 답이 나오면 아래로 내려가지 않는다.
조건부 전달자가 전달자보다 앞선다는 점이 중요하다. 전체를 8.8.8.8 로 넘기더라도 특정 도메인만 사내 DNS 로 빼는 구성이 가능하다.
GUI 는 dnsmgmt.msc → 서버 우클릭 → 속성 → 전달자 탭 → 편집이다.
PowerShell 은 다음과 같다.
Add-DnsServerForwarder -IPAddress 8.8.8.8,1.1.1.1
Get-DnsServerForwarder
Remove-DnsServerForwarder -IPAddress 8.8.8.8 -Force
전달자를 두 개 이상 등록하면 응답이 빠른 쪽을 우선 쓴다. 순서를 고정하고 싶으면 Set-DnsServerForwarder -IPAddress 로 목록 전체를 원하는 순서로 다시 지정한다.
전달자가 모두 응답하지 않을 때 루트 힌트로 넘어가지 않게 하려면 다음을 끈다. 외부로 나가는 경로를 전달자 하나로 통제하려는 폐쇄망 구성에서 쓴다.
Set-DnsServerForwarder -UseRootHint $false
Add-DnsServerConditionalForwarderZone -Name 'corp.example.com' -MasterServers 192.168.1.10,192.168.1.11
Get-DnsServerZone | Where-Object { $_.ZoneType -eq 'Forwarder' }
도메인 컨트롤러가 여러 대라면 AD 에 복제해 모든 DNS 서버가 같은 설정을 갖게 한다.
Add-DnsServerConditionalForwarderZone -Name 'corp.example.com' `
-MasterServers 192.168.1.10 `
-ReplicationScope 'Forest'
대상 서버가 재귀를 허용하지 않으면 조건부 전달이 실패한다. 상대가 권한 서버이기만 하고 재귀를 막아 둔 경우가 있으니 확인한다.
전달자를 거치는지 아닌지를 나누어 확인한다.
Resolve-DnsName www.example.com -Server 127.0.0.1
Resolve-DnsName www.example.com -Server 8.8.8.8 # 전달 대상이 직접 응답하는지
Clear-DnsServerCache # 캐시된 답 때문에 헷갈릴 때
풀리지 않으면 순서대로 본다.