Vlastní dynamic DNS s pomocí CloudFlare

Úvod

Vlastní dynamic DNS s pomocí CloudFlare Pro osobní potřeby jsem na doma spustil VSphere, na kterém provozuji virtuální router a server Ubuntu jako mediální server a spoustu dalších užitečných aplikací, a tento server musí být dostupný z Internetu. Problém však je, že můj poskytovatel nabízí statickou IP za peníze, které by se daly lépe využít. Proto jsem používal kombinaci ddclient + cloudflare.

Všechno fungovalo dobře, dokud ddclient přestal pracovat. Po malém hrabání jsem pochopil, že nastal čas na improvizaci, protože hledání problému zabralo příliš mnoho času. Nakonec to vyústilo v malého démona, který jednoduše funguje, a to mi stačí.
Kdo má zájem – vítejte pod kat.

Používané nástroje a jak to funguje

Nejprve jsem se dozvěděl na stránkách cloudflare vše potřebné o API. A už jsem se chystal implementovat všechno v Pythonu (po seznámení s Pythonem ho čím dál více používám pro nějaké jednoduché úkoly nebo když potřebuji rychle vytvořit prototyp), když jsem náhle narazil na prakticky hotovou implementaci.
Základem se stal wrapper python-cloudflare.

Vzali jsme jeden z příkladů pro aktualizaci DNS a přidali použití konfiguračního souboru a možnost aktualizovat více A záznamů v rámci zóny a samozřejmě neomezené množství zón.

Logika je následující:

  1. Skript získá ze souboru s konfigurací seznam zón a prochází je v cyklu
  2. V každé zóně skript prochází v cyklu každou DNS záznam typu A nebo AAAA a porovná veřejnou IP s záznamem
  3. Pokud se IP liší – změní ji, pokud ne, přeskočí iteraci cyklu a přejde k následující.
  4. Usne na čas uvedený v konfiguraci.

Instalace a konfigurace

Asi by bylo možné vytvořit i .deb balíček, ale nejsem v tom silný, a není to tak složité.
Celý proces jsem podrobně popsal v README.md na stránce repozitáře.

Ale pro jistotu to shrnu v ruštině:

  1. Ujistěte se, že máte nainstalován python3 a python3-pip, pokud ne – nainstalujte je (v systému Windows se python3-pip instaluje společně s Pythonem).
  2. Naklonujte nebo stáhněte repozitář.
  3. Nainstalujte potřebné závislosti.
    python3 -m pip install -r requirements.txt

  4. Spusťte instalační skript.
    Pro Linux:
    chmod +x install.sh
    sudo ./install.sh

    Pro Windows: windows_install.bat

  5. Upravte konfigurační soubor.
    Pro Linux:
    sudoedit /etc/zen-cf-ddns.conf

    Pro Windows:

    Otevřete soubor zen-cf-ddns.conf ve složce, kam jste skript nainstalovali.

    To je obyčejný JSON soubor, nastavení není složité – speciálně jsem popsal dvě různé zóny jako příklad.

Co se skrývá za instalátory?

install.sh pro Linux:

  1. Vytváří se uživatel pro spuštění démonu, bez vytvoření domovského adresáře a možnosti přihlášení.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Vytváří se soubor pro zápis logu do /var/log/
  3. Děláme vlastníkem souboru logu nedávno vytvořeného uživatele
  4. Souborové umístění se kopírují na správná místa (konfigurační soubor do /etc, spustitelný soubor do /usr/bin, soubor služby do /lib/systemd/system)
  5. Služba se aktivuje

windows_install.bat pro Windows:

  1. Kopíruje spustitelný soubor a konfigurační soubor do uživatelského zvoleného adresáře
  2. Vytváří úlohu v plánovači pro spuštění skriptu při startu systému
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Po změně konfigurace je potřeba skript restartovat, v Linuxu to je jednoduché a obvyklé:

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

pro Windows bude potřeba zabít proces pythonw a skript znovu spustit (moc se mi nechce psát službu pro Windows v C#):

taskkill /im pythonw.exe

Tímto je instalace a nastavení hotové, používejte na zdraví.

Pro ty, kteří chtějí vidět ne moc hezký kód Pythonu, tady je repozitář na GitHubu.

Licenční smlouva MIT, takže s tímto kódem dělejte, co chcete.

P.S.: Chápu, že to dopadlo trochu kostrbatě, ale plní svůj úkol na jedničku.

UPD: 11.10.2019 17:37
Našel jsem ještě jeden problém, a pokud by někdo mohl poradit, jak ho vyřešit — budu velmi vděčný.
Problém je v tom, že pokud nainstaluji závislosti bez sudo python -m pip install -r …, moduly nebudou přístupné z uživatelského účtu služby, a nechtěl bych nutit uživatele instalovat moduly pod sudo, to by bylo špatně.
Jak to udělat správně, aby to vypadalo dobře?
UPD: 11.10.2019 19:16 Problém byl vyřešen použitím venv.
Vyšlo několik změn. Nová verze bude brzy.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster