Din egen dynamiska DNS med CloudFlare

Förord

Din egen dynamiska DNS med CloudFlare För personliga behov hemma installerade jag VSphere, på vilken jag kör en virtuell router och en Ubuntu-server som mediaserver och en massa annat smått och gott, och denna server ska vara tillgänglig från Internet. Men problemet är att min leverantör ger statisk data för pengar, som alltid kan användas för mer användbara ändamål. Därför använde jag kombinationen ddclient + cloudflare.

Allt var bra tills ddclient slutade fungera. Efter att ha petat runt lite insåg jag att det var dags för kryckor och cyklar, eftersom det tog för lång tid att hitta problemet. Till slut förvandlades allt till en liten demon som bara fungerar, och jag behöver inget annat.
Om någon är intresserad, välkommen att katt.

Verktyg som används och hur "det" fungerar

Så det första jag fick reda på på cloudflares hemsida är allt du behöver veta om API. Och jag hade redan satt mig för att implementera allt i Python (efter att ha bekantat mig med Python använder jag det allt oftare för några enkla uppgifter eller när jag snabbt behöver göra en prototyp), när jag plötsligt stötte på en nästan färdig implementering.
I allmänhet togs omslaget som grund python-molnflare.

Jag tog ett av exemplen för uppdatering av DNS och lade till användningen av en konfigurationsfil och möjligheten att uppdatera flera A-poster inom en zon och, naturligtvis, ett obegränsat antal zoner.

Logiken är som följer:

  1. Skriptet tar emot en lista över zoner från konfigurationsfilen och går igenom dem
  2. I varje zon går skriptet genom varje DNS-post av typ A eller AAAA och kontrollerar den offentliga IP-adressen med posten
  3. Om IP:n är annorlunda ändras den, om inte hoppar den över loop-iterationen och går vidare till nästa.
  4. Somnar under den tid som anges i konfigurationen

Installation och konfiguration

Det skulle förmodligen vara möjligt att göra ett .deb-paket, men jag är inte bra på det här, och det är inte så svårt.
Jag beskrev processen i detalj i README.md på förvarssida.

Men för säkerhets skull kommer jag att beskriva det på ryska i allmänna termer:

  1. Se till att du har python3 och python3-pip installerade, om inte, installera det (på Windows är python3-pip installerat tillsammans med Python)
  2. Klona eller ladda ner förvaret
  3. Installera nödvändiga beroenden.
    python3 -m pip install -r requirements.txt

  4. Kör installationsskriptet
    För Linux:

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

    För Windows: windows_install.bat

  5. Redigera konfigurationsfilen
    För Linux:

    sudoedit /etc/zen-cf-ddns.conf

    För Windows:

    Öppna filen zen-cf-ddns.conf i mappen där du installerade skriptet.

    Detta är en vanlig JSON-fil, inställningarna är inget komplicerat - jag beskrev specifikt 2 olika zoner i den som ett exempel.

Vad finns bakom installatörerna?

install.sh för Linux:

  1. En användare skapas för att köra demonen, utan att skapa en hemkatalog och utan möjlighet att logga in.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. En loggfil skapas i /var/log/
  3. Gör den nyskapade användaren till ägaren av loggfilen
  4. Filerna kopieras till sina platser (config i /etc, exekverbar fil i /usr/bin, servicefil i /lib/systemd/system)
  5. Tjänsten är aktiverad

windows_install.bat för Windows:

  1. Kopierar den körbara filen och konfigurationsfilen till en användarspecificerad mapp
  2. Skapar en uppgift i schemaläggaren för att köra skriptet vid systemstart
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Efter att ha ändrat konfigurationen måste skriptet startas om; i Linux är allt enkelt och bekant:

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

för Windows måste du döda pythonw-processen och köra skriptet igen (jag är för lat för att skriva en tjänst för Windows i C#):

taskkill /im pythonw.exe

Detta slutför installationen och konfigurationen, njut av det för din hälsa.

För den som vill se den inte så vackra Python-koden, här är den repository på GitHub.

MIT licensierad, så gör vad du vill med det här.

PS: Jag förstår att det blev lite av en krycka, men den gör sitt jobb med råge.

UPD: 11.10.2019/17/37 XNUMX:XNUMX
Jag hittade 1 problem till, och om någon säger till mig hur jag ska lösa det, så är jag mycket tacksam.
Problemet är att om du installerar beroenden utan sudo python -m pip install -r ... så kommer modulerna inte att vara synliga från tjänstanvändaren, och jag skulle inte vilja tvinga användare att installera moduler under sudo, och detta är ej korrekt.
Hur får man det att se vackert ut?
UPD: 11.10.2019/19/16 XNUMX:XNUMX Problemet löstes med venv.
Det har skett flera förändringar. Nästa release kommer inom de närmaste dagarna.

Källa: will.com

Lägg en kommentar