איך להגדיר דינמי דיינאם DNS של Cloudflare

הנחיות לעדכון רשומת DNS עם Cloudflare Dynamic DNS

נניח שפרסמת אתר מרשת הבית שלך, ויצרת רשומת DNS שמצביעה על כתובת ה-IP הציבורית של הראוטר שלך. איך ניתן לשמור על עדכון של רשומת ה-DNS כאשר ה-IP הציבורית שלך משתנה? אולי כדאי לשקול להגדיר Dynamic DNS דרך Cloudflare.

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

המשך הקריאה משום שמדובר במדריך שיסייע לך לשמור על רשומת ה-DNS שלך מעודכנת באמצעות Interact with Cloudflare’s API (ממשק תכנות) ו-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.

**קשור: **
**איך לבצע שדרוג ל-PowerShell 7

  • A script editor of your choice. This tutorial will use Visual Studio Code v1.59.1 (recommended).

**קשור: **
**מה כדאי לדעת על Visual Studio Code: מדריך

  • A domain that you already own. The example domain in this tutorial is lazyexchangeadmin.cyou.

**הערה: **
**דומיינים עם סיומות כמו .ml, .ga, .tk, .cf ו-.gq אינם יעילים לאוטומציה של Cloudflare Dynamic DNS ולא יעבדו עם המדריך הזה.**

Sample DNS A record in Cloudflare

מהו DNS דינמי של Cloudflare?

רשומות DNS הן סטטיות מקורית, והן לא פועלות טוב עם כתובות IP דינמיות. עכשיו, כדי לפתור את הבעיה הזו, תצטרך להגדיר DNS דינמי. למרבה המזל, Cloudflare מספק API שמאפשר לך לנהל רשומות DNS באופן תכנותי.

כדי להגדיר DNS דינמי של Cloudflare, עליך להפעיל תהליך בלקוח בתוך הרשת שלך שמבצע שני פעולות עיקריות: לקבל את כתובת ה-IP הציבורית הנוכחית של הרשת שלך ולעדכן באופן אוטומטי את רשומת ה-DNS התואמת.

התמונה למטה מראה את תרשים הרמה הגבוהה של איך זרימת עדכון דינמית של Cloudflare DNS מתרחשת. `

Cloudflare Dynamic DNS update flow

` ישנם רבים מתוך קליינטי DNS דינמיים שזמינים להתקנה, בעיקר עבור מערכות Linux, כמו שרת Ubuntu או Raspberry PI. קיימות גם שירותי DNS דינמיים חיצוניים שיכולים להיות בתשלום או חינמיים. אך במדריך זה, תפקידך יהיה להגיב סקריפט עדכון DNS שרץ ב-PowerShell 7.1.`

השגת אסימון ה- API של Cloudflare

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

Cloudflare מאפשרת לך ליצור אסימונים של API עם הרשאות מספיקות למטרתו. בתמורה, תוכל להשתמש בשם המשתמש של חשבון ה-Cloudflare שלך ובאסימון ה-API שנוצר כתוצאה מכך כדי לאמת את עצמך עם 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 כדי להשתמש בה. תבנית זו מאפשרת לך ליצור אסימון API עם הרשאות עריכה לכל או חלק מאזורי ה-DNS הנבחרים בחשבונך.

Selecting the Edit zone DNS API token template

5. בחלק משאבי אזור בעמוד צור אסימון, לחץ על תיבת הנפתח הימנית ביותר ובחר את אזור ה-DNS לכלול בגישה של אסימון ה-API הזה. לאחר בחירת אזור ה-DNS, לחץ המשך לסיכום.

לבחירתך, כדי להגביל את תקופת תוקפם של אסימון ה-API, מלא את תאריך ההתחלה ואת תאריך הסיום בחלק TTL. אם ישאר ריק, אסימון ה-API לא יהיה תקף תאריך תפוגה.

Selecting the DNS Zone

6. בדוק את הסיכום וודא שיש ל-API הרשאת DNS:עריכה לאזור ה-DNS שנבחר מראש. לחץ לבסוף על צור אסימון כדי ליצור את אסימון ה-API.

Reviewing the API token permission

7. לאחר יצירת אסימון ה-API, העתק את ערך האסימון וודא שאתה שומר עליו בצורה מאובטחת. טפל באסימון ה-API בדיוק כמו שאתה טופל בסיסמה.

Copying the API Token

8. חזור לכרטיסייה אסימוני API ווודא את קיומו של אסימון ה-API שיצרת.

Verifying the API Token

הגדרת סקריפט עדכון ה-DNS הדינמי של Cloudflare

כעת יש לך חשבון Cloudflare ואסימון API של Cloudflare עם הרשאה לעריכת אזור DNS. מה הלאה? עליך להשתמש באסימון ה-API ולשלב אותו עם סקריפט שיעדכן באופן פרוגרמטי את רשומת ה-DNS הדינמית של Cloudflare.

המדריך הזה מספק לך סקריפט PowerShell פועל במיוחד לעדכון של רשומת DNS ב-Cloudflare.

שמירת הסקריפט

עקוב אחר השלבים למטה כדי לשמור על הסקריפט PowerShell לעדכון דינמי של Cloudflare במחשב הלקוח שלך.

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"
}

#אזור בדיקת טוקן
## בלוק זה מאמת כי מפתח ה- 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)."
#סיום אזור

#אזור קבלת מזהה אזור
## מביא את מזהה האזור של הדומיין על סמך שם האזור. אם המזהה לא נמצא, התסריט יסיים.
$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)"
#סיום אזור

#אזור קבלת רשומת 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
## אחסן את ערך ה- id של רשומת ה- 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)"
#סיום אזור

#אזור קבלת כתובת IP ציבורית נוכחית
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#סיום אזור

#אזור עדכון רשומת 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."
}
#סיום אזור

שומר את התסריט

עכשיו ששמרת את תסריט עדכון ה-Dynamic DNS של Cloudflare, מה הבא? לפני שתמשיך להרץ את התסריט, חשוב לבדוק את תפקודו. כדי להריץ את התסריט, יש צורך בארבעה פרטים להצלחה, ואלה הם:

  • אימייל – כתובת האימייל של חשבון ה-Cloudflare שלך.
  • טוקן – הטוקן API שיצרת מראש בחשבון ה-Cloudflare שלך.
  • דומיין – שם הדומיין DNS שמכיל את רשומת ה-DNS שברצונך לעדכן. (לדוגמה, lazyexchangeadmin.cyou).
  • רשומה – רשומת ה-DNS שברצונך לעדכן. (לדוגמה, demo.lazyexchangeadmin.cyou).

להריץ את התסריט, עקוב אחרי השלבים הבאים.

1. ראשית, פתח סשן של PowerShell. או, אם אתה משתמש ב-VSCode, השתמש בסוף הכתובת של PowerShell של VSCode במקום.

2. לאחר מכן, בצע בדיקת DNS על מנת לאמת את כתובת ה-IP הנוכחית של רשומת ה-DNS. כדי לעשות זאת, הרץ את הפקודה 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 החיצוני לאחר הרצת הסקריפט לעדכון.

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

קביעת קביעת משימת עדכון דינמית של DNS של Cloudflare

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

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

הגדרת פעולת המשימה המתוזמנת

למשימה שלך יש להיות פעולה, שניתן ליצור על ידי הרצת הפקודה New-ScheduledTaskAction. בדוגמא זו, הפעולה היא להפעיל את הסקריפט Update-CloudflareDDNS.ps1 באמצעות קובץ ה־PowerShell הביצועי pwsh.exe.

כדי לעשות זאת, פתח חלון PowerShell כמנהל חדש. לאחר מכן, העתק והרץ את הקוד למטה ב־PowerShell. ודא שאתה משנה את המשתנים $scriptPath, $Email, $Token, $Domain, ו־$Record.

# הגדר את מאפייני הפעולה של המשימה המתוזמנת
## הזן את נתיב תסריט הפוורשל
$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. העתק את הקוד למטה והרץ אותו בפוורשל כדי ליצור גורם זיזה חדש שרץ כל חמש דקות במשך עשר שנים.

# צור לוח זמנים חדש עבור המשימה המתוזמנת
## גורם זיזה = כל 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 cmdlet, כמו בקוד למטה. העתק את הקוד למטה והרץ אותו ב-PowerShell כדי לרשום את המשימה המתוזמנת.

המשימה המתוזמנת התוצאה תרוץ תחת חשבון המערכת המקומיlocal SYSTEM account. תרגיש חופשי להקצות חשבון משתמש שונה להריץ את המשימה המתוזמנת לפי הצורך.

# הרשמת המשימה המתוזמנת במערכת.
## שם המשימה המתוזמנת
$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 מעודכנות עם שינויים בכתובות IP דינמיות אינו צריך להיות אתגר. אין צורך לשלם עבור שירות DNS דינמי! על ידי ניהול אזורי DNS שלך ב-Cloudflare, תוכל להנות מ-API שלהם שיאפשר לך לעדכן את רשומות ה-DNS שלך באופן תוכנתי.

למדת במדריך זה כיצד לעדכן רשומת DNS דינמית של Cloudflare באמצעות שילוב של קריאות ל-API, PowerShell 7 ומשימות מתוזמנות. כל זה מאפשר לך להגדיר את המנגנון שלך לעדכון של Cloudflare DNS פעם אחת ולשמור על העדכון פועל במרווח זמן לא משומר.

האם תשקול לנהל את אזורי ה-DNS שלך עם Cloudflare כדי ליהנות מיתרונות ה-API שלה? או אולי יש לך דרך יותר נוחה ונגישה שאתה מכיר?

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