كيفية إعداد DNS الديناميكي لـ Cloudflare

تخيل لو نشرت موقعًا على الويب من شبكتك المنزلية، وأنشأت سجلاً في نظام الأسماء المجالية (DNS) يشير إلى عنوان IP العام للراوتر الخاص بك. كيف يمكنك الحفاظ على تحديث سجل DNS الخاص بك عندما يتغير عنوان IP العام الخاص بك؟ ربما يجب أن تفكر في إعداد DNS الديناميكي لـ Cloudflare.

عادة ما يقوم مزودو خدمة الإنترنت (ISP) بتعيين عناوين IP ديناميكية لمشتركيهم، التي قد تتغير في أي وقت. ونتيجة لذلك، يظل سجل DNS الخاص بك يشير إلى عنوان IP ليس لك بعد الآن، ويصبح موقعك الإلكتروني غير قابل للوصول.

استمر في القراءة لأن هذا البرنامج التعليمي سيساعدك على الحفاظ على تحديث سجل DNS الخاص بك باستخدام واجهة برمجة التطبيقات (API) الخاصة بـ Cloudflare و PowerShell. لنبدأ الآن!

المتطلبات الأساسية

إذا كنت تخطط لمتابعة هذا البرنامج التعليمي عمليًا، فيما يلي الاحتياجات التي تحتاجها.

  • A computer with PowerShell 7.1 where you’ll run the Cloudflare dynamic DNS update script. This tutorial will use a Windows 10 computer.
  • A script editor of your choice. This tutorial will use Visual Studio Code v1.59.1 (recommended).
  • A domain that you already own. The example domain in this tutorial is lazyexchangeadmin.cyou.

النطاقات ذات المستوى العلوي المجانية (TLD)، مثل .ml، و .ga، و .tk، و .cf، و .gq، لا تنطبق على الأتمتة الديناميكية لـ DNS لـ Cloudflare ولن تعمل مع هذا البرنامج التعليمي.

Sample DNS A record in Cloudflare

ما هو Cloudflare Dynamic DNS؟

سجلات DNS ثابتة بطبيعتها، ولا تتفاعل بشكل جيد مع عناوين IP الديناميكية. الآن، لحل تلك المشكلة، ستحتاج إلى إعداد DNS ديناميكي. لحسن الحظ، توفر Cloudflare واجهة برمجة التطبيقات التي تسمح لك بإدارة سجلات DNS بشكل برمجي.

لإعداد DNS ديناميكي لـ Cloudflare، ستحتاج إلى تشغيل عملية على جهاز العميل داخل شبكتك يقوم بعمليتين رئيسيتين: الحصول على عنوان IP العام الحالي لشبكتك وتحديث سجل DNS المقابل تلقائياً.

الصورة أدناه توضح الرسم البياني على المستوى العالي لكيفية حدوث تحديث سير تشغيل DNS السحابة الديناميكية لـ Cloudflare.

Cloudflare Dynamic DNS update flow

هناك العديد من عملاء DNS الديناميكية المتاحة للتثبيت، في الغالب لأنظمة Linux، مثل على خادم Ubuntu أو Raspberry PI. كما توجد خدمات DNS الديناميكية من جهات خارجية قد تكون مدفوعة أو مجانية. ولكن في هذا البرنامج التعليمي، ستقوم بنشر برنامج تحديث DNS الخاص بك يعمل على PowerShell 7.1.

الحصول على رمز API الخاص بـ Cloudflare

عند تحديث سجل DNS السحابة الديناميكية لـ Cloudflare بشكل برمجي، يجب على البرنامج النصي المستخدم التوثق لنفسه في واجهة برمجة تطبيقات Cloudflare. فقط بعد ذلك ستسمح Cloudflare لك بإجراء تغييرات على سجلات DNS في حسابك.

يسمح لك Cloudflare بإنشاء رموز API مع الصلاحيات الكافية للغرض المطلوب. يمكنك بدوره استخدام اسم المستخدم لحساب Cloudflare ورمز API الناتج للتوثيق مع واجهة برمجة تطبيقات Cloudflare.

لإنشاء رمز API لـ Cloudflare، اتبع هذه الخطوات.

1. قم بفتح المستعرض الخاص بك، وانتقل إلى https://dash.cloudflare.com/login/، وقم بتسجيل الدخول إلى حساب Cloudflare الخاص بك.

2. بعد تسجيل الدخول إلى لوحة التحكم الخاصة بـ Cloudflare، انقر فوق زر الملف الشخصي في الزاوية العلوية اليمنى وانقر على ملفي الشخصي.

Opening your Cloudflare profile page

3. بعد ذلك، انقر فوق رابط علامة التبويب رموز API. تحت قسم رموز API، انقر على زر إنشاء رمز. يفترض المثال أدناه أنك لم تقم بإنشاء أي رموز API بعد.

Clicking Create Token

4. على قائمة نماذج رموز واجهة برمجة التطبيقات، انقر على نموذج تحرير منطقة DNS لاستخدامه. يتيح لك هذا النموذج إنشاء رمز واجهة برمجة التطبيقات مع إذن التحرير لجميع أو بعض مناطق DNS المحددة في حسابك.

Selecting the Edit zone DNS API token template

5. في قسم موارد المنطقة على صفحة إنشاء الرمز، انقر على مربع القائمة الأيمن وحدد منطقة DNS لتضمينها في وصول هذا الرمز. بعد اختيار منطقة DNS، انقر على المتابعة إلى الملخص.

اختياريًا، لتقييد فترة صلاحية رمز واجهة برمجة التطبيقات، قم بملء تاريخ البداية و تاريخ الانتهاء تحت قسم TTL. إذا تركتها فارغة، سيكون لديها رمز واجهة برمجة التطبيقات بدون تاريخ انتهاء.

Selecting the DNS Zone

6. قم بمراجعة الملخص وتأكيد أن لديك إذن DNS:Edit للمنطقة DNS المحددة مسبقًا. أخيرًا، انقر على إنشاء الرمز لإنشاء رمز واجهة برمجة التطبيقات.

Reviewing the API token permission

7. بعد إنشاء رمز واجهة برمجة التطبيقات، قم بنسخ قيمة الرمز وتأكد من تخزينها بشكل آمن. عامل الرمز واجهة برمجة التطبيقات كما تعامل كلمة مرور.

Copying the API Token

8. عد إلى علامة التبويب رموز واجهة برمجة التطبيقات وتأكد من وجود رمز واجهة برمجة التطبيقات الذي أنشأته.

Verifying the API Token

إعداد سكربت تحديث DNS الديناميكي لـ Cloudflare

لديك الآن حساب Cloudflare ورمز واجهة برمجة التطبيقات لديه إذن لتحرير منطقة DNS. ماذا بعد؟ ستحتاج إلى وضع رمز واجهة برمجة التطبيقات في استخدامه ودمجه مع سكربت يقوم بتحديث سجل DNS الديناميكي لـ Cloudflare بشكل برمجي.

هذا البرنامج التعليمي يوفر لك سكريبت PowerShell العامل بشكل خاص لتحديث سجل DNS في Cloudflare.

حفظ السكريبت

اتبع الخطوات التالية لحفظ سكريبت PowerShell لديناميكية Cloudflare DNS على جهاز الكمبيوتر الخاص بك.

1. قرر في أي مجلد ترغب في حفظ السكريبت وأنشئ هذا المجلد إذا لم يكن موجودًا بعد. في هذا المثال، موقع السكريبت هو في C:\CloudflareDDNS.

2. افتح محرر الشيفرة الخاص بك، مثل VSCode، وأنشئ ملف سكريبت PowerShell جديد بالاسم Update-CloudflareDDNS.ps1. احفظ السكريبت داخل مجلد C:\CloudflareDDNS.

3. انسخ السكريبت أدناه، الصقه في محرر الشيفرة الخاص بك، واحفظ الملف. راجع التعليقات المضمنة لفهم وظيفة السكريبت.

#يتطلب -الإصدار 7.1

[cmdletbinding()]
param (
    [parameter(Mandatory)]
    $Email,
    [parameter(Mandatory)]
    $Token,
    [parameter(Mandatory)]
    $Domain,
    [parameter(Mandatory)]
    $Record
)

# قم ببناء رؤوس الطلب مرة واحدة. سيتم استخدام هذه الرؤوس طوال البرنامج النصي.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Region اختبار الرمز
## يتحقق هذا الكتلة من أن مفتاح API الخاص بك صالح.
## إذا لم يكن كذلك، سيتم إنهاء البرنامج النصي.

$uri = "https://api.cloudflare.com/client/v4/user/tokens/verify"

$auth_result = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($auth_result.result)) {
    Write-Output "API token validation failed. Error: $($auth_result.errors.message). Terminating script."
    # انسحاب من البرنامج النصي
    return
}
Write-Output "API token validation [$($Token)] success. $($auth_result.messages.message)."
#EndRegion

#Region الحصول على معرف المنطقة
## استرجاع معرف منطقة النطاق بناءً على اسم المنطقة. إذا لم يتم العثور على المعرف، سيتم إنهاء البرنامج النصي.
$uri = "https://api.cloudflare.com/client/v4/zones?name=$($Domain)"
$DnsZone = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($DnsZone.result)) {
    Write-Output "Search for the DNS domain [$($Domain)] return zero results. Terminating script."
    # انسحاب من البرنامج النصي
    return
}
## تخزين معرف منطقة DNS
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#End Region

#Region الحصول على سجل DNS
## استرجاع تفاصيل سجل DNS الحالي من Cloudflare.
$uri = "https://api.cloudflare.com/client/v4/zones/$($zone_id)/dns_records?name=$($Record)"
$DnsRecord = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($DnsRecord.result)) {
    Write-Output "Search for the DNS record [$($Record)] return zero results. Terminating script."
    # انسحاب من البرنامج النصي
    return
}
## تخزين عنوان IP الحالي في سجل DNS
$old_ip = $DnsRecord.result.content
## تخزين قيمة نوع سجل DNS
$record_type = $DnsRecord.result.type
## تخزين قيمة معرف سجل DNS
$record_id = $DnsRecord.result.id
## تخزين قيمة ttl لسجل DNS
$record_ttl = $DnsRecord.result.ttl
## تخزين قيمة proxied لسجل DNS
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#EndRegion

#Region الحصول على عنوان IP العام الحالي
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#EndRegion

#Region تحديث سجل DNS الديناميكي
## قارن بين عنوان IP الحالي وسجل DNS
## إذا لم يتطابق عنوان IP الحالي مع عنوان IP في سجل DNS، قم بتحديث سجل DNS.
if ($new_ip -ne $old_ip) {
    Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
    ## تحديث سجل DNS بعنوان IP الجديد
    $uri = "https://api.cloudflare.com/client/v4/zones/$($zone_id)/dns_records/$($record_id)"
    $body = @{
        type    = $record_type
        name    = $Record
        content = $new_ip
        ttl     = $record_ttl
        proxied = $record_proxied
    } | ConvertTo-Json

    $Update = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -SkipHttpErrorCheck -Body $body
    if (($Update.errors)) {
        Write-Output "DNS record update failed. Error: $($Update[0].errors.message)"
        ## انسحاب من البرنامج النصي
        return
    }

    Write-Output "DNS record update successful."
    return ($Update.result)
}
else {
    Write-Output "The current IP address and DNS record IP address are the same. There's no need to update."
}
#EndRegion

تشغيل النص

الآن بعد حفظك لنص تحديث DNS الديناميكي من Cloudflare، ماذا التالي؟ قبل نشر النص، من الضروري اختبار توافق وظائفه. تشغيل النص يتطلب أربع تفاصيل ليكون ناجحًا، وهذه هي:

  • البريد الإلكتروني – وهو عنوان البريد الإلكتروني لحسابك في Cloudflare.
  • الرمز – الرمز API الذي أنشأته سابقًا من حسابك في Cloudflare.
  • النطاق – اسم النطاق DNS الذي يحتوي على سجل DNS الذي تريد تحديثه. (على سبيل المثال، lazyexchangeadmin.cyou).
  • السجل – سجل DNS الذي تريد تحديثه. (على سبيل المثال، demo.lazyexchangeadmin.cyou).

لتشغيل النص، قم باتباع الخطوات التالية.

1. أولًا، افتح جلسة PowerShell. أو إذا كنت تستخدم VSCode، استخدم وحدة التحكم PowerShell في VSCode بدلاً من ذلك.

2. بعد ذلك، قم بإجراء بحث عن سجل DNS لتأكيد عنوان IP الحالي للسجل DNS. للقيام بذلك، قم بتشغيل cmdlet Resolve-DnsName، كما يمكنك رؤيته أدناه. تأكد من توفير اسم النطاق الكامل (FQDN) باستخدام معلمة -Name.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

يجب أن يعيد الأمر سجل DNS الذي قمت بالبحث عنه، بما في ذلك عنوان IP الخاص به.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. الآن، قم بتنفيذ السيناريو Update-CloudflareDDNS.ps1 لتحديث سجل DNS في Cloudflare عن طريق تشغيل الأمر التالي. تأكد من تغيير قيم Email، Token، Domain، و Record. يفترض الأمر التالي أن يكون السيناريو في C:\CloudflareDDNS\Update-CloudflareDDNS.ps1.

C:\CloudflareDDNS\Update-CloudflareDDNS.ps1 `
-Email '[email protected]' `
-Token 'kGW8n........eJl5a' `
-Domain 'lazyexchangeadmin.cyou' `
-Record 'demo.lazyexchangeadmin.cyou'

ثم يقوم السيناريو بأداء الإجراءات التالية، كما يمكنك رؤيتها في اللقطة أدناه.

  1. تحقق من صلاحية رمز الواجهة البرمجية (API).
  2. البحث عن النطاق الذي يحتوي على سجل DNS الذي يجب تحديثه.
  3. البحث عن سجل DNS الذي يجب تحديثه.
  4. مقارنة عنوان IP لسجل DNS مع عنوان IP الخارجي أو العام الفعلي.
  5. تحديث عنوان IP لسجل DNS في Cloudflare.
  6. عرض نتيجة تحديث DNS الديناميكي.
Running the Cloudflare dynamic DNS update script

4. ارجع إلى لوحة التحكم الخاصة بك في Cloudflare وتحقق مما إذا كان سجل DNS يعكس عنوان IP الجديد. توضح اللقطة أدناه أن العنوان IP قد تغير إلى قيمة العنوان IP الخارجي بعد تشغيل سيناريو التحديث.

Verifying the DNS record in Cloudflare

5. في الختام، قم بإجراء بحث آخر عن سجل DNS كما فعلت في الخطوة 2 للتحقق مما إذا كان العنوان IP الجديد قد انتشر بشكل عام بالفعل.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

قد يستغرق انتشار سجل DNS بضع دقائق، ساعات، أو حتى أيام. في هذا المثال، استغرق انتشار Cloudflare أقل من دقيقة فقط.

Looking up a DNS record after the Cloudflare dynamic DNS update

جدولة مهمة تحديث Cloudflare Dynamic DNS

في هذه النقطة، لديك الآن سكريبت يعمل يحدث سجل ديناميكي DNS الخاص بك في Cloudflare. ولكن تشغيل السكريبت يدويا في كل مرة ليس الهدف. يجب عليك التأكد من أن تحديث DNS الديناميكي يعمل بشكل تلقائي على جدول زمني بقدر الضرورة.

تبعاً لنظام التشغيل الذي تستخدمه، تختلف طريقة جدولة تشغيل السكريبت، مثل مهمة cron في لينكس. ستقوم هذه الدروس بإنشاء مهمة مجدولة في ويندوز تقوم بتشغيل سكريبت تحديث سجل DNS الديناميكي في Cloudflare كل خمس دقائق.

تعريف إجراء المهمة المجدولة

يجب أن تحتوي المهمة المجدولة على إجراء، يمكنك إنشاؤه باستخدام الأمر New-ScheduledTaskAction . في هذا المثال، الإجراء هو تشغيل سكريبت Update-CloudflareDDNS.ps1 باستخدام ملف التنفيذ PowerShell pwsh.exe.

للقيام بذلك، افتح نافذة PowerShell كمسؤول. بعد ذلك، قم بنسخ وتشغيل الكود أدناه في PowerShell. تأكد من تغيير المتغيرات $scriptPath, $Email, $Token, $Domain, و $Record.

# تحديد خصائص فعل المهمة المجدولة
## أدخل مسار النص PowerShell
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## عنوان البريد الإلكتروني لحساب Cloudflare
$Email = '[email protected]'
## رمز API لـ Cloudflare
$Token = 'kGW8n........eJl5a'
## اسم النطاق DNS
$Domain = 'lazyexchangeadmin.cyou'
## سجل DNS للتحديث
$Record = 'demo.lazyexchangeadmin.cyou'

# إنشاء كائن فعل المهمة المجدولة
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

إنشاء مشغل المهمة المجدولة

بعد تحديد ما ستقوم به المهمة، يجب عليك إنشاء مشغل أو جدول زمني للمهمة بتشغيل أمر New-ScheduledTaskTrigger. انسخ الكود أدناه وقم بتشغيله في PowerShell لإنشاء مشغل مهمة جديد يعمل كل خمس دقائق ضمن فترة عشر سنوات.

# إنشاء جدول زمني جديد لمشغل المهمة المجدولة
## المشغل = كل 5 دقائق لمدة 10 سنوات.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

تسجيل المهمة المجدولة الجديدة في النظام

أخيرًا، أنت مستعد لتسجيل المهمة المجدولة الجديدة على الكمبيوتر. ولفعل ذلك، ستحتاج إلى تشغيل أمر الـ Register-ScheduledTask، نفس الأمر كما في الشيفرة أدناه. قم بنسخ الشيفرة أدناه وتشغيلها في PowerShell لتسجيل المهمة المجدولة.

ستعمل المهمة المجدولة الناتجة تحت حساب النظام المحلي. لا تتردد في تعيين حساب مستخدم مختلف لتشغيل المهمة المجدولة حسب الحاجة.

# قم بتسجيل المهمة المجدولة في النظام.
## اسم المهمة المجدولة
$TaskName = 'Update Cloudflare Dynamic DNS'
## وصف المهمة المجدولة
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## إنشاء المهمة المجدولة
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

كما يمكنك رؤية أدناه، أنشأ الأمر المهمة المجدولة والحالة جاهزة. من هذه النقطة فصاعدًا، سيتم تشغيل النصب بفاصل خمس دقائق.

Registering the New Scheduled Task

الختام

ليس من الضروري أن يكون تحديث سجلات DNS مع تغييرات عناوين الآي بي الديناميكية أمرًا صعبًا. لا داعي لدفع رسوم لخدمة DNS دينامية! من خلال إدارة مناطق DNS الخاصة بك في Cloudflare، يمكنك الاستفادة من واجهة برمجة التطبيقات الخاصة بهم، مما يسمح لك بتحديث سجلات DNS الخاصة بك بشكل برمجي.

تعلمت في هذا البرنامج التعليمي كيفية تحديث سجل DNS ديناميكي في Cloudflare باستخدام مزيج من استدعاءات واجهة برمجة التطبيقات، PowerShell 7، ومهام مجدولة. كل ذلك يتيح لك تكوين آلية تحديث DNS الديناميكي في Cloudflare مرة واحدة والاحتفاظ بالتحديث بشكل دوري دون الحاجة لتدخلك.

هل تفكر في إدارة مناطق DNS الخاصة بك باستخدام Cloudflare للاستفادة من واجهة برمجة التطبيقات الخاصة بها؟ أم هل هناك طريقة أكثر راحة وسهولة تعرفها؟

Source:
https://adamtheautomator.com/cloudflare-dynamic-dns/