DynDNS Part 2

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.