Vorwort
Für den persönlichen Gebrauch zu Hause habe ich VSphere aufgesetzt, auf dem ich einen virtuellen Router und einen Ubuntu-Server als Medienserver betreibe, sowie viele andere nützliche Dinge. Dieser Server sollte aus dem Internet zugänglich sein. Das Problem ist jedoch, dass mein Anbieter für statische IPs Geld verlangt, was ich für sinnvollere Zwecke verwenden könnte. Daher habe ich das Duo ddclient + Cloudflare verwendet.
Alles lief gut, bis ddclient aufhörte zu funktionieren. Nachdem ich ein wenig daran herumgebastelt hatte, wurde mir klar, dass es Zeit für eine Notlösung war, da ich zu viel Zeit mit der Fehlersuche verbrachte. Letztendlich entwickelte sich das Ganze zu einem kleinen Daemon, der einfach funktioniert, und mehr brauche ich nicht.
Für Interessierte – herzlich willkommen unter dem Cut.
Verwendete Werkzeuge und wie «das» funktioniert
Als erstes habe ich auf der Website von Cloudflare alles Wichtige über herausgefunden. Und ich war gerade dabei, alles in Python zu implementieren (nachdem ich mit Python vertraut geworden bin, verwende ich es immer häufiger für einfache Aufgaben oder wenn ich schnell ein Prototyp erstellen muss), als ich auf eine fast fertige Implementierung stieß.
Im Allgemeinen wurde der Wrapper .
Ich habe ein Beispiel für die Aktualisierung von DNS genommen und die Verwendung einer Konfigurationsdatei sowie die Möglichkeit hinzugefügt, mehrere A-Records innerhalb einer Zone und natürlich eine unbegrenzte Anzahl von Zonen zu aktualisieren.
Die Logik ist folgende:
- Das Skript erhält aus der Konfigurationsdatei eine Liste von Zonen und durchläuft sie in einer Schleife.
- In jeder Zone durchläuft das Skript in einer Schleife jeden DNS-Eintrag vom Typ A oder AAAA und vergleicht die öffentliche IP mit dem Eintrag.
- Wenn die IP sich unterscheidet, wird sie geändert. Wenn nicht, wird die Schleifeniteration übersprungen und zur nächsten fortgefahren.
- Es schläft für die in der Konfiguration angegebene Zeit.
Installation und Konfiguration
Man könnte auch ein .deb-Paket erstellen, aber ich bin darin nicht versiert und es ist auch nicht so kompliziert.
Ich habe den Prozess ziemlich detailliert in der README.md auf .
Aber um auf Nummer sicher zu gehen, beschreibe ich es in einfachen Worten auf Russisch:
- Stellen Sie sicher, dass Sie python3 und python3-pip installiert haben. Wenn nicht, installieren Sie sie (unter Windows wird python3-pip zusammen mit Python installiert).
- Klonen oder laden Sie das Repository herunter.
- Installieren Sie die erforderlichen Abhängigkeiten.
python3 -m pip install -r requirements.txt - Führen Sie das Installationsskript aus.
Für Linux:chmod +x install.sh sudo ./install.shFür Windows: windows_install.bat
- Bearbeiten Sie die Konfigurationsdatei.
Für Linux:sudoedit /etc/zen-cf-ddns.confFür Windows:
Öffnen Sie die Datei zen-cf-ddns.conf im Verzeichnis, in das Sie das Skript installiert haben.
Es handelt sich um eine normale JSON-Datei, die Konfiguration ist unkompliziert – ich habe zur Veranschaulichung zwei verschiedene Zonen als Beispiel beschrieben.
Was steckt hinter den Installern?
install.sh für Linux:
- Ein Benutzer wird erstellt, um den Daemon auszuführen, ohne ein Home-Verzeichnis und Anmeldemöglichkeiten zu schaffen.
sudo useradd -r -s /bin/false zen-cf-ddns - Eine Datei wird für das Logging in /var/log/ erstellt.
- Wir machen den neu erstellten Benutzer zum Besitzer der Logdatei.
- Die Dateien werden an ihre Plätze kopiert (Konfiguration in /etc, ausführbare Datei in /usr/bin, Dienstdatei in /lib/systemd/system).
- Der Dienst wird aktiviert.
windows_install.bat für Windows:
- Kopiert die ausführbare Datei und die Konfigurationsdatei in das vom Benutzer angegebene Verzeichnis.
- Erstellt einen Task im Taskplaner, um das Skript beim Systemstart auszuführen.
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Nach Änderungen an der Konfiguration muss das Skript neu gestartet werden; bei Linux ist das einfach und unkompliziert:
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 müssen Sie den Prozess pythonw beenden und das Skript neu starten (ich habe keine Lust, einen Dienst unter Windows in C# zu schreiben):
taskkill /im pythonw.exeDamit sind die Installation und die Konfiguration abgeschlossen, viel Freude damit.
Für diejenigen, die sich nicht den schönsten Python-Code ansehen wollen, hier ist .
MIT-Lizenz, also macht damit, was ihr wollt.
P.S.: Ich verstehe, dass es etwas hacky geworden ist, aber es erfüllt seine Aufgabe hervorragend.
UPD: 11.10.2019 17:37
Ich habe noch ein Problem gefunden, und wenn jemand einen Lösungsansatz hat, wäre ich sehr dankbar.
Das Problem ist, dass die Module für den Dienstbenutzer nicht sichtbar sind, wenn die Abhängigkeiten ohne sudo python -m pip install -r … installiert werden. Ich möchte die Benutzer nicht zwingen, die Module unter sudo zu installieren, das ist auch nicht richtig.
Wie kann man es richtig machen, damit es schön aussieht?
UPD: 11.10.2019 19:16 Problem gelöst durch die Verwendung von venv.
Es gab einige Änderungen. Ein weiteres Release wird in den nächsten Tagen kommen.
Quelle: habr.com
