Saját dinamikus DNS a CloudFlare segítségével

Bevezető

Saját dinamikus DNS a CloudFlare segítségével Otthoni személyes szükségletekhez felállítottam a VSphere-t, amin virtuális routert és Ubuntu szervert futtatok médiakiszolgálóként, továbbá sokféle érdekes dolgot, és ennek a szervernek elérhetőnek kell lennie az interneten. De a probléma az, hogy a szolgáltatóm pénzért ad statikus IP-címet, amit mindig hasznosabb célra is fel lehetne használni. Ezért a ddclient + cloudflare kombinációt használtam.

Minden jól ment, míg a ddclient meg nem állt. Egy kicsit bogarászva rájöttem, hogy itt az ideje a gyors megoldásoknak, mivel túl sok időt emésztett fel a probléma keresése. Végül mindez egy egyszerű démonba ömlött, ami csak működik, és nekem nem is kell több.
Aki érdekli - üdvözöljük a folytatásban.

Használt eszközök és hogyan működik "ez"

Tehát először is, megtudtam a cloudflare weboldalán, amit tudni érdemes a API. És már elkezdtem megvalósítani mindezt Pythonban (miután megismertem a Python-t, egyre inkább alkalmazom egyszerű feladatokhoz vagy amikor gyorsan prototípust kell készítenem), amikor is ráakadtam egy szinte kész megoldásra.
Összességében a python-cloudflare.

wrapper alapján elkészítettem egy DNS frissítő példát, amelyhez hozzáadtam a konfigurációs fájl használatát és a lehetőséget, hogy több A rekordot frissítsek egy zónán belül és természetesen korlátlan számú zónát kezelhessen.

A logika a következő:

  1. A szkript a konfigurációs fájlból megkapja a zónák listáját, és ciklusban végigmegy rajtuk
  2. Minden zónában a szkript ciklusban átnézi mindegyik A vagy AAAA típusú DNS rekordot, és összehasonlítja a nyilvános IP címet a rekorddal
  3. Ha az IP címe eltér, módosítja, ha nem, akkor kihagyja a ciklus iterációját, és a következőre lép
  4. Alszik az adott konfigurációs fájlban megadott ideig

Telepítés és beállítás

Valószínűleg készíthettem volna .deb csomagot is, de nem értek hozzá, és amúgy sem olyan bonyolult az egész.
A folyamatot részletesen leírtam a README.md fájlban a reptitórium oldalán.

De minden esetre leírom oroszul általános szavakkal:

  1. Győződjön meg róla, hogy telepítve van a python3 és a python3-pip, ha nem - telepítse (Windows alatt a python3-pip a Python-nal együtt települ)
  2. Klónozza vagy töltse le a repozitóriumot
  3. Telepítse a szükséges függőségeket.
    python3 -m pip install -r requirements.txt

  4. Futtassa a telepítő szkriptet
    Linux rendszerre:
    chmod +x install.sh
    sudo ./install.sh

    Windowsra: windows_install.bat

  5. Szerkessze meg a konfigurációs fájlt
    Linux rendszerre:
    sudoedit /etc/zen-cf-ddns.conf

    Windows rendszerre:

    Nyissa meg a zen-cf-ddns.conf fájlt abban a mappában, ahova a szkriptet telepítette.

    Ez egy szokásos JSON fájl, a beállítások nem bonyolultak – kifejezetten arra írtam példát, hogy két eltérő zónát mutassak be benne.

Mi rejlik a telepítők mögött?

install.sh Linuxhoz:

  1. Létrehoz egy felhasználót a démon futtatásához, anélkül, hogy létrehozna otthoni könyvtárat vagy lehetőséget logolásra.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Fájlt hoz létre a napló írásához a /var/log/ könyvtárban.
  3. A naplófájl tulajdonosává a nemrég létrehozott felhasználót tesszük.
  4. A fájlokat a megfelelő helyükre másolja (konfig a /etc-be, végrehajtható fájl a /usr/bin-be, szolgáltatás fájl a /lib/systemd/system-be)
  5. A szolgáltatást aktiválja.

windows_install.bat Windowshoz:

  1. Másolja a végrehajtható fájlt és a konfigurációs fájlt a felhasználó által megadott mappába.
  2. Feladatot hoz létre a feladatütemezőben, hogy a szkriptet a rendszer indításakor futtassa.
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

A konfiguráció módosítása után a szkriptet újra kell indítani, Linuxon ez egyszerű és megszokott:

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

Windows esetén le kell állítani a pythonw folyamatot, és újra kell indítani a szkriptet (nagyon lusta vagyok, hogy Windows-ra szerver szolgáltatást írjak C#-ban):

taskkill /im pythonw.exe

Ezzel a telepítés és beállítás véget ért, használjátok egészséggel.

Azoknak, akik szeretnének megnézni egy nem túl szép Python kódot, itt van. GitHub adattárhoz.

MIT licenc, tehát csinálj vele, amit csak akarsz.

P.S.: Értem, hogy kicsit ügyetlenül sikerült, de a feladatát remekül végzi.

UPD: 2019.10.11 17:37
Találtam még egy problémát, és ha bárki meg tudja mondani, hogyan lehetne megoldani – nagyon hálás lennék.
A probléma az, hogy ha a függőségeket sudo python -m pip install -r ... nélkül telepíted, akkor a szolgáltatás felhasználója nem fogja látni a modulokat, és nem szeretném, ha a felhasználóknak sudo alatt kellene telepíteniük a modulokat, ez nem is helyes.
Hogyan lehetne szépen csinálni?
UPD: 2019.10.11 19:16 A probléma a venv használatával megoldódott.
Több változás született. Hamarosan jön egy új kiadás.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster