Ваш динамичен DNS с CloudFlare

Предговор

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

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

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

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

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

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

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

Какво се крие зад инсталаторите?

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