Свой динамичен DNS с помощта на CloudFlare

Предговор

Свой динамичен DNS с помощта на CloudFlare За лични нужди у дома инсталирах VSphere, на който въртя виртуален рутер и сървър с Ubuntu в ролята на медиа-сървър, заедно с много други полезни неща, и този сървър трябва да бъде достъпен от интернет. Но проблемът е, че моят доставчик предлага статичен IP срещу заплащане, а винаги може да се намери по-полезно приложение за парите. Затова използвах комбинацията ddclient + cloudflare.

Всичко бе наред, докато ddclient не спря да работи. След малко разследване разбрах, че е време за шаблони и колелета, тъй като времето за търсене на проблема стана твърде много. В крайна сметка всичко прерасна в малък демон, който просто работи, а на мен не ми трябва нищо повече.
На интересуващите се – добре дошли под кат.

Използвани инструменти и как работи "то"

Така че на първо място научих на сайта на cloudflare всичко, което трябва да знам за API. И вече бях започнал да го реализирам на Python (след запознаването с Python, все по-често го използвам за прости задачи или когато трябва бързо да направя прототип), когато изведнъж попаднах на почти готова реализация.
Общо взето, за основа беше взет враппер python-cloudflare.

Взех един от примерите за обновление на DNS и добавих използване на конфигурационен файл и възможност за обновяване на няколко A записа в рамките на зоната и естествено неограничен брой зони.

Логиката е следната:

  1. Скриптът получава от конфигурационния файл списък със зони и минава през тях в цикъл.
  2. Във всяка зона скриптът минава в цикъл през всяка DNS запис типа A или AAAA и сравнява публичния 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, така че правете с това добро каквото искате.

P.S.: Разбирам, че стана малко зле, но със задачата се справя отлично.

UPD: 11.10.2019 17:37
Намерих още 1 проблем, и ако някой може да помогне с решението му – ще бъда много благодарен.
Проблемът е, че ако инсталирам зависимостите без sudo python -m pip install -r …, то от потребителя на услугата модулите няма да са видими, а не искам да карам потребителите да инсталират модулите с sudo, освен това и не е правилно.
Как правилно да направя, за да изглежда добре?
UPD: 11.10.2019 19:16 Проблемът е решен с използването на venv.
Получиха се няколко промени. Очаквайте нова версия след дни.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster