DNS dinamic personal cu ajutorul CloudFlare

Prefață

DNS dinamic personal cu ajutorul CloudFlare Am instalat VSphere pentru uz personal acasă, pe care rulez un router virtual și un server Ubuntu ca server media, împreună cu multe alte servicii utile, iar acest server trebuie să fie accesibil din Internet. Problema este că providerul meu oferă IP static doar contra cost, ceea ce poate fi folosit pentru alte scopuri mai utile. Așa că am folosit o combinație ddclient + cloudflare.

Totul a fost bine, până când ddclient a încetat să mai funcționeze. După ce am investigat puțin, am realizat că a venit momentul să caut soluții rapide, deoarece timpul dedicat găsirii problemei devenise prea mare. În cele din urmă, totul s-a transformat într-un mic daemon care pur și simplu funcționează, și asta e tot ce am nevoie.
Cine este interesat - bine ați venit sub cat.

Instrumentele utilizate și cum funcționează „acest lucru”

Așadar, mai întâi am aflat de pe site-ul cloudflare tot ce trebuie să știu despre API. M-am așezat să implementez totul în Python (după ce m-am familiarizat cu Python, îl folosesc din ce în ce mai des pentru sarcini simple sau când trebuie să creez rapid un prototip), când, dintr-o dată, am dat peste o implementare aproape gata.
În general, am folosit wrapper-ul python-cloudflare.

Am luat unul dintre exemplele pentru actualizarea DNS și am adăugat utilizarea unui fișier de configurare și capacitatea de a actualiza mai multe înregistrări A în cadrul zonei și, evident, un număr nelimitat de zone.

Logica este următoarea:

  1. Scriptul obține din fișierul de configurare o listă de zone și le parcurge într-un ciclu
  2. În fiecare zonă, scriptul parcurge fiecare înregistrare DNS de tip A sau AAAA și compară IP-ul public cu înregistrarea
  3. Dacă IP-ul este diferit - îl schimbă; dacă nu, trece la iterația următoare a ciclului și continuă.
  4. Se oprește pentru perioada specificată în configurație.

Instalare și configurare

Probabil că ar fi fost posibil să fac un pachet .deb, dar nu mă pricep bine la asta și nu e foarte complicat.
Am descris procesul destul de detaliat în README.md de pe pagina repository-ului.

Dar, pentru orice eventualitate, voi explica în română în termeni generali:

  1. Asigurați-vă că aveți instalat python3 și python3-pip; dacă nu, instalați-le (în Windows, python3-pip se instalează împreună cu Python)
  2. Clonați sau descărcați repository-ul
  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, fără configurații complicate – am descris special două zone diferite ca exemplu.

Ce se ascunde în spatele instalatorilor?

install.sh pentru Linux:

  1. Se creează un utilizator pentru a rula demonul, fără a crea un director acasă și fără posibilitatea de logare.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Se creează un fișier pentru a scrie loguri în /var/log/
  3. Facem proprietar al fișierului de log utilizatorul creat recent
  4. Se copiază fișierele în locațiile corespunzătoare (config în /etc, fișier executabil în /usr/bin, fișier de serviciu în /lib/systemd/system)
  5. Se activează serviciul

windows_install.bat pentru Windows:

  1. Copiază fișierul executabil și fișierul de configurare în folderul 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ă modificarea configurației, scriptul trebuie repornit, în Linux 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ă omori procesul pythonw și să repornești scriptul (mi-e foarte greu să scriu un serviciu pentru Windows în C#):

taskkill /im pythonw.exe

Aceasta încheie instalarea și configurarea, folosiți-o cu plăcere.

Pentru cei care doresc să vadă un cod Python nu foarte frumos, iată repository-ul de pe GitHub.

Licența MIT, așa că faceți ce doriți cu acest lucru.

P.S.: Înțeleg că a ieșit puțin improvizat, dar își îndeplinește sarcina excelent.

UPD: 11.10.2019 17:37
Am găsit încă o problemă, și dacă cineva ar putea sugera cum să o rezolv, aș fi foarte recunoscător.
Problema este că, dacă instalezi dependențele fără sudo python -m pip install -r …, modulele nu vor fi vizibile din contul utilizatorului serviciului, iar eu nu aș dori să oblig utilizatorii să instaleze module cu sudo, și nici nu este corect.
Cum se poate face corect, astfel încât să arate bine?
UPD: 11.10.2019 19:16 Problema a fost rezolvată prin utilizarea venv.
Au fost câteva modificări. Un nou release va fi disponibil în zilele următoare.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster