دستور Resolve-DnsName در پاورشل

آموزش کار با دستور Resolve-DnsName در پاورشل

دستور Resolve-DnsName در پاورشل می‌تواند DNS nameها را به آدرس‌های آیپی تبدیل کند و برعکس! در این مقاله نحوه کار با این دستور را توضیح داده‌ایم.

زیر نظر داشتن رکوردهای DNS یک ضرورت است! متخصصان امر می‌دانند که درستی این رکوردها برای عملکرد بهینۀ سیستم‌ها چقدر اهمیت دارد. دستور Resolve-DnsName در پاورشل، یک راهکار ساده و کاربردی است که امکان رصد دقیق این رکوردها را فراهم می‌کند.

شما در حال خواندن یک مقالۀ آموزشی هستید که قرار است زیروبم این دستور را به‌صورت مختصر و مفید بررسی کند و چگونگی بهره‌وری حداکثری از آن را یادتان بدهد؛ پس همراهمان بمانید.

اجازه دهید اول ببینیم پاورشل چیست که بستر اجرای این دستور به حساب می‌آید، بعد برویم سراغ آموزش اصلی.

PowerShell چیست؟

پاورشل در واقع حکم Command Line در لینوکس را برای سیستم‌عامل ویندوز دارد. ابزاری قدرتمند که مایکروسافت به کاربران ویندوز ارائه می‌کند و به آن‌ها اجازۀ مدیریت بهینۀ امور مربوط به سیستمشان را می‌دهد.

پاورشل چیست

درحالی‌که شاید برخی فکر کنند نهایتاً بتوان دستورات ساده و اولیه را از طریق PowerShell به کامپیوتر منتقل کرد، باید بگوییم که توانایی‌های این ابزار فراتر از این حرف‌ها است. علاوه‌بر دستورهای ساده، می‌توانید با نوشتن Scriptهای مفصل، فرایندهای پیچیده را خودکارسازی کنید. اسکریپت‌هایی که می‌توانند بسیار ساده یا حاوی پیچیدگی‌های زیاد باشند.

علاوه‌بر این‌ها، می‌توان از پاورشل برای پیکربندی یک فریمورک مدیریتی برای سیستم هم بهره برد. بگذارید ساده‌تر بگوییم: با این ابزار مایکروسافت، می‌توانید پیکربندی مطلوبی برای سیستم را طراحی و آماده کنید و مطمئن شوید همۀ امور در سیستم به‌شکلی یکپارچه، آن‌طور که شما می‌خواهید پیش می‌روند.

پس به‌طور کلی، با یک محیط خط فرمان طرفیم که می‌توانیم از طریق آن، دستورات مختلف را به کامپیوتر خود منتقل کنیم.

بد نیست با چند ویژگی جالب این ابزار هم آشنا شویم و بعد بپردازیم به دستور Resolve-DnsName در پاورشل.

پیشنهاد خواندنی: نحوه بررسی تنظیمات DNS با سایت intodns

ویژگی‌های PowerShell

با اینکه این محصول مایکروسافت مختص ویندوز است، در موقعیت‌هایی به‌خصوص، امکان استفاده از آن روی لینوکس و حتی مک هم وجود دارد؛ این دست‌ودلبازی‌ها از مایکروسافت‌ بعید است! ولی خب حقیقت دارد.

بعد از آن، خوب است بدانید پاور شکل ماهیتی Objec-based (شی‌محور) دارد. یعنی با چیزهای واقعی در دنیای واقعی سروکار دارد. مثل فایل‌ها، کاربران و پردازشگرها. به همین خاطر، از ابزارهای خط فرمان معمولی و سنتی که می‌شناسیم، قدرتمندتر است و عملکرد بهتری ارائه می‌کند.

ضمناً، مجموعه دستوراتی که می‌توان به این ابزار داد هم بسیار فراوان و غنی هستند. تازه خودتان هم می‌توانید دستوری مخصوص و سفارشی بسازید!

پس در کل، داریم راجع‌به ابزاری قدرتمند و منعطف صحبت می‌کنیم که می‌تواند به کار طیف گسترده‌ای از کاربران بیاید. از ادمین‌های سیستم گرفته تا متخصصان IT؛ یا حتی کاربران معمولی که فقط می‌خواهند برخی امور ساده و روزمره را خودکارسازی کنند.

بیایید تمرکزمان را ببریم روی موضوع اصلی مقاله. آن‌هایی که تجربۀ مدیریت وب‌سرور یا میل‌سرور را دارند، می‌دانند این فرایند تا چه حد به پیکربندی درست DNS بستگی دارد. وقتی رکوردهای DNS مشکل داشته باشند، احتمال وقوع انواع مختلفی از مشکلات وجود دارد.

مثلاً امکان دارد کاربران نتوانند وارد صفحات مختلف سایت شوند؛ یا شاید ایمیل ارسالی هیچ‌وقت به مقصد نرسد.

خوشبختانه، دستوراتی وجود دارند که می‌توان آن‌ها را در پاورشل وارد کرد و فرایند خطیر بررسی رکوردهای DNS را خودکارسازی کرد.

بیایید کمی بیشتر با این دستور آشنا شویم.

پیشنهاد خواندنی: آموزش اتصال دامنه به هاست + نحوه تنظیم DNS

دستور Resolve-DnsName در پاورشل چیست؟

همین اول کار بگوییم که برای بررسی DNSها، بیشتر از یک راه وجود دارد و این دستور تنها تیر درون تفنگتان نیست! Resolve-DnsName، شباهت زیادی به nslookup که در ابزار command-line سنتی ویندوز وارد می‌کنید دارد.

اگر بیشتر با لینوکس کار کرده‌اید و این سیستم‌عامل را بهتر می‌شناسید، می‌توانید آن را چیزی مثل دستور dig در نظر بگیرید.

علاوه‌بر این‌ها، سایت‌ها و پلتفرم‌هایی هستند که خدمات مانیتورینگ و ارائۀ گزارش از رکوردهای DNS را ارائه می‌کنند؛ البته که خدمات این سایت‌های واسط رایگان نیست و باید برای برخورداری از آن‌ها دست‌به‌جیب شوید؛ منتهی روشی که قرار است در این آموزش به آن بپردازیم، کاملاً رایگان است؛ همچنین، اجازه می‌دهد مهارت‌های اسکریپت‌نویسی خود را تقویت کنید.

دستور Resolve-DnsName که موضوع اصلی مقالۀ ما است، می‌تواند DNS nameها را به آدرس‌های آیپی تبدیل کند و برعکس! در واقع این دستور بخشی از یک ماژول پاورشل با نام dnsclient است که با ویندوز ۱۰ یا بالاتر، ویندوز سرور ۲۰۱۲/R2، ویندوز سرور ۲۰۱۶ و ویندوز سرور ۲۰۱۹ کاملاً سازگاری دارد.

چون دستور مورد بحث مختص ابزار PowerShell است، نتیجه‌ای که در پاسخ استفاده از آن دریافت می‌کنید، شی محسوب می‌شود. اشیایی که می‌توانید آن‌ها را ذخیره کنید، آن‌طور که می‌خواهید تغییرشان دهید و حتی از آن‌ها خروجی بگیرید.

برای مثال، بعد از جست‌وجو برای پیدا کردن رکورد DNS گوگل، پاسخی مشابه آنچه در تصویر زیر می‌بینید را خواهید گرفت:

نتیجه دستور Resolve-DnsName

همان‌طور که می‌بینید، نتیجه به‌عنوان یک object پاسخ داده شد که می‌توانید از آن در قالب یک فایل CSV خروجی بگیرید؛ حتی می‌توانید نتیجه را دستکاری کنید تا گزارشی در قالب HTML به دستتان برسد. اینجا است که تفاوت دستور Resolve-DnsName در پاورشل با روش‌های قدیمی‌تر مثل nslookup نمایان می‌شود.

دستور قدیمی‌تر، یعنی nslookup که گفتیم باید آن را در command-line سنتی وارد کنید، یک رشته از حروف و اعداد (String) ساده را در پاسخ برمی‌گرداند. مثل چیزی که در تصویر زیر می‌بینید:

نتیجه nslookup

اگر قصد استخراج هرگونه اطلاعات از این پاسخ را داشته باشید، کار سختی پیش رویتان قرار دارد و با پیچیدگی‌های زیادی مواجه خواهید شد.

حالا وقت آن است که آموزش را یک قدم جلوتر ببریم و ببینیم چطور می‌توان این دستور را در عمل به کار گرفت.

پیشنهاد خواندنی: سیستم عامل لینوکس چیست و چه کاربردهایی دارد؟

نحوه استفاده از دستور Resolve-DnsName در پاورشل

در ادامه، راهنمایی گام‌به‌گام را خواهید دید که اگر می‌خواهید مطابق آن عمل کنید، باید:

  • سیستم‌عامل کامپیوترتان ویندوز ۱۰ یا نسخه‌های بالاتر آن باشد؛
  • به ویندوز پاورشل ۵.۱ یا ۷.۰ دسترسی داشته باشید؛
  • به یک ویرایشگر اسکریپت (Script Editor) مثل Visual Studio Code ،Atom یا ++Notepad دسترسی داشته باشید.

بعد از تهیۀ این پیش‌نیازها، آستین‌ها را بالا بزنید و بیایید یادتان بدهیم که چطور می‌توان از دستور Resolve-DnsName در پاورشل استفاده کرد.

پرس‌وجو انواع مختلف رکوردهای DNS

به‌طور پیش‌فرض و در خام‌ترین حالت ممکن، دستور Resolve-DnsName وضعیت رکوردهای A و AAAA را پرس‌وجو می‌کند و نتیجه را به کاربر اطلاع می‌دهد.

فرض می‌کنیم دنبال رکوردهای gmail هستید و از دستور سادۀ زیر استفاده می‌کنید:

Resolve-DnsName -Name gmail.com

نتیجه را در تصویر زیر ببینید. هیچ‌ اطلاعاتی افزون بر رکوردهای A و AAAA ارائه نمی‌شود؛ چون مشخص نشده که کاربر دنبال کدام نوع از رکوردهای DNS می‌گردد و دستور هم به‌صورت پیش‌فرض این دو رکورد را پرس‌وجو کرده است:

نتیجه پیش‌فرض Resolve-DnsName

حالا با توجه به اینکه می‌دانیم gmail.com دامنه‌ای است که توسط سرویس ایمیل گوگل مورد استفاده قرار می‌گیرد، قاعدتاً باید رکورد MXای هم وجود داشته باشد که به این دامنه مربوط می‌شود. غیر از این است؟

البته وقتی می‌شود با اجرای یک دستور Resolve-DnsName از این موضوع مطمئن شود، نباید با حدسیات و احتمالات پیش برویم. دستور زیر کمکتان می‌کند تا اطلاعات لازم در این رابطه را به دست آورید:

Resolve-DnsName -Name gmail.com -Type MX

خروجی‌ای که در پاسخ به این دستور ارائه می‌شود، لیستی از رکوردهای MX دامنۀ gmail.com را نمایش می‌دهد:

دریافت رکورد MX در نتیجه دستور Resolve-DnsName

به همین ترتیب، با استفاده از این دستور پاورشلT می‌توانید دنبال انواع دیگر رکوردهای DNS هم بگردید.

پیشنهاد خواندنی: DNS چیست و چه کاربردی دارد؟

استفاده از سرورهای خاص برای جست‌وجوی DNS

دستوری که راجع‌به آن صحبت می‌کنیم، یعنی دستور Resolve-DnsName، به‌صورت پیش‌فرض از آدرس‌های سرورهای DNS که روی کامپیوتر شما پیکربندی شده‌اند استفاده می‌کند؛ منتهی این امکان وجود دارد که Resolve-DnsName را مجبور به استفاده از یک سرور DNS خاص کنید تا جست‌وجو مطابق آنچه در سر دارید پیش برود.

اجازه دهید باز هم مثالی بزنیم تا راحت‌تر منظورمان را منتقل کنیم.

اگر می‌خواهید سرور Google Public DNS جست‌وجوی رکوردها را بر عهده بگیرد، می‌توانید با افزودن پارامتر -server به انتهای دستور، به‌راحتی هرچه تمام‌تر این کار را انجام دهید. نمونه کد زیر را ببینید:

# Google Public DNS Server IPs

$dnsServer = @('8.8.8.8','8.8.4.4')

Resolve-DnsName adamtheautomator.com -Server $dnsServer

خروجی دستور بالا، مشابه آنچه در تصویر زیر می‌بینید خواهد بود:

یافتن رکورد DNS با سرور به‌خصوص

ممکن است این سؤال در ذهنتان شکل گرفته باشد: اصلاً چرا باید سراغ سرور DNS متفاوتی بروم؟! سؤال خیلی خوبی است و پاسخ قانع‌کننده‌ای هم برای آن وجود دارد.

وقتی با سرور پیش‌فرض یا سروری دلخواه دنبال رکوردی مشابه در کامپیوتر خود می‌گردید، به احتمال زیاد پاسخ‌هایی مشابه دریافت خواهید کرد؛ ولی به‌طور کلی، دلایل زیادی وجود دارند که استفاده از سرورهای گوناگون برای اجرای دستور Resolve-DnsName را توجیه می‌کنند. مثلا:

  • سرعت: برخی سرورهای DNS از برخی دیگر سریع‌تر عمل می‌کنند.
  • امنیت: برخی سرورها امنیت بیشتری را فراهم می‌کنند که مانع از حملات سایبری و سرقت اطلاعات می‌شود.
  • در دسترس بودن رکوردها: در بیشتر مواقع، ارگان‌ها از سرورهای DNS اختصاصی برخوردار هستند. سرورهایی که حاوی zoneها و رکوردها برای نام‌ها هستند که فقط به‌صورت داخلی می‌توان به آن‌ها دسترسی پیدا کرد. در چنین شرایط خاصی، جست‌وجو برای رکوردهای یک نام داخلی با یک سرور DNS عمومی راه به هیچ‌جایی نمی‌برد و خروجی‌ای مشابه تصویر زیر را دریافت می‌کنید.

استفاده از سرورهای مختلف برای دریافت نتیجه Resolve-DnsName

  • عدم پاسخگویی سرورهای DNS: برخی سازمان‌ها، اجازۀ ارسال پاسخ DNS را نمی‌دهند. استفاده از آن‌ها برای جست‌وجوی رکوردهای DNS عمومی بی‌فایده خواهد بود.
  • عیب‌یابی و آزمون‌وخطا: بعضی‌وقت‌ها، ممکن است علی‌رغم پاسخگویی و عملکرد درست سرور DNS مطلوب خود، بخواهید درستی اطلاعات دریافتی را با استفاده از سروری دیگر بسنجید.

بعد از کسب اطلاعات لازم دربارۀ جست‌وجوی رکوردهای DNS با سرورهای گوناگون، باز هم یک قدم جلوتر می‌رویم و نحوۀ استفاده از دستور Resolve-DnsName در پاورشل را عمیق‌تر کنکاش می‌کنیم.

گزارش سوابق DNS با استفاده از PowerShell Script

تا اینجای آموزش، مقدمات بهره‌وری حداکثری از دستور Resolve-DnsName را آموختید. حالا در این بخش، یاد می‌گیرید که چطور می‌توان یک اسکریپت پاورشل برای رصد و گزارش‌گیری از وضعیت رکوردهای DNS بنویسید.

باید از چیزهایی که در بخش‌های قبل آموختید، برای ساخت چنین اسکریپتی کمک بگیرید. نگران نباشید! ما کمکتان می‌کنیم تا کار را درست و بی‌نقص انجام دهید.

ویرایشگر اسکریپتی که بالاتر گفتیم باید به آن دسترسی داشته باشید را باز کنید و آماده شوید.

تعریف متغیرها

قبل از هرکاری، باید چند متغیر تعریف کنید. متغیرهایی شامل موارد زیر:

  • NameList$: این متغیر از نام رکوردهای DNS که می‌خواهید با اسکرپیت زیر نظر بگیرید نگهداری می‌کند.
  • ServerList$: از این متغیر برای مشخص کردن سرورهای DNSای که اسکریپت برای جست‌وجو به کار می‌گیرد، استفاده کنید.

کد زیر را کپی کنید و در ابتدای اسکریپت خود قرار دهید:

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

$ServerList = @('8.8.8.8','8.8.4.4')

پیشنهاد خواندنی: کد EPP چیست و چطور آن را برای امنیت دامنه دریافت کرد؟

انجام جست‌وجوی DNS

بعد از تعریف متغیرها و افزودن آن‌ها به ابتدای اسکریپت، کد باید بتواند دنبال رکوردهای DNS تک‌تک نام‌های مشخص‌شده باشد. در چنین شرایطی، از لوپ foreach استفاده می‌شود تا لیست رکوردها را تکرار و اطلاعات مربوط به هر نام را با استفاده از دستور Resolve-DnsName استخراج کند.

خط @() = $FinalResult یک آرایۀ خالی می‌سازد که نتایج نهایی در آن ذخیره می‌شوند؛ سپس، با استفاده از لوپ foreach تک‌تک آیتم‌ها در لیست NameList$ به متغیری با نام Name$ می‌فرستد.

در هر بار تکرار، خط tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage$ یک object موقتی با ۴ خصوصیت می‌سازد که از نتایج جست‌وجوی موفق رکوردهای DNS نگهداری می‌کنند.

پس از آن، بخش {}try برای اجرای دستور Resolve-DnsName در پاورشل اجرا می‌شود. هدف پیدا کردن رکوردهای A در DNS است و علاوه‌بر آن، مقادیر tempObj$ هم قرار است پر شوند. اگر احیاناً جست‌وجو با موفقیت انجام نشود، بخش {}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

بعد از ذخیره‌سازی اسکریپت در ویرایشگر انتخابی، آن را با بازخوانی نامش در پاورشل اجرا کنید. پیشنهاد می‌کنیم نام آن را .GetDnsRecrod.ps1 بگذارید.

بعد از اجرا، نتیجه‌ای مشابه تصویر زیر را خواهید دید:

نتیجه اسکریپت اختصاصی برای مانیتورینگ DNS با Resolve-DnsName

همان‌طور که می‌بینید، خروجی یک object است. گفتیم که وقتی قصد خروجی گرفتن در قالب فایل CSV را داشته باشید، این خصوصیت بسیار به کار می‌آید. اگر قصد چنین کاری را دارید، از دستور زیر استفاده کنید:

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

در نهایت، چیزی مثل تصویر زیر را در اختیار خواهید داشت که همان فایل CSV است:

خروجی CSV از نتیجۀ دستور Resolve-DnsName

این هم از آموزشی که وعده داده بویم. برویم سراغ جمع‌بندی.

کنکاش رکوردهای DNS با دستور Resolve-DnsName یکی از بهترین روش‌ها است!

در این آموزش، صفر تا صد چگونگی استفاده از دستور Resolve-DnsName در پاورشل را همراه با هرآنچه لازم بود در این رابطه بدانیم، تقدیمتان کردیم.

همان‌طور که گفتیم، با توجه به اینکه خروجی یک object است، این روش از جهات مختلفی بهتر از باقی روش‌ها خودش را نشان می‌دهد. ساده‌ترینشان اینکه می‌توانید به‌سادگی از نتیجۀ نهایی خروجی بگیرید.

امیدواریم پاسخ تمام پرسش‌های خود در این رابطه را گرفته باشید؛ اگر احیاناً در بخشی از فرایند با مشکل مواجه شدید، آن را در قسمت کامنت‌ها با ما در میان بگذارید.

منابع: ATALEARNING

نیکان حیدری

«نوشتن، قفل‌هایی را باز میکند که به ظاهر غیرقابل‌‌نفوذ هستند». این باور نیکان او را به سمت دنیای کلمات فرستاد و حالا چندسالی است که نوشته‌هایش قفل ذهن مخاطب‌های حوزه تکنولوژی را باز می‌کند.

نظر شما راجع به این محتوا چیست؟

آخرین مطالب دسته بندی سرور

دیدگاه ها

اولین نفری باشید که دیدگاه خود را ثبت می کنید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *