Ubuntu เขียน Script Update Public IP ไป DNS Record ของ Cloudflare

ภาพประกอบเขียน script update ip
ภาพประกอบเขียน script update public Ip

สำหรับหลายๆท่านอาจจะมีความจำเป็นที่จะต้องใช้ Linux Ubuntu ในการนำมาจัดทำ Server หรือทำบริการต่างๆนั้นมากมายแต่บางครั้งสิ่งที่จำเป็นต้องใช้ Public IP ที่ไม่มีการเปลี่ยนแปลงแต่ด้วยค่าบริการของรูปแบบการ Fix IP นั้นค่อนข้างสูงจึงนิยมที่จะใช้ DNS ในการมาเชื่อมโยง server นี้ให้ทำงานได้ต่อเนื่องถึงแม้ว่า Public Ip จะเปลี่ยนก็ตามซึ่งก็สามารถเขียน script เพื่อให้ระบบอัพเดทให้ออโต้ได้เรามาดูไปพร้อมกันเลยนะครับ

ต้องขอแจ้งให้ทราบก่อนเลยนะครับสำหรับเราในวันนี้จะใช้บริการ DNS จาก Cloudflare ครับ

Public Ip คืออะไร

เรามาทำความเข้าใจกันก่อนนะครับ Public IP คือ หมายเลขที่ระบบใช้ในการระบุและสื่อสารกับอุปกรณ์อื่น ๆ ในเครือข่ายอินเทอร์เน็ต (Internet) หรือเครือข่ายที่เปิดให้สาธารณะเข้าถึงได้ซึ่งจะเป็นหมายเลขที่ทางผู้ใหบริการจะกำหนดให้ก่อนที่จะเข้ามายังตัว Router ของเราครับซึ่งตรงส่วนนี้จะมีการเปลี่ยนไปตามผู้ให้บริการแต่ละเจ้า

สิ่งที่ต้องเตรียม

ก่อนที่เราจะทำการเขียน Script นี้เราจำเป็นต้องเตรียมความพร้อมเหล่านี้ไว้ก่อนครับ

  • เตรียมข้อมูลเขียน scrip อัพเดท Public IP ผ่าน DNS Cloudflare อย่างไร
  • จัดการ Forword Port และเชือ่มต่อ server ให้พร้อมเสียก่อน
  • ติดตั้งเครื่องมือสำหรับการเขียน script ให้เรียบร้อย
  • สร้างไฟล์สำหรับเขียน  script ไว้ที่ตำแหน่งที่ต้องการโดยใช้คำสั่ง 

    nano update_dns.sh​
  • เมื่อพร้อมแล้วนำ script ต่อไปนี้นำไปใส่ได้เลยแต่ต้องแทนค่าข้อมูลที่เตรียมไว้สำหรับตัวแปรซึ่งจะมีอธิบายช่วงด้านล่าง

    #!/bin/bash
    
    # Set your Cloudflare API token
    API_TOKEN="YOUR_API_TOKEN"
    
    # Set your Cloudflare Zone ID
    ZONE_ID="YOUR_ZONE_ID"
    
    # Set your DNS record ID
    RECORD_ID="YOUR_RECORD_ID"
    
    # Set your DNS record name (e.g., example.com)
    RECORD_NAME="YOUR_RECORD_NAME"
    
    # Function to get current public IP address
    get_current_ip() {
        current_ip=$(curl -s https://ipv4.icanhazip.com)
        echo "$current_ip"
    }
    
    # Function to get last recorded IP address
    get_last_ip() {
        if [ -f /tmp/last_ip.txt ]; then
            last_ip=$(cat /tmp/last_ip.txt)
            echo "$last_ip"
        else
            echo "No last IP recorded"
        fi
    }
    
    # Function to update Cloudflare DNS record
    update_dns_record() {
        new_ip="$1"
        echo "Updating DNS record to $new_ip"
        response=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
            -H "Authorization: Bearer $API_TOKEN" \
            -H "Content-Type: application/json" \
            --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$new_ip\",\"ttl\":120,\"proxied\":false}")
        echo "$response"
    }
    
    # Main script
    current_ip=$(get_current_ip)
    last_ip=$(get_last_ip)
    
    if [ "$current_ip" != "$last_ip" ]; then
        echo "IP address changed from $last_ip to $current_ip"
        update_dns_record "$current_ip"
        echo "$current_ip" > /tmp/last_ip.txt
    else
        echo "IP address has not changed"
    fi​
  • เมื่อเสร็จแล้วให้รันไฟล์เพื่อให้รันได้โดยตรงจากตัวอย่างจะเป็นชื่อไฟล update_dns

    bash update_dns.sh​
  • เปลี่ยนสิทธิ์ให้สามารถรันคำสั่งได้และสั่งให้รันไฟล์ได่

    chmod +x update_dns.sh
    
    ./update_dns.sh​

อธิบายการทำงานของ script ของการอัพเดท Public Ip

  • ในส่วนแรกคือสร้างตัวแปรซึ่งต้องแทนข้อมูลของเราจริงๆ ที่เตรียมไว้ที่ได้มาจาก Cloudflare

    # Set your Cloudflare API token
    API_TOKEN="YOUR_API_TOKEN"
    
    # Set your Cloudflare Zone ID
    ZONE_ID="YOUR_ZONE_ID"
    
    # Set your DNS record ID
    RECORD_ID="YOUR_RECORD_ID"
    
    # Set your DNS record name (e.g., example.com)
    RECORD_NAME="YOUR_RECORD_NAME"​
  • ส่วนต่อมานี้เป็นการกำหนดฟังก์ชั่นเพื่อรับ Public IP address ปัจจุบันของเครื่องโดยใช้คำสั่ง curl เพื่อเรียกข้อมูลจากเว็บไซต์ https://ipv4.icanhazip.com ซึ่งเป็นเว็บไซต์ที่ให้บริการในการแสดง IP address สาธารณะของเครื่องที่เรียกใช้งาน

    # Function to get current public IP address
    get_current_ip() {
        current_ip=$(curl -s https://ipv4.icanhazip.com)
        echo "$current_ip"
    }​
  • ส่วนต่อมาเป็นฟังก์ชั่นการตรวจสอบว่า Ip ล่าสุดนี้มีการเปลี่ยนแปลงหรือไม่ขั้นตอนการทำงานคือ
    • บรรทัดที่ 3 ใช้เงื่อนไข [ -f /tmp/last_ip.txt ] เพื่อตรวจสอบว่าไฟล์ /tmp/last_ip.txt มีอยู่หรือไม่ โดย -f หมายถึง "file exists and is a regular file" หรือไฟล์อยู่และเป็นไฟล์ปกติ
    • บรรทัดที่ 4 ถ้าไฟล์ /tmp/last_ip.txt มีอยู่ ฟังก์ชันจะอ่านเนื้อหาของไฟล์นั้นด้วยคำสั่ง cat /tmp/last_ip.txt และเก็บค่า IP address ล่าสุดที่อ่านได้ลงในตัวแปร last_ip.
    • บรรทัดที่ 5 ฟังก์ชันจะแสดงผลลัพธ์ IP address ล่าสุดที่อ่านได้ โดยใช้คำสั่ง echo
    • บรรทัดที่ 6 else ถ้าตรวจสอบแล้วในกรณีที่ไฟล์ /tmp/last_ip.txt ไม่มีอยู่ ฟังก์ชันจะแสดงข้อความ "No last IP recorded"   

      # Function to get last recorded IP address
      get_last_ip() {
          if [ -f /tmp/last_ip.txt ]; then
              last_ip=$(cat /tmp/last_ip.txt)
              echo "$last_ip"
          else
              echo "No last IP recorded"
          fi
      }​
  • ฟังก์ชั่นต่อมาเป็นการกำหนดฟังก์ชันชื่อ update_dns_record ซึ่งมีวัตถุประสงค์เพื่ออัปเดต DNS record ใน Cloudflare โดยใช้ Cloudflare API ขั้นตอนการทำงานคือ
    1. รับพารามิเตอร์ที่เป็น IP address ใหม่ที่ต้องการอัปเดต โดยให้ตั้งชื่อตัวแปรว่า new_ip
    2. แสดงข้อความ "Updating DNS record to [new_ip]" เพื่อแสดงว่ากำลังดำเนินการอัปเดต DNS record ไปยัง IP address ใหม่
    3. ใช้คำสั่ง curl เพื่อทำการ HTTP request แบบ PUT ไปยัง Cloudflare API เพื่ออัปเดต DNS record โดยระบุ URL ของ API โดยใช้ Zone ID และ Record ID ที่กำหนดไว้ตั้งแต่ตอนต้นของสคริปต์ และส่งข้อมูลในรูปแบบ JSON ซึ่งระบุประเภทของ DNS record (type), ชื่อของ DNS record (name), ค่า IP address ใหม่ (content), TTL (Time To Live) และสถานะของการ Proxied
    4. บันทึกผลลัพธ์ที่ได้รับจากการเรียก API ลงในตัวแปร response
    5. แสดงผลลัพธ์ที่ได้รับจากการเรียก API ทางหน้าจอ.

      # Function to update Cloudflare DNS record
      update_dns_record() {
          new_ip="$1"
          echo "Updating DNS record to $new_ip"
          response=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
              -H "Authorization: Bearer $API_TOKEN" \
              -H "Content-Type: application/json" \
              --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$new_ip\",\"ttl\":120,\"proxied\":false}")
          echo "$response"
      }​
  • ส่วนต่อมาจะเป็นส่วนหลักของสคริปต์นี้เป็นส่วนที่ทำหน้าที่ตรวจสอบว่า IP address ปัจจุบันของคุณเปลี่ยนแปลงหรือไม่ และถ้ามีการเปลี่ยนแปลง จะอัปเดต DNS record ใน Cloudflare ด้วย IP address ใหม่ที่ได้การทำงานจะเป็น
    • current_ip=$(get_current_ip): เรียกใช้งานฟังก์ชัน get_current_ip เพื่อรับ IP address ปัจจุบันของเครื่องและเก็บค่าไว้ในตัวแปร current_ip.

    • last_ip=$(get_last_ip): เรียกใช้งานฟังก์ชัน get_last_ip เพื่อรับ IP address ล่าสุดที่บันทึกไว้ จากไฟล์ /tmp/last_ip.txt และเก็บค่าไว้ในตัวแปร last_ip
    • if [ "$current_ip" != "$last_ip" ]; then: ตรวจสอบว่า IP address ปัจจุบัน ($current_ip) และ IP address ล่าสุดที่บันทึกไว้ ($last_ip) ไม่ตรงกัน หากไม่ตรงกัน แสดงว่ามีการเปลี่ยนแปลง IP address
    • echo "IP address changed from $last_ip to $current_ip": แสดงข้อความบนหน้าจอว่ามีการเปลี่ยนแปลง IP address จาก IP address ล่าสุดที่บันทึกไว้ $last_ip เป็น IP address ปัจจุบัน $current_ip
    • update_dns_record "$current_ip": เรียกใช้งานฟังก์ชัน update_dns_record เพื่ออัปเดต DNS record ใน Cloudflare โดยใช้ IP address ปัจจุบัน $current_ip
    • echo "$current_ip" > /tmp/last_ip.txt: บันทึก IP address ปัจจุบัน $current_ip ลงในไฟล์ /tmp/last_ip.txt เพื่อใช้เป็น IP address ล่าสุดในครั้งถัดไป
    • else: หาก IP address ปัจจุบันไม่ต่างกับ IP address ล่าสุดที่บันทึกไว้ แสดงว่าไม่มีการเปลี่ยนแปลง IP address
    • echo "IP address has not changed": แสดงข้อความบนหน้าจอว่าไม่มีการเปลี่ยนแปลง IP address

      # Main script
      current_ip=$(get_current_ip)
      last_ip=$(get_last_ip)
      
      if [ "$current_ip" != "$last_ip" ]; then
          echo "IP address changed from $last_ip to $current_ip"
          update_dns_record "$current_ip"
          echo "$current_ip" > /tmp/last_ip.txt
      else
          echo "IP address has not changed"
      fi

 

เพียงเท่านี้การอัพเดท Public Ip ไปยัง DNS Record ข้อง Cloudflare ก็จะมีการอัพเดทไปให้โดยที่เมื่อมีการเปลี่ยน IP ก็จะสามารถใช้งานได้ตลอดเวลาซึ่งถ้ารัน script แล้วไม่มีการเปลี่ยนแปลงให้ลองตรวจสอบข้อมูลที่เตรียมมาว่าถูกต้องหรือไม่ตรวจสอบกาตั้งค่าพื้นฐานต่างๆ เพิ่มเติมดูนะครับและเพื่อนๆ สามารถที่จะดูข้อมูลเพิ่มได้ที่ Network - เครือข่ายและการเชื่อมต่อ และนอกจากนี้สามารถที่จะเรียนเรื่องต่างๆได้จากบทเรียนออนไลน์


อ้างอิง
เตรียมข้อมูลเขียน scrip อัพเดท Public IP ผ่าน DNS Cloudflare อย่างไร ,[ออนไลน์], เข้าถึงได้จาก https://www.mindphp.com/บทความ/virtual-machine/9949-เตรียมข้อมูลเขียน-scrip-อัพเดท-public-ip-ผ่าน-dns-cloudflare-อย่างไร.html
CloudFlare DDNS - Update CloudFlare with Your Dynamic IP Address ,[ออนไลน์], เข้าถึงได้จาก 
Cloudflare DDNS w/ Docker - Keep your public IP updated automatically ,[ออนไลน์], เข้าถึงได้จาก https://www.youtube.com/watch?v=gy3Prekt6u8
กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
สอบถามเรื่อง Tag
โดย Buck Kittisak จ 20 พฤษภาคม 2024 3:11 pm บอร์ด HTML CSS
1
9
จ 20 พฤษภาคม 2024 3:32 pm โดย eange08 View Topic สอบถามเรื่อง Tag
ความแตกต่างระหว่าง PDO และ SQlite
โดย Buck Kittisak จ 20 พฤษภาคม 2024 2:32 pm บอร์ด SQL Knowledge
0
1
จ 20 พฤษภาคม 2024 2:32 pm โดย Buck Kittisak View Topic ความแตกต่างระหว่าง PDO และ SQlite
การป้องกันไม่ให้เกิดปัญหา UnboundLocalError ในภายหลัง
โดย newmae จ 20 พฤษภาคม 2024 2:12 pm บอร์ด Python Knowledge
0
4
จ 20 พฤษภาคม 2024 2:12 pm โดย newmae View Topic การป้องกันไม่ให้เกิดปัญหา UnboundLocalError ในภายหลัง
สอบถามเรื่อง - UnboundLocalError
โดย newmae จ 20 พฤษภาคม 2024 1:15 pm บอร์ด Programming - C/C++ & java & Python
2
18
จ 20 พฤษภาคม 2024 1:39 pm โดย newmae View Topic สอบถามเรื่อง - UnboundLocalError
หลักการเขียนคำสั่ง sql ที่ควรรู้
โดย Buck Kittisak จ 20 พฤษภาคม 2024 1:05 pm บอร์ด SQL Knowledge
0
1
จ 20 พฤษภาคม 2024 1:05 pm โดย Buck Kittisak View Topic หลักการเขียนคำสั่ง sql ที่ควรรู้
การติดตั้ง Odoo เวอร์ชั่น 15 บนวินโดวส์
โดย newmae จ 20 พฤษภาคม 2024 12:21 pm บอร์ด สอบถามปัญหาการใช้ phpBB3, SMF, Joomla, Wordpress, CMS, CRM
0
12
จ 20 พฤษภาคม 2024 12:21 pm โดย newmae View Topic การติดตั้ง Odoo เวอร์ชั่น 15 บนวินโดวส์
สอบถามการลงบทความหน้าเว็บไซต์
โดย Buck Kittisak จ 20 พฤษภาคม 2024 11:02 am บอร์ด ถาม - ตอบ คอมพิวเตอร์
2
21
จ 20 พฤษภาคม 2024 11:14 am โดย Buck Kittisak View Topic สอบถามการลงบทความหน้าเว็บไซต์
อัพเดต และแจ้งปัญหาการใช้งานโปรแกรมคำนวณภาษีที่ดินและสิ่งปลูกสร้าง
โดย Buck Kittisak จ 20 พฤษภาคม 2024 10:45 am บอร์ด MindPHP News & Feedback
0
7
จ 20 พฤษภาคม 2024 10:45 am โดย Buck Kittisak View Topic อัพเดต และแจ้งปัญหาการใช้งานโปรแกรมคำนวณภาษีที่ดินและสิ่งปลูกสร้าง