Twój dynamiczny DNS za pomocą CloudFlare

Wstęp

Twój dynamiczny DNS za pomocą CloudFlare Dla osobistych potrzeb w domu uruchomiłem VSphere, na którym pracuję z wirtualnym routerem i serwerem Ubuntu jako serwerem multimedialnym oraz wieloma innymi przydatnymi rzeczami, a ten serwer musi być dostępny z Internetu. Problem w tym, że mój dostawca oferuje statyczny adres za opłatą, a te pieniądze można zawsze wykorzystać w bardziej użyteczny sposób. Dlatego korzystałem z połączenia ddclient + cloudflare.

Wszystko było w porządku, aż ddclient przestał działać. Trochę majstrując przy tym, zrozumiałem, że nadszedł czas na obejścia i kręcenie kół, ponieważ czas na poszukiwanie problemu stał się zbyt długi. Ostatecznie wszystko przerodziło się w mały demon, który po prostu działa, a więcej mi nie trzeba.
Kto jest zainteresowany – serdecznie zapraszam pod kat.

Używane narzędzia i sposób działania „tego”

Więc najpierw dowiedziałem się na stronie cloudflare wszystkiego, co muszę wiedzieć o API. I już miałem zamiar wdrażać wszystko w Pythonie (po zapoznaniu się z Pythonem coraz częściej wykorzystuję go do prostych zadań lub gdy muszę szybko zrealizować prototyp), kiedy natknąłem się na niemal gotową implementację.
Generalnie jako podstawę wzięto wrapper python-cloudflare.

Wziąłem jeden z przykładów do aktualizacji DNS i dodałem użycie pliku konfiguracyjnego oraz możliwość aktualizacji kilku rekordów A w ramach strefy oraz, oczywiście, nieograniczonej liczby stref.

Logika jest następująca:

  1. Skrypt pobiera z pliku konfiguracyjnego listę stref i przechodzi przez nie w pętli
  2. W każdej strefie skrypt przechodzi w pętli przez każdy rekord DNS typu A lub AAAA i porównuje publiczny adres IP z rekordem
  3. Jeśli IP się różni — zmienia go, jeśli nie, pomija iterację pętli i przechodzi do następnego
  4. Usypia na czas określony w konfiguracji

Instalacja i konfiguracja

Można by chyba stworzyć pakiet .deb, ale nie jestem w tym dobry, a poza tym nie jest to takie trudne.
Proces opisałem dość szczegółowo w README.md na stronie repozytorium.

Ale na wszelki wypadek opiszę to ogólnie po rosyjsku:

  1. Upewnij się, że masz zainstalowanego python3 i python3-pip, jeśli nie — zainstaluj (w Windows python3-pip jest instalowany razem z Pythonem)
  2. Sklonuj lub pobierz repozytorium
  3. Zainstaluj wymagane zależności.
    python3 -m pip install -r requirements.txt

  4. Uruchom skrypt instalacyjny
    Dla Linux:
    chmod +x install.sh
    sudo ./install.sh

    Dla Windows: windows_install.bat

  5. Edytuj plik konfiguracyjny
    Dla Linux:
    sudoedit /etc/zen-cf-ddns.conf

    Dla Windows:

    Otwórz plik zen-cf-ddns.conf w folderze, do którego zainstalowałeś skrypt.

    To jest standardowy plik JSON, w ustawieniach nie ma nic skomplikowanego – specjalnie opisałem jako przykład 2 różne strefy w nim.

Co kryje się za instalatorami?

install.sh dla systemu Linux:

  1. Tworzony jest użytkownik do uruchamiania demona, bez tworzenia domowego katalogu i możliwości logowania.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Tworzony jest plik do zapisu logów w /var/log/
  3. Ustalamy właścicielem pliku loga niedawno utworzonego użytkownika
  4. Pliki są kopiowane na swoje miejsca (konfiguracja w /etc, plik wykonywalny w /usr/bin, plik usługi w /lib/systemd/system)
  5. Usługa jest aktywowana

windows_install.bat dla systemu Windows:

  1. Kopiuje plik wykonywalny i plik konfiguracyjny do wskazanej przez użytkownika folderu
  2. Tworzy zadanie w harmonogramie, aby uruchomić skrypt przy starcie systemu
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Po zmianie konfiguracji skrypt należy ponownie uruchomić, w Linuxie wszystko jest proste i znane:

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

dla Windows będzie trzeba zabić proces pythonw i ponownie uruchomić skrypt (naprawdę nie chce mi się pisać usługi pod Windows w C#):

taskkill /im pythonw.exe

Na tym instalacja i konfiguracja się kończy, korzystaj ze zdrowiem.

Dla tych, którzy chcą zobaczyć nieco brzydki kod Python, oto repozytorium na GitHubie.

Licencja MIT, więc rób z tym, co chcesz.

P.S.: Rozumiem, że wyszło trochę chaotycznie, ale radzi sobie z zadaniem na medal.

UPD: 11.10.2019 17:37
Znalazłem jeszcze 1 problem i jeśli ktoś podpowie, jak go rozwiązać — będę bardzo wdzięczny.
Problem polega na tym, że jeśli zainstalować zależności bez sudo python -m pip install -r …, to z konta użytkownika usługi moduły nie będą widoczne, a nie chciałbym zmuszać użytkowników do instalowania modułów z użyciem sudo, bo to nie jest właściwe.
Jak poprawnie to zrobić, żeby było ładnie?
UPD: 11.10.2019 19:16 Problem rozwiązany dzięki użyciu venv.
Wprowadziło to kilka zmian. Kolejna wersja będzie wkrótce.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster