פתרון-שם-DNS: חיפוש רשומות DNS ראשיות בפוורשל

אם אתה ניהול שרתי אינטרנט או דואר, ידוע לך כמה הם תלויים ברשומות DNS שמוגדרות בצורה תקינה. חסרות רשומות DNS יכולות לגרום לבעיות רבות, כולל אי-אפשרות למשתמשים למצוא את האתר שלך או לאסוף דואר אלקטרוני. דבר חיובי שישנה את הכלי PowerShell Resolve-DnsName, ועם זאת, ניתן לאוטומטזיה בבדיקה של רשומות DNS דרך תסריטים.

היום של מנהל כבר מלא מספיק, ובדיקה ידנית של אם רשומות DNS ניתן לפתור כרוך ביותר מאמץ ידני.

במאמר זה, תלמד איך ולמה להשתמש ב-cmdlet של Resolve-DnsName ב-PowerShell לשאילתת רשומות DNS. עד סיום המאמר, תלמד גם כיצד ליצור סקריפט בסיסי ליצירת דוח על רשומות DNS שבחרת למקודד.

דרישות מקדימות

מדובר במדריך צעד-אחר-צעד, ואם תתכוון לקבוע עם הדוגמאות, יידרשו לך:

Resolve-DnsName: מפעיל הפקודות DNS של PowerShell

ישנם יותר מדרך אחת לבצע שאילתת DNS. ה-cmdlet Resolve-DnsName דומה לכלי שורת הפקודה nslookup שמגיע עם Windows או לכלי dig אם אתה מנהל Linux.

קיימות אתרים שמציעים שירותי ניטור/דיווח על רשומות DNS. אבל, שירותים צד שלישי אלו כמעט תמיד עולים כסף. ישנה אלטרנטיבה חינמית, שגם מאפשרת לך להציג את יכולות התסריט שלך!

הפקודה Resolve-DnsName, כפי שמשמעות השמו, מפענחת שמות DNS לכתובות IP ולהיפך. פקודה זו היא חלק ממודול הפווורשל dnsclient שמגיע, כפי שרשום כאן, עם Windows 10, Windows Server 2012/R2, Windows Server 2016 ו-Windows Server 2019.

מכיוון ש־Resolve-DnsName היא פקודת PowerShell, היא מחזירה את התוצאות שלה כאובייקטים שניתן לאחסן, לשנות ולייצא. לדוגמה, חיפוש הרשומה DNS של google.com באמצעות הפקודה Resolve-DnsName google.com יחזיר את התוצאות הבאות.

DNS Record lookup result using Resolve-DnsName

התוצאה הוחזרה כ־אובייקט שמאפשר לך לייצא את התוצאות לקובץ CSV, או לשנות את הפורמט כדי ליצור דוחות HTML.

פקודת Resolve-DnsName שונה מכלי ה־nslookup הישן. nslookup מחזיר מחרוזת פשוטה. ניתן לראות משלוח בדוגמת התמונה למטה. אם תרצה לפרק את המידע הזה, תצטרך להתמודד עם קושי.

DNS record lookup result using nslookup

שאילתת סוגי רשומות DNS שונות

כברירת מחדל, Resolve-DnsName מתעניין בסוגי רשומות DNS מסוג A ו-AAAA. לדוגמה, אם תחפש את רשומת ה-DNS עבור gmail.com באמצעות הפקודה למטה:

Resolve-DnsName -Name gmail.com

כפי שאתה יכול לראות למטה, יוחזרו רק הרשומות AAAA ו-A. זה קורה משום שלא צוין את סוג רשומת ה-DNS שיש לחפש.

DNS record for gmail.com

עכשיו, בהתחשב בכולנו יודעים ש-gmail.com הוא דומיין דואר אלקטרוני שבו משתמשת שירות הדואר של Google, יש כנראה רשומת MX הקשורה אליו, נכון? ובכן, אין צורך להניח כשאפשר לוודא באמצעות הפקודה הזו:

Resolve-DnsName -Name gmail.com -Type MX

הפלט המוצג בצילום המסך למטה מראה את רשימת רשומות ה-MX עבור gmail.com.

MX Record list of gmail.com

כדי לדעת יותר על סוגי הרשומות השונים שניתן להשתמש בהם עם Resolve-DnsName, בקר בקישור הזה וחפש את הטבלה לפרמטר -Type. או ניתן פשוט לעיין בעזרת הפקודה של get-help Resolve-DnsName.

שימוש בשרתים ספציפיים לחיפוש DNS

Resolve-DnsName משתמש בכתובות של שרתי DNS המוגדרות במחשב שלך כברירת מחדל. אך, תוכל גם להגדיר את Resolve-DnsName להשתמש בשרת DNS ספציפי בעת ביצוע חיפושים.

לדוגמה, אם ברצונך להשתמש ב־Google Public DNS לחיפוש רשומות, תוכל לעשות זאת על ידי הוספת פרמטר -Server בפקודה שלך, דומה לדוגמה למטה.

# כתובות שרתי Google Public DNS
$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 אחר, ייתכן ותקבל את אותה התוצאה.

יתכן וישנם רבים סיבות להשתמש בשרתי DNS שונים עם Resolve-DnsName. חלק מהסיבות האלו עשויות לכלול:

  • מהירות – יתכן ויש שרתי DNS שמבצעים ביצועים יותר מהירים מאחרים.
  • אבטחה – יתכן ויש שרתי DNS שכוללים יותר אמצעים לאבטחה שמונעים גניבות ותקיפות.
  • זמינות רשומות – ברוב התרחישים, ארגונים מחזיקים שרתי DNS פנימיים שמכילים את האזורים והרשומות לשמות המתבצעות רק בפנים. במקרה זה, חיפוש שם פנימי באמצעות שרת DNS ציבורי יכשל.
DNS record lookup failure
  • שרתי DNS אינם העברת בקשות – ישנם ארגונים שאינם מאפשרים העברת DNS. שימוש בהם לחיפוש DNS של רשומות DNS ציבוריות יכשל.
  • איתור תקלה ובדיקה – כשהשרתים DNS המועדפים עליך חוויים בעיות, ייתכן שתרצה לבדוק את החיפושים שלך באמצעות שרת DNS אחר.

דיווח על רשומות DNS באמצעות סקריפט PowerShell

עכשיו שלמדת את היסודות של שימוש בפקודת Resolve-DnsName, בסעיף זה תלמד ליצור סקריפט PowerShell כדי לנטר ולדווח על רשומות DNS. אתה צריך להיות מסוגל להחיל את הידע שצברת בקטעים הקודמים עד כה בבניית הסקריפט הזה.

התחל את עורך הסקריפט שאתה מעדיף וצור קובץ חדש בשם GetDnsRecord.ps1.

הגדרת המשתנים

ראשית, קבע את המשתנים שיש להשתמש בהם. המשתנים אלו יכילו את השמות של רשומות ה-DNS שתרצה שהסקריפט שלך יבצע שאילתות עבורם

  • $NameList – משתנה זה יחזיק את השמות של רשומות ה-DNS שתרצה שהסקריפט ישאיר עבורן שאילתות
  • $Serverlist – השתמש במשתנה זה כדי לציין את שרתי ה-DNS שישמשו לסקריפט לביצוע שאילתות.

העתק את הקוד למטה והדבק אותו בתחילת הסקריפט שלך.

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

ביצוע שאילתות DNS

הבא, יש לקוד להיות מסוגל לחפש את הרשומה DNS של כל אחד מהשמות שצויינו. במקרה זה, יש להשתמש בלולאת foreach (foreach loop) כדי לעבור על רשימת הרשומות ולחפש כל שם באמצעות Resolve-DnsName.

השורה $FinalResult = @() יוצרת מערך ריק שבו יישמר התוצאה הסופית. לאחר מכן, באמצעות לולאת foreach, PowerShell מעביר למשתנה בשם $Name כל פריט במשתנה $NameList.

בכל איטרציה, השורה $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

סיכום

במאמר זה, למדת על היסודות של כיצד להשתמש ב-cmdlet Resolve-DnsName כדי לבצע חיפוש ברשומות DNS בפוורשל. למדת גם על ההבחנה בין Resolve-DnsName לכלים אחרים כמו יישות ה-nslookup.

ראית איך ניתן להשתמש ב-Resolve-DnsName בתסריט כדי לאוטומטיזציה של חיפוש רשומות DNS. זה יכול לשמש ככלי לניטור כדי לוודא שאתה מודע למצב הנוכחי של רשומות DNS שאתה יודע עליהן.

על ידי שימוש בכישורי תסריט PowerShell שלך, ניתן לשדרג את תסריט הדיווח על ידי הוספת קוד לשליחה אוטומטית של הדוח באמצעות דואר אלקטרוני לנמענים מסוימים. ניתן גם לשנות אותו כך שיצירת פלט HTML יהיה אפשרית ומושכלת לעין.

לבסוף, Resolve-DnsName הוא כלי מצוין לחיפוש ב-DNS בין אם אתה משתמש בו באופן ידני או לצורך אוטומציה בתסריטים. כעת יש לך הבנה על איך זה עובד, וזה תלוי בך למצוא דרכים להשתמש בו כחלק ממשימות הניהול שלך.

קריאה נוספת

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