Свій 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 файл, за налаштуваннями нічого складно - спеціально описав як приклад дві різні зони в ньому.

Що ховається за установниками?

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
Знайшов ще одну проблему, і якщо хтось підкаже, як її вирішити — буду дуже вдячний.
Проблема в тому, що якщо встановити залежності без sudo python -m pip install -r …, то під користувача сервісу модулі не будуть видно, а мені б не хотілося змушувати ставити користувачів модулі під sudo, та й не правильно це.
Як правильно зробити, щоб було гарно?
UPD: 11.10.2019 19:16 Проблему вирішено використанням venv.
Вийшло кілька змін. Черговий реліз днями буде.

Джерело: habr.com

Додати коментар або відгук