Свой dynamic DNS з дапамогай CloudFlare

Прадмова

Свой dynamic DNS з дапамогай CloudFlare Для асабістых патрэб хаты падняў VSphere, на якім кручу віртуальны маршрутызатар і Ubuntu сервер у якасці медыя-сервера і яшчэ кучы ўсякіх смачнашак, і гэты сервер павінен быць даступны з Інтэрнэт. Але праблема ў тым, што мой правайдэр дае статыку за грошы, якім заўсёды можна знайсці больш карыснае ўжыванне. Таму я карыстаўся звязкам ddclient + cloudflare.

Усё было добра, пакуль ddclient не перастаў працаваць. Трохі пакалупаючы яго, я зразумеў што прыйшоў час мыліц і ровараў, бо часу на пошук праблемы стала сыходзіць занадта шмат. У выніку ўсё вылілася ў невялікі дэман, які проста працуе, а мне больш і не трэба.
Каму цікава - сардэчна запрашаем пад кат.

Выкарыстоўваныя прылады і як «гэта» працуе

Такім чынам перш за ўсё я даведаўся на сайце cloudflare, усё што трэба ведаць пра API. І ўжо было сёлаў рэалізоўваць усё на Python(пасля знаёмства з Python, я ўсё гушчару ўжываю яго для нейкіх простых задач або калі трэба хутка зрабіць прататып), як раптам натыкнуўся на практычна гатовую рэалізацыю.
Увогуле за аснову быў узяты ўперпер python-cloudflare.

Узяў адзін з прыкладаў для абнаўлення DNS і дадаў выкарыстанне файла канфігурацыі і магчымасць абнаўляць некалькі A запісаў у межах зоны і натуральна неабмежаваную колькасць зон.

Логіка наступная:

  1. Скрыпт атрымлівае з файла канфігурацыі спіс зон і праходзіць па іх у цыкле
  2. У кожнай зоне скрыпт праходзіць у цыкле па кожным DNS запісы тыпу А ці АААА і звярае Public IP з запісам
  3. Калі IP адрозніваецца - мяняе яго, калі няма прапускае ітэрацыю цыклу і пераходзіць да наступнай
  4. Засынае на час, паказаны ў канфігу

Ўстаноўка і настройка

Напэўна можна было б зрабіць і .deb пакет, але я ў гэтым не моцны, ды і не так ужо ўсё складана.
Працэс цалкам падрабязна я апісаў у README.md на старонцы рэпазітара.

Але на ўсялякі выпадак апішу на рускай агульнымі словамі:

  1. Пераканайцеся, што ў вас усталяваны python3 і python3-pip, калі не – усталюеце (у Windows python3-pip усталёўваецца разам з Python)
  2. Клануйце або запампуйце рэпазітар
  3. Усталюйце неабходныя залежнасці.
    python3 -m pip install -r requirements.txt

  4. Запусціце ўсталявальны скрыпт
    Для Linux:

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

    Для Windows: windows_install.bat

  5. Адрэдагуйце файл канфігурацыі
    Для Linux:

    sudoedit /etc/zen-cf-ddns.conf

    Для Windows:

    Адкрыйце файл zen-cf-ddns.conf у тэчцы, куды ўсталявалі скрыпт.

    Гэта звычайны JSON файл, па наладах нічога складана - спецыяльна апісаў як прыклад 2 розныя зоны ў ім.

Што хаваецца за ўсталёўшчыкамі?

install.sh для Linux:

  1. Ствараецца карыстач для запуску дэмана, без стварэння хатняй дырэкторыі і магчымасці лагіна.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Ствараецца файл для запісу лога ў /var/log/
  3. Які робіцца ўладальнікам файла лога нядаўна створанага карыстальніка
  4. Капіююцца файлы па сваіх месцах (канфіг у /etc, выкананы файл у /usr/bin, файл службы ў /lib/systemd/system)
  5. Актывуецца служба

windows_install.bat для Windows:

  1. Капіюе выкананы файл і файл канфігурацыі ў паказаную карыстачом тэчку
  2. Стварае задачу ў планавальніку запускаць скрыпт пры старце сістэмы.
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Пасля змены канфіга скрыпт трэба перазапусціць, у Linux усё проста і звыкла:

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 прыйдзецца забіваць працэс pythonw і зноўку запускаць скрыпт(вельмі лянота мне пісаць службу пад Windows на C#):

taskkill /im pythonw.exe

На гэтым усталёўка і налада скончаны, карыстайцеся на здароўе.

Для тых, хто жадае паглядзець не самы прыгожы код Python, вось рэпазітар на GitHub.

Ліцэнзія MIT, так што рабіце з гэтым дабром, што хочаце.

PS: Разумею, што атрымалася крыху кастыльна, але са сваёй задачай спраўляецца на ўра.

UPD: 11.10.2019 17:37
Знайшоў яшчэ 1 праблему, і калі хтосьці падкажа як яе вырашыць - буду вельмі ўдзячны.
Праблема ў тым, што калі ўсталяваць залежнасці без sudo python -m pip install -r …, то з-пад карыстача сэрвісу модулі не будуць бачныя, а мне бы не жадалася прымушаць ставіць карыстачоў модулі пад sudo, ды і не правільна гэта.
Як правільна зрабіць, каб было прыгожа?
UPD: 11.10.2019 19:16 Праблема вырашана выкарыстаннем venv.
Атрымалася некалькі змен. Чарговы рэліз гэтымі днямі будзе.

Крыніца: habr.com

Дадаць каментар