Propriul DNS dinamic folosind CloudFlare

Prefață

Propriul DNS dinamic folosind CloudFlare Pentru nevoi personale de acasă, am instalat VSphere, pe care rulez un router virtual și un server Ubuntu ca server media și o grămadă de alte bunătăți, iar acest server ar trebui să fie accesibil de pe Internet. Dar problema este că furnizorul meu oferă date statice pentru bani, care pot fi întotdeauna folosite în scopuri mai utile. Prin urmare, am folosit combinația ddclient + cloudflare.

Totul a fost bine până când ddclient a încetat să funcționeze. După ce m-am uitat puțin, mi-am dat seama că a venit vremea cârjelor și a bicicletelor, deoarece era nevoie de prea mult timp pentru a găsi problema. În cele din urmă, totul s-a transformat într-un mic demon care pur și simplu funcționează și nu am nevoie de nimic altceva.
Dacă cineva este interesat, bine ați venit la cat.

Instrumentele utilizate și modul în care funcționează

Așa că primul lucru pe care l-am aflat pe site-ul cloudflare este tot ce trebuie să știți API. Și mă așezasem deja să implementez totul în Python (după ce m-am familiarizat cu Python, îl folosesc din ce în ce mai mult pentru unele sarcini simple sau când trebuie să fac rapid un prototip), când am dat brusc peste o implementare aproape gata făcută.
În general, ambalajul a fost luat ca bază python-cloudflare.

Am luat unul dintre exemplele pentru actualizarea DNS și am adăugat utilizarea unui fișier de configurare și posibilitatea de a actualiza mai multe înregistrări A într-o zonă și, desigur, un număr nelimitat de zone.

Logica este următoarea:

  1. Scriptul primește o listă de zone din fișierul de configurare și trece prin ele
  2. În fiecare zonă, scriptul trece prin fiecare înregistrare DNS de tip A sau AAAA și verifică IP-ul public cu înregistrarea
  3. Dacă IP-ul este diferit, îl schimbă; dacă nu, omite iterația buclei și trece la următoarea.
  4. Adorm pentru timpul specificat în config

Instalare și configurare

Probabil că ar fi posibil să faci un pachet .deb, dar nu mă pricep la asta și nu este chiar atât de dificil.
Am descris procesul în detaliu în README.md la adresa pagina de depozit.

Dar pentru orice eventualitate, o voi descrie în limba rusă în termeni generali:

  1. Asigurați-vă că aveți instalate python3 și python3-pip, dacă nu, instalați-l (pe Windows, python3-pip este instalat împreună cu Python)
  2. Clonează sau descarcă depozitul
  3. Instalați dependențele necesare.
    python3 -m pip install -r requirements.txt

  4. Rulați scriptul de instalare
    Pentru Linux:

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

    Pentru Windows: windows_install.bat

  5. Editați fișierul de configurare
    Pentru Linux:

    sudoedit /etc/zen-cf-ddns.conf

    Pentru Windows:

    Deschideți fișierul zen-cf-ddns.conf în folderul în care ați instalat scriptul.

    Acesta este un fișier JSON obișnuit, setările nu sunt deloc complicate - am descris în mod specific 2 zone diferite în el ca exemplu.

Ce se află în spatele instalatorilor?

install.sh pentru Linux:

  1. Un utilizator este creat pentru a rula demonul, fără a crea un director principal și fără posibilitatea de a se autentifica.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Un fișier jurnal este creat în /var/log/
  3. Faceți utilizatorul nou creat proprietarul fișierului jurnal
  4. Fișierele sunt copiate în locurile lor (config în /etc, fișier executabil în /usr/bin, fișier de serviciu în /lib/systemd/system)
  5. Serviciul este activat

windows_install.bat pentru Windows:

  1. Copiază fișierul executabil și de configurare într-un folder specificat de utilizator
  2. Creează o sarcină în planificator pentru a rula scriptul la pornirea sistemului
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

După schimbarea configurației, scriptul trebuie repornit; în Linux totul este simplu și familiar:

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

pentru Windows va trebui să omorâți procesul pythonw și să rulați din nou scriptul (mi-e prea lene să scriu un serviciu pentru Windows în C#):

taskkill /im pythonw.exe

Acest lucru completează instalarea și configurarea, bucurați-vă de ea pentru sănătatea dumneavoastră.

Pentru cei care doresc să vadă codul Python nu prea frumos, iată-l depozit pe GitHub.

Licență MIT, așa că fă ce vrei cu aceste lucruri.

PS: Am înțeles că s-a dovedit a fi un pic de cârjă, dar își face treaba cu bubuitură.

UPD: 11.10.2019 17:37
Am găsit încă o problemă, iar dacă cineva îmi spune cum să o rezolv, îți voi fi foarte recunoscător.
Problema este că, dacă instalați dependențe fără sudo python -m pip install -r ..., atunci modulele nu vor fi vizibile de la utilizatorul serviciului și nu aș dori să forțez utilizatorii să instaleze module sub sudo, iar acesta este nu este corect.
Cum să-l faci să arate frumos?
UPD: 11.10.2019/19/16 XNUMX:XNUMX Problema a fost rezolvată folosind venv.
Au fost mai multe schimbări. Următoarea lansare va avea loc în următoarele zile.

Sursa: www.habr.com

Adauga un comentariu