이 기사에서는 Windows Server를 실행하는 DNS 서버의 모든 사용자 쿼리에 대해 DNS 로깅을 활성화하는 방법, DNS 로그를 구문 분석 및 분석하는 방법을 보여줍니다. 나는 지점에서 오래된 Active Directory 도메인 컨트롤러를 폐기해야 하고 어떤 장치가 여전히 DNS 서버를 사용하고 있는지 이해해야 할 때 이 작업에 직면했습니다. DNS 로그를 활성화하고 분석한 후 장치를 찾고 다른 DNS 서버를 사용하도록 재구성할 수 있었습니다. 또한 이 방법은 Active Directory 네트워크에서 의심스러운 활동(악의적인 URL, 봇넷 호스트 등에 액세스)이 있는 호스트를 찾는 데 도움이 됩니다.
물론 DNS 호스트에 Wireshark, Microsoft 네트워크 모니터 또는 pktmon을 설치하여 포트 53에서 트래픽을 캡처할 수 있지만 Windows Server에서 기본 제공 DNS 쿼리 로깅을 사용하는 것이 더 쉽습니다.
기본적으로 DNS 로깅은 Windows Server에서 비활성화되어 있습니다. 활성화하려면:
- DNS 관리자 열기 스냅인(
dnsmgmt.msc
) 원하는 DNS 서버에 연결합니다. - 속성을 열고 디버그 로깅으로 이동합니다. 탭;
- 디버깅을 위한 로그 패킷 사용 옵션;
- 그런 다음 로깅 옵션을 구성할 수 있습니다. DNS 패킷 방향, 프로토콜(UDP 및/또는 TCP), 패킷 유형(단순 DNS 쿼리, 업데이트 또는 알림)을 선택합니다.
- IP 주소로 패킷 필터링 사용 옵션을 사용하면 수신 또는 발신 패킷을 기록할 IP 주소를 지정할 수 있습니다(로그 크기를 크게 줄일 수 있음).
- 로그 파일 경로 및 이름 상자에서 모든 이벤트를 기록할 텍스트 파일의 이름을 지정합니다. 기본적으로 DNS 로그의 크기는 500MB로 제한됩니다. 도달하면 이전 DNS 조회 이벤트를 새 조회 이벤트로 덮어씁니다.
또한 PowerShell을 사용하여 DNS 쿼리 로깅을 활성화하거나 현재 설정을 가져올 수 있습니다.
Get-DnsServerDiagnostics
로드가 많은 Windows DNS 호스트에서 DNS 쿼리 로깅은 CPU, RAM 및 스토리지에 추가 로드를 유발할 수 있습니다(디스크 성능이 충분히 높아야 함).
그런 다음 모든 컴퓨터에서 서버에 대해 DNS 쿼리를 실행합니다. 예를 들어, Windows Server를 실행하는 DNS 호스트의 IP 주소가 192.168.13.10인 경우:
nslookup woshub.com 192.168.13.10
또는 PowerShell을 사용하여 DNS 주소 확인을 실행하십시오.
Resolve-DnsName -Name woshub.com -Server 192.168.13.10
DNS 조회 쿼리가 요청한 호스트의 클라이언트 IP 주소를 반환했습니다.
쿼리가 DNS 서버 로그에 나타나는지 확인합시다.
이렇게 하려면 클라이언트 IP 주소(192.168.13.130
)로 텍스트 로그 파일을 검색하십시오. ). 메모장에서 로그 파일을 열거나 PowerShell을 사용하여 grep할 수 있습니다.
get-content "C:\Logs\dc01dns.log" | Out-String -Stream | Select-String "192.168.13.130"
다음은 이벤트 예입니다.
11/17/2021 6:00:00 AM 0D0C PACKET 00000272D98DD0B0 UDP Rcv 192.168.13.130 0002 Q [0001 D NOERROR] A (8)woshub(2)com(0)
보시다시피 (8)woshub(2)com(0)
이름을 확인하기 위한 DNS 쿼리 수신됨(rcv
) 클라이언트 192.168.13.130
UDP
이상 , DNS 서버가 성공적으로(NOERROR
)에 응답했습니다(snd
). ).
Field # Information Values ------- ----------- ------ 1 Date 2 Time 3 Thread ID 4 Context 5 Internal packet identifier 6 UDP/TCP indicator 7 Send/Receive indicator 8 Remote IP 9 Xid (hex) 10 Query/Response R = Response blank = Query 11 Opcode Q = Standard Query N = Notify U = Update ? = Unknown 12 Flags (hex) 13 Flags (char codes) A = Authoritative Answer T = Truncated Response D = Recursion Desired R = Recursion Available 14 ResponseCode 15 Question Type 16 Question Name
이러한 DNS 로그 파일은 특정 형식으로 인해 수동으로 구문 분석 및 분석하기 어렵습니다. 따라서 Get-DNSDebugLog.ps1을 사용하여 DNS 쿼리 로그를 보다 편리한 형식으로 변환해야 합니다. 스크립트.
이 PowerShell 스크립트는 내 것이 아니지만 현재 TechNet Scriptcenter에서 사용할 수 없으므로 내 GitHub 리포지토리(https://github.com/maxbakhub/winposh/blob/main/Get-DNSDebugLog.ps1)에 저장했습니다.
파일을 디스크에 다운로드합니다. 그런 다음 PowerShell 스크립트가 현재 콘솔 세션에서 실행되도록 허용합니다.
Set-ExecutionPolicy -Scope Process Unrestricted
Get-DNSDebugLog.ps1에서 세션으로 함수를 가져옵니다.
. C:\ps\Get-DNSDebugLog.ps1
그런 다음 DNS 로그를 보다 편리한 형식으로 변환합니다.
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | format-table
또는 Excel에서 추가 분석을 위해 결과를 CSV 파일로 내보낼 수 있습니다(또는 PowerShell에서 직접 Excel 파일에 액세스하여 원하는 DNS 쿼리를 작성할 수 있음).
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | Export-Csv C:\log\ProperlyFormatedDNSLog.csv –NoTypeInformation
파일을 Excel로 내보내고 DNS 쿼리를 분석하는 데 사용할 수 있습니다(파일에는 DNS 서버에서 요청한 호스트 IP 주소와 DNS 이름이 포함되어 있습니다).
또한 Log Parser 2.2를 사용할 수 있습니다. (https://docs.microsoft.com/en-us/archive/blogs/secadv/parsing-dns-server-log-to-track-active-clients) DNS 로그 파일을 구문 분석하고 분석합니다. 예를 들어 아래 명령은 각 IP 주소의 DNS 쿼리 수를 표시합니다.
LogParser.exe -i:TSV -nskiplines:30 -headerRow:off -iSeparator:space -nSep:1 -fixedSep:off -rtp:-1 "SELECT field9 AS IP, REVERSEDNS(IP) AS Name, count(IP) as QueryCount FROM "C:\Logs\dc01dns.log" WHERE field11 = 'Q' GROUP BY IP ORDER BY QueryCount DESC"
이 예에서는 텍스트 파일을 사용하여 DNS 로그를 수집했습니다. Windows Server 2012 이상에서는 DNS 쿼리를 이벤트 뷰어(Microsoft-Windows-DNS-Server/Audit
)에 직접 기록할 수 있습니다. ). 하지만 제 생각에는 텍스트 DNS 로그가 훨씬 분석하기 쉽습니다.
DNS 쿼리 로그를 활성화하고 분석한 결과, 여전히 DNS 서버를 사용하고 있는 장치의 IP 주소를 찾아 다른 DNS 서버로 재구성했습니다. 이전 DC에 FSMO 역할이 포함되어 있지 않으면 제거할 수 있습니다(여기서 AD 사용자 로그온 이벤트는 중요하지 않음).