หลายคนที่กำลังใช้เน็ตบ้านทำ Server หรืออุปกรณ์ IOT ส่วนใหญ่จะเจอปัญหาคือ Public IP Address จะเปลี่ยนไปในทุกๆ วัน ทำให้ยากต่อการบริหารจัดการ วันนี้เรามีเคล็ดลับดีๆ มาฝากกัน คือการ อัพเดท Cloudflare DNS IP Address ด้วย Python ใน Raspberry Pi ซึ่งก่อนอื่นนั้นมาดูขั้นตอนที่เราต้องทำกันก่อน
- ทำการชี้โดเมนเนมของเราไปใช้บริการ DNS Service ของ Cloudflare ให้เรียบร้อย
- ให้ทำการสร้าง DNS A record ขึ้นมา 1 ชื่อ เช่น home.mydomain.com
- หลังจากนั้นเราจะทำการเขียน Script Python (โค้ดอยู่ด้านล่าง) ให้ทำการอัพเดท IP Address ของเน็ตในบ้าน ให้กับ home.mydomain.com
- ตั้ง Cron job ให้ทำการการ Run script นี้เป็นระยะๆ
- ต่อไปก็สามารถเรียกใช้งานมายังอุปกรณ์หรือระบบในบ้านผ่าน 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 = 'xxxxxx@myemail.com' #อีเมล์ที่เป็น 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 นะครับ เราจะลงบทความบ่อยๆ