Warte, warum noch mehr DynDNS?
In diesem Blogpost beschreibe ich, wie man DynDNS auch ohne DNS Server und VM erreichen kann. Im letzten Post war das Setup ein bissche kompliziert und man musste viel über DNS wissen. Für den nächsten Ansatz braucht man mehr Python Wissen und einen Raspberry Pi oder ähnliches.
Mein DNS Provider hat endlich eine API und zum Glück eine sehr gute Dokumentation. Der Plan ist es einen DNS Eintrag kontinuierlich upzudaten und die aktuelle IP einzutragen. Ich versuche das Skript Schritt für Schritt zu beschreiben.
Router IP feststellen
import requests
def get_current_ip():
response = requests.get('https://api.ipify.org?format=json')
content = json.loads(response.content)
ip_address = ipaddress.IPv4Address(content['ip'])
return ip_address
Im Internet findet man jede Menge Webseiten, die einem die Request IP zurückgeben. Eine davon kann man benutzen, oder als Alternative kann man seinen Router nach der IP fragen.
DNS Eintrag checken
import json
def get_records():
"""Get Records
GET https://dns.hetzner.com/api/v1/records/
"""
try:
response = requests.get(
url="https://dns.hetzner.com/api/v1/records",
headers={
"Auth-API-Token": os.getenv('API_TOKEN'),
},
)
content = json.loads(response.content)
except requests.exceptions.RequestException:
print('HTTP Request failed')
return content
Mit dem Code bekommt man alle DNS Einträge. Man kann die Einträge schnell Filtern:
record = [x for x in records['records'] if x['name'] == 'lucky']
ip = record['value']
IP updaten
Als nächstes updated man den DNS Eintrag.
def update_record(record_id, value, ttl, record_type, name, zone_id):
# Update Record
# PUT https://dns.hetzner.com/api/v1/records/{RecordID}
try:
response = requests.put(
url=f"https://dns.hetzner.com/api/v1/records/{record_id}",
headers={
"Content-Type": "application/json",
"Auth-API-Token": os.getenv('API_TOKEN'),
},
data=json.dumps({
"value": str(value),
"ttl": ttl,
"type": record_type,
"name": name,
"zone_id": zone_id
})
)
print('Response HTTP Status Code: {status_code}'.format(
status_code=response.status_code))
print('Response HTTP Response Body: {content}'.format(
content=response.content))
except requests.exceptions.RequestException:
print('HTTP Request failed')
return
Die meisten Felder sind die gleichen wie in unserem record.
value
ist unsere neue IP und TTL sollte nicht viel mehr als 60
Sekunden sein.
Jetzt kann man mit dig
checken ob der DNS Eintrag geändert wurde.