Twój własny dynamiczny DNS za pomocą CloudFlare

Przedmowa

Twój własny dynamiczny DNS za pomocą CloudFlare Na własne potrzeby w domu zainstalowałem VSphere, na którym uruchamiam router wirtualny oraz serwer Ubuntu jako serwer multimediów i masę innych bajerów, a serwer ten powinien być dostępny z Internetu. Problem jednak w tym, że mój dostawca za pieniądze udostępnia statyczne dane, które zawsze można wykorzystać do bardziej przydatnych celów. Dlatego użyłem kombinacji ddclient + cloudflare.

Wszystko było w porządku, dopóki ddclient nie przestał działać. Po krótkim poszperaniu zdałem sobie sprawę, że nadszedł czas na kule i rowery, ponieważ znalezienie problemu zajmowało zbyt dużo czasu. W końcu wszystko zamieniło się w małego demona, który po prostu działa i niczego więcej nie potrzebuję.
Jeśli ktoś jest zainteresowany to zapraszamy do cat.

Stosowane narzędzia i sposób, w jaki „to” działa

Pierwszą rzeczą, którą dowiedziałem się na stronie Cloudflare, jest wszystko, o czym musisz wiedzieć API. A ja już zasiadłem do implementacji wszystkiego w Pythonie (po zapoznaniu się z Pythonem coraz częściej wykorzystuję go do prostych zadań lub gdy muszę szybko zrobić prototyp), gdy nagle natknąłem się na niemal gotową implementację.
Ogólnie rzecz biorąc, opakowanie zostało przyjęte jako podstawa python-cloudflare.

Wziąłem jeden z przykładów aktualizacji DNS i dodałem wykorzystanie pliku konfiguracyjnego oraz możliwość aktualizacji kilku rekordów A w obrębie strefy i oczywiście nieograniczonej liczby stref.

Logika jest następująca:

  1. Skrypt pobiera listę stref z pliku konfiguracyjnego i przegląda je w pętli
  2. W każdej strefie skrypt przegląda każdy rekord DNS typu A lub AAAA i sprawdza publiczny adres IP za pomocą rekordu
  3. Jeśli adres IP jest inny, zmienia go; jeśli nie, pomija iterację pętli i przechodzi do następnej.
  4. Zasypia na czas określony w konfiguracji

Instalacja i konfiguracja

Prawdopodobnie byłoby możliwe utworzenie pakietu .deb, ale nie jestem w tym dobry i nie jest to wcale takie trudne.
Opisałem ten proces bardzo szczegółowo w README.md na strona repozytorium.

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

  1. Upewnij się, że masz zainstalowane python3 i python3-pip, jeśli nie, zainstaluj je (w systemie 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 Linuksa:

    chmod +x install.sh
    sudo ./install.sh

    Dla systemu Windows: Windows_install.bat

  5. Edytuj plik konfiguracyjny
    Dla Linuksa:

    sudoedit /etc/zen-cf-ddns.conf

    W systemie Windows:

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

    Jest to zwykły plik JSON, ustawienia nie są skomplikowane - konkretnie opisałem w nim 2 różne strefy jako przykład.

Co kryje się za instalatorami?

install.sh dla Linuksa:

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

  2. Plik dziennika jest tworzony w /var/log/
  3. Uczyń nowo utworzonego użytkownika właścicielem pliku dziennika
  4. Pliki są kopiowane na swoje miejsca (config w /etc, plik wykonywalny w /usr/bin, plik usługi w /lib/systemd/system)
  5. Usługa jest aktywowana

Windows_install.bat dla Windows:

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

Po zmianie konfiguracji należy zrestartować skrypt, w Linuksie wszystko jest proste i znajome:

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

w przypadku systemu Windows będziesz musiał zakończyć proces Pythona i ponownie uruchomić skrypt (jestem zbyt leniwy, aby napisać usługę dla systemu Windows w języku C#):

taskkill /im pythonw.exe

To kończy instalację i konfigurację, ciesz się zdrowiem.

Dla tych, którzy chcą zobaczyć niezbyt ładny kod Pythona, oto on repozytorium na GitHubie.

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

PS: Rozumiem, że okazało się to trochę kulą, ale swoje zadanie robi z hukiem.

UPD: 11.10.2019 17:37
Znalazłem jeszcze 1 problem i jeśli ktoś powie mi jak go rozwiązać będę bardzo wdzięczny.
Problem w tym, że jeśli zainstalujesz zależności bez Sudo python -m pip install -r ..., to moduły nie będą widoczne dla użytkownika usługi, a nie chciałbym zmuszać użytkowników do instalowania modułów pod Sudo, a to jest niepoprawne.
Jak sprawić, by wyglądała pięknie?
UPD: 11.10.2019 19:16 Problem został rozwiązany za pomocą venv.
Nastąpiło kilka zmian. Kolejna edycja ukaże się w ciągu kilku najbliższych dni.

Źródło: www.habr.com

Dodaj komentarz