DynDNS mit CloudFlare

Vorwort

DynDNS mit CloudFlare Für persönliche Zwecke habe ich zu Hause VSphere eingerichtet, auf dem ich einen virtuellen Router und einen Ubuntu-Server als Medienserver sowie viele andere nützliche Dinge betreibe. Dieser Server sollte über das Internet zugänglich sein. Das Problem ist jedoch, dass mein Anbieter für statische IPs Gebühren verlangt, für die man immer eine sinnvollere Verwendung finden kann. Daher habe ich ddclient + cloudflare verwendet.

Alles lief gut, bis ddclient nicht mehr funktionierte. Nach ein wenig Herumprobieren wurde mir klar, dass es Zeit für Workarounds und kreative Lösungen war, da ich zu viel Zeit mit der Fehlersuche verbrachte. Am Ende entstand ein kleiner Daemon, der einfach läuft, mehr brauche ich nicht.
Interessierte sind herzlich eingeladen, weiterzulesen.

Verwendete Werkzeuge und wie »das« funktioniert

Als erstes habe ich auf der CloudFlare-Website alles nachgelesen, was man über APIwissen muss. Nachdem ich bereits eine Weile mit Python gearbeitet hatte (seit meiner Bekanntschaft mit Python verwende ich es häufiger für einfache Aufgaben oder um schnell Prototypen zu erstellen), stieß ich plötzlich auf eine fast fertige Implementierung.
Im Grunde wurde der Wrapper python-cloudflare.

als Basis genommen. Ich nahm eines der Beispiele zum Aktualisieren von DNS und fügte die Verwendung einer Konfigurationsdatei sowie die Möglichkeit hinzu, mehrere A-Einträge innerhalb einer Zone und natürlich eine unbegrenzte Anzahl von Zonen zu aktualisieren.

Die Logik ist folgende:

  1. Das Skript liest aus der Konfigurationsdatei eine Liste von Zonen und durchläuft sie in einer Schleife.
  2. Innerhalb jeder Zone durchläuft das Skript in einer Schleife jede DNS-Eintragung vom Typ A oder AAAA und vergleicht die öffentliche IP mit dem Eintrag.
  3. Wenn sich die IP unterscheidet, ändert es sie, andernfalls überspringt es die aktuelle Iteration und wechselt zur nächsten.
  4. Es schläft die Zeit, die in der Konfiguration angegeben ist,

Installation und Konfiguration

Vielleicht hätte ich auch ein .deb-Paket erstellen können, aber damit kenne ich mich nicht aus, und so kompliziert ist es nicht.
Den Prozess habe ich ausführlich in der README.md auf der Repository-Seite beschrieben..

Aber zur Sicherheit beschreibe ich es auf Russisch in allgemeinen Worten:

  1. Stellen Sie sicher, dass Sie python3 und python3-pip installiert haben. Falls nicht, installieren Sie es (unter Windows wird python3-pip zusammen mit Python installiert).
  2. Klonen oder laden Sie das Repository herunter.
  3. Installieren Sie die benötigten Abhängigkeiten.
    python3 -m pip install -r requirements.txt

  4. Führen Sie das Installationsskript aus.
    Für Linux:
    chmod +x install.sh
    sudo ./install.sh

    Für Windows: windows_install.bat

  5. Bearbeiten Sie die Konfigurationsdatei.
    Für Linux:
    sudoedit /etc/zen-cf-ddns.conf

    Für Windows:

    Öffnen Sie die Datei zen-cf-ddns.conf im Ordner, in den Sie das Skript installiert haben.

    Das ist eine gewöhnliche JSON-Datei, die in den Einstellungen nichts Kompliziertes enthält – ich habe absichtlich zwei verschiedene Bereiche als Beispiel beschrieben.

Was steckt hinter den Installationsprogrammen?

install.sh für Linux:

  1. Ein Benutzer wird erstellt, um den Daemon ohne Erstellung eines Home-Verzeichnisses und ohne Anmeldemöglichkeiten zu starten.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Eine Datei zur Protokollierung wird in /var/log/ erstellt.
  3. Wir machen den neu erstellten Benutzer zum Eigentümer der Protokolldatei.
  4. Dateien werden an ihren Platz kopiert (Konfiguration in /etc, ausführbare Datei in /usr/bin, Dienstdatei in /lib/systemd/system).
  5. Der Dienst wird aktiviert.

windows_install.bat für Windows:

  1. Kopiert die ausführbare Datei und die Konfigurationsdatei in den vom Benutzer angegebenen Ordner.
  2. Erstellt einen Task im Task Scheduler, um das Skript beim Systemstart auszuführen.
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Nach der Änderung der Konfiguration muss das Skript neu gestartet werden. In Linux ist das einfach und vertraut:

sudo service zen-cf-ddns start
sudo service zen-cf-ddns stop
sudo service zen-cf-ddns restart
sudo service zen-cf-ddns status

Für Windows muss ich den Prozess pythonw beenden und das Skript erneut starten (ich habe keine Lust, einen Dienst unter Windows in C# zu schreiben):

taskkill /im pythonw.exe

Damit ist die Installation und Konfiguration abgeschlossen, viel Spaß damit.

Für diejenigen, die sich den nicht sehr schönen Python-Code ansehen möchten, hier ist er. Repository auf GitHub.

MIT-Lizenz, also macht, was ihr wollt.

P.S.: Ich verstehe, dass es etwas umständlich geraten ist, aber es erfüllt seinen Zweck hervorragend.

UPD: 11.10.2019 17:37
Ich habe noch ein Problem gefunden, und wenn jemand einen Tipp zur Lösung hat, wäre ich sehr dankbar.
Das Problem ist, dass, wenn man die Abhängigkeiten ohne sudo python -m pip install -r ... installiert, die Module für den Servicenutzer nicht sichtbar sind. Ich möchte nicht, dass die Benutzer die Module mit sudo installieren müssen; das wäre auch nicht richtig.
Wie kann ich es richtig machen, damit es schön aussieht?
UPD: 11.10.2019 19:16 Das Problem wurde durch die Verwendung von venv gelöst.
Es gab mehrere Änderungen. Ein weiteres Release wird in den nächsten Tagen verfügbar sein.

Quelle: habr.com

60GB SSD 8Gb DDR4