Posted on

อัพเดท Cloudflare DNS IP Address ด้วย Python ใน Raspberry Pi

หลายคนที่กำลังใช้เน็ตบ้านทำ Server หรืออุปกรณ์ IOT ส่วนใหญ่จะเจอปัญหาคือ Public IP Address จะเปลี่ยนไปในทุกๆ วัน ทำให้ยากต่อการบริหารจัดการ วันนี้เรามีเคล็ดลับดีๆ มาฝากกัน คือการ อัพเดท Cloudflare DNS IP Address ด้วย Python ใน Raspberry Pi ซึ่งก่อนอื่นนั้นมาดูขั้นตอนที่เราต้องทำกันก่อน

  1. ทำการชี้โดเมนเนมของเราไปใช้บริการ DNS Service ของ Cloudflare ให้เรียบร้อย
  2. ให้ทำการสร้าง DNS A record ขึ้นมา 1 ชื่อ เช่น home.mydomain.com
  3. หลังจากนั้นเราจะทำการเขียน Script Python (โค้ดอยู่ด้านล่าง) ให้ทำการอัพเดท IP Address ของเน็ตในบ้าน ให้กับ home.mydomain.com
  4. ตั้ง Cron job ให้ทำการการ Run script นี้เป็นระยะๆ
  5. ต่อไปก็สามารถเรียกใช้งานมายังอุปกรณ์หรือระบบในบ้านผ่าน home.mydomain.com ได้ตลอดไป

สำหรับตัวอย่างโค้ดก็สามารถดูได้จากตัวอย่างนี้เลยนะครับ ในส่วนของการใช้งาน หลังจากกำหนดค่าตัวแปรต่างๆ เสร็จให้ทำการรันโค้ด 1 ครั้งก่อน เพื่อหาค่า RECORD_ID ของ dns record ที่เราจะทำการอัพเดท IP เมื่อได้ค่า id มาแล้ว ก็เอามาใส่ให้กับตัวแปร RECORD_ID ได้เลยครับ

#!/usr/bin/env python
import requests
import json
import sys 

IP_API = 'https://api.ipify.org?format=json' #อ่านค่า Public IP ของเน็ตที่กำลังใช้งานอยู่
CF_API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  #ค่า Global API Key เอาจาก Cloudflare ตรงเมนู 'My Profile'
CF_EMAIL = '[email protected]'    #อีเมล์ที่เป็น Username ของ Cloudflare
ZONE_ID = '111xxxxxxxxxxxxxxxxxxxxxx'  #ดูจากหน้า Dashboard ของโดเมนเนม ใน Cloudflare
RECORD_ID = ''  ##ค่า RECORD_ID นี้ให้ทำการรัน Script ก่อน 1 ครั้ง จากนั้นระบบจะแสดงผล เป็นชื่อ dns name ที่เราสร้างไว้ใน DNS ของ Cloudflare ให้คัดลองตรง "id": "xxxxxxx"  มาใส่


if not RECORD_ID:
    resp = requests.get(
        'https://api.cloudflare.com/client/v4/zones/{}/dns_records'.format(ZONE_ID),
        headers={
            'X-Auth-Key': CF_API_KEY,
            'X-Auth-Email': CF_EMAIL
        })
    print(json.dumps(resp.json(), indent=4, sort_keys=True))
    print('Please find the DNS record ID you would like to update and entry the value into the script')
    sys.exit(0)

resp = requests.get(IP_API)
ip = resp.json()['ip']


resp = requests.put(
    'https://api.cloudflare.com/client/v4/zones/{}/dns_records/{}'.format(
        ZONE_ID, RECORD_ID),
    json={
        'type': 'A',
        'name': 'myname.myweb.com',
        'content': ip,
        'proxied': False
    },
    headers={
        'X-Auth-Key': CF_API_KEY,
        'X-Auth-Email': CF_EMAIL
    })
assert resp.status_code == 200

print('Updated dns record for {}'.format(ip))

โค้ดนี้ดัดแปลงมาจากลิ้งค์นี้นะครับ

https://www.nathanvangheem.com/posts/2018/07/15/auto-update-cloudflare-dns.html

อย่าลืมกดติดตามเราใน Page https://www.facebook.com/iot.pf นะครับ เราจะลงบทความบ่อยๆ