파워셸에서 DNS 레코드 조회 마스터하기

웹 또는 메일 서버를 관리하고 있다면, 이러한 서버가 적절하게 구성된 DNS 레코드에 크게 의존하는 것을 알고 있을 것입니다. 누락된 DNS 레코드는 웹사이트를 찾을 수 없거나 이메일이 전달되지 않는 등 다양한 문제를 일으킬 수 있습니다. 다행히도 PowerShell의 Resolve-DnsName cmdlet이 존재하며, 이를 통해 DNS 레코드를 스크립팅을 통해 자동으로 모니터링할 수 있습니다.

관리자의 일정은 이미 충분히 바쁜데, DNS 레코드가 적절하게 해석될 수 있는지 수동으로 확인하는 것은 더 많은 수동 노력을 의미합니다.

이 문서에서는 PowerShell의 Resolve-DnsName cmdlet을 사용하여 DNS 레코드를 쿼리하는 방법과 사용하는 방법을 배울 수 있습니다. 이 문서의 끝에는 모니터링할 DNS 레코드의 기본 스크립트를 작성하는 방법도 배우게 될 것입니다.

전제 조건

이 문서는 실습을 따라하려면 다음이 필요합니다:

Resolve-DnsName: PowerShell DNS 리졸버

DNS 쿼리를 수행하는 방법에는 여러 가지가 있습니다. Resolve-DnsName cmdlet은 Windows에 기본으로 제공되는 nslookup 명령줄 도구나 Linux 관리자라면 dig 명령과 유사합니다.

일부 웹사이트에서는 DNS 레코드 모니터링/보고 서비스를 제공합니다. 그러나 대부분의 이러한 타사 서비스들은 물론 비용이 발생합니다. 무료 대안도 있습니다. 이 대안은 자신의 스크립팅 기술을 자랑할 수도 있습니다!

해당하는 이름 그대로 Resolve-DnsName cmdlet은 DNS 이름을 IP 주소로 해석하고 그 반대로 해석합니다. 이 cmdlet은 현재 작성 시점인 Windows 10, Windows Server 2012/R2, Windows Server 2016 및 Windows Server 2019와 함께 제공되는 dnsclient PowerShell 모듈의 일부입니다.

Resolve-DnsName은 PowerShell cmdlet이므로 결과를 객체로 반환하여 저장, 조작 및 내보낼 수 있습니다. 예를 들어, Resolve-DnsName google.com 명령을 사용하여 google.com의 DNS 레코드를 조회하면 아래에 표시된 출력을 얻을 수 있습니다.

DNS Record lookup result using Resolve-DnsName

결과는 객체로 반환되어 결과를 CSV 파일로 내보낼 수 있거나 형식을 조작하여 HTML 보고서를 생성할 수 있습니다.

Resolve-DnsName cmdlet은 예전의 nslookup 유틸리티와 다릅니다. nslookup은 간단한 문자열을 반환합니다. 아래 스크린샷에서 예시를 볼 수 있습니다. 이 정보 중 일부를 파싱해야 하는 경우 어려움이 될 것입니다.

DNS record lookup result using nslookup

다양한 유형의 DNS 레코드 쿼리

기본적으로 Resolve-DnsName은 A 및 AAAA DNS 레코드 유형을 쿼리합니다. 예를 들어, 아래 명령을 사용하여 gmail.com의 DNS 레코드를 조회하는 경우:

Resolve-DnsName -Name gmail.com

아래에서 볼 수 있듯이, AAAA 및 A 레코드만 반환됩니다. 이는 조회할 DNS 레코드 유형이 지정되지 않았기 때문입니다.

DNS record for gmail.com

이제, 우리는 모두 Google의 이메일 서비스에서 사용하는 이메일 도메인인 gmail.com에 연결된 MX 레코드가 있을 것이라고 알고 있습니다. 이 명령을 사용하여 확인할 수 있으니 가정할 필요가 없습니다:

Resolve-DnsName -Name gmail.com -Type MX

아래 스크린샷에서 보이는 출력은 gmail.com에 대한 MX 레코드 목록을 보여줍니다.

MX Record list of gmail.com

Resolve-DnsName과 함께 사용할 수 있는 다른 레코드 유형에 대해 자세히 알아보려면 이 링크를 방문하고 -Type 매개변수에 대한 테이블을 찾으세요. 또는 get-help Resolve-DnsName 명령을 사용하여 Resolve-DnsName 도움말을 참조할 수 있습니다.

DNS 조회에 특정 서버 사용

Resolve-DnsName은 기본적으로 컴퓨터에 설정된 DNS 서버 주소를 사용합니다. 그러나, 룩업을 수행할 때 Resolve-DnsName을 특정 DNS 서버를 사용하도록 설정할 수도 있습니다.

예를 들어, 레코드를 조회하기 위해 Google 공개 DNS을 사용하고 싶다면, 아래 예시와 같이 명령어에 -Server 매개변수를 추가하면 됩니다.

# Google 공개 DNS 서버 IP
$dnsServer = @('8.8.8.8','8.8.4.4')
Resolve-DnsName adamtheautomator.com -Server $dnsServer

위의 명령어 실행 결과는 아래 스크린샷과 유사할 것입니다.

DNS record lookup results using a specific DNS servers

이 시점에서, 아마도 “왜 다른 DNS 서버를 사용해야 할까요?”라는 의문이 드실 수 있습니다. 이는 타당한 질문입니다. 기본 DNS 서버나 다른 DNS 서버를 사용하여 동일한 레코드를 조회해보면 아마도 동일한 결과를 얻게 될 것입니다.

Resolve-DnsName에 다른 DNS 서버를 사용하는 것에는 여러 가지 이유가 있을 수 있습니다. 이러한 이유 중 일부는 다음과 같을 수 있습니다:

  • 속도 – 일부 DNS 서버는 다른 DNS 서버보다 빠를 수 있습니다.
  • 보안 – 일부 DNS 서버는 해킹과 공격을 방지하기 위한 더 많은 보안 조치를 가지고 있을 수 있습니다.
  • 레코드 가용성 – 대부분의 경우, 기관은 내부 DNS 서버를 소유하고 있으며 내부적으로만 해결되는 이름의 영역과 레코드를 포함하고 있습니다. 이 경우, 공용 DNS 서버를 사용하여 내부 이름을 조회하면 실패합니다.
DNS record lookup failure
  • DNS 서버가 요청을 전달하지 않음 – 일부 기관은 DNS 전달을 허용하지 않습니다. 이러한 기관을 사용하여 공용 DNS 레코드를 조회하면 실패합니다.
  • 문제 해결 및 테스트 – 좋아하는 DNS 서버가 문제가 발생할 때는 다른 DNS 서버를 사용하여 조회를 테스트하고자 할 수 있습니다.

PowerShell 스크립트를 사용하여 DNS 레코드 보고

이제 Resolve-DnsName cmdlet을 사용하는 기본 사항을 배웠으므로, 이 섹션에서는 DNS 레코드를 모니터링하고 보고하는 PowerShell 스크립트를 만드는 방법을 배울 것입니다. 이전 섹션에서 습득한 지식을 적용하여 이 스크립트를 작성할 수 있어야 합니다.

선호하는 스크립트 편집기를 실행하고 GetDnsRecord.ps1이라는 새 파일을 생성하세요.

변수 정의

먼저, 사용할 변수를 결정하세요. 이러한 변수는 다음과 같습니다:

  • $NameList – 이 변수는 스크립트에서 조회하고자 하는 DNS 레코드의 이름을 보관합니다.
  • $Serverlist – 이 변수를 사용하여 스크립트에서 조회에 사용할 DNS 서버를 지정하세요.

아래 코드를 복사하여 스크립트의 시작 부분에 붙여넣으세요.

$NameList = @('adamtheautomator.com','powershell.org','xyz.local')
$ServerList = @('8.8.8.8','8.8.4.4')

DNS 조회 수행

다음으로 코드는 각 지정된 이름의 DNS 레코드를 조회할 수 있어야합니다. 이 경우에는 foreach 루프를 사용하여 레코드 목록을 반복하고 Resolve-DnsName을 사용하여 각 이름을 조회합니다.

$FinalResult = @()라인은 최종 결과가 저장될 빈 배열을 생성합니다. 그런 다음 foreach 루프를 사용하여 PowerShell은 $NameList 변수의 각 항목을 $Name이라는 변수에 전달합니다.

각 반복에서 $tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage라인은 성공적인 DNS 조회 결과를 저장하기 위해 네 개의 속성을 가진 임시 개체를 만듭니다.

다음으로, try{} 문을 사용하여 Resolve-DnsName 명령을 실행하여 DNS A 레코드를 조회하고 $tempObj 값을 채웁니다. DNS 조회가 실패하는 경우, catch{} 문은 오류를 잡고 오류가 $tempObj 개체에 포함됩니다.

각 반복이 끝날 때마다 $tempObj 개체의 값은 $FinalResult에 추가됩니다. 그리고 $NameList 배열의 마지막 항목이 처리되면 루프가 종료됩니다. 그런 다음 $FinalResult의 값이 표시됩니다.

아래의 코드를 복사하여 스크립트 끝에 붙여넣으세요. 어떤 값을 변경할 필요는 없습니다.

$FinalResult = @()
foreach ($Name in $NameList) {
    $tempObj = "" | Select-Object Name, IPAddress, Status, ErrorMessage
    try {
        $dnsRecord = Resolve-DnsName $Name -Server $ServerList -ErrorAction Stop | Where-Object { $_.Type -eq 'A' }
        $tempObj.Name = $Name
        $tempObj.IPAddress = ($dnsRecord.IPAddress -join ',')
        $tempObj.Status = 'OK'
        $tempObj.ErrorMessage = ''
    }
    catch {
        $tempObj.Name = $Name
        $tempObj.IPAddress = ''
        $tempObj.Status = 'NOT_OK'
        $tempObj.ErrorMessage = $_.Exception.Message
    }
    $FinalResult += $tempObj
}
return $FinalResult

스크립트를 저장한 후에는 PowerShell에서 해당 이름을 호출하여 스크립트를 실행하십시오. GetDnsRecord.ps1 이라고 합니다. 아래의 데모에서 출력 결과를 확인할 수 있습니다.

Script to lookup multiple DNS records using Resolve-DnsName

위의 결과에서 알 수 있듯이 출력은 객체이며, 아래의 명령을 사용하여 CSV 파일로 결과를 내보내는 데 유용합니다.

.\GetDnsRecord.ps1 | Export-Csv DnsRecord.csv -NoTypeInformation

CSV 출력은 다음과 유사한 모습입니다.

DNS record lookup report exported to a CSV file

결론

이 문서에서는 PowerShell에서 DSN 레코드 조회를 수행하는 방법에 대한 기본 사항을 배웠습니다. 또한 nslookup 유틸리티와 같은 다른 도구와 Resolve-DnsName의 차이점도 알아보았습니다.

Resolve-DnsName을 스크립트에서 사용하여 DNS 레코드 조회를 자동화하는 방법도 살펴보았습니다. 이는 관리하는 DNS 레코드의 현재 상태를 알 수 있도록하는 모니터링 도구로 유용할 수 있습니다.

PowerShell 스크립팅 기술을 사용하여 보고 스크립트를 개선하면 코드를 추가하여 지정된 수신자에게 보고서를 자동으로 이메일로 전송할 수 있습니다. 또한 시각적으로 매력적인 HTML 출력을 생성하도록 수정할 수도 있습니다.

최종적으로, Resolve-DnsName은 수동으로 사용하든 스크립트의 자동화에 사용하든 DNS 조회에 탁월한 도구입니다. 이제 작동 방식을 알았으니, 관리 작업의 일환으로 사용할 방법을 찾는 것은 여러분에게 달렸습니다.

추가 자료

Source:
https://adamtheautomator.com/resolve-dnsname/