Votre propre DNS dynamique avec CloudFlare

Avant-propos

Votre propre DNS dynamique avec CloudFlare Pour des besoins personnels à la maison, j'ai installé VSphere, sur lequel j'exécute un routeur virtuel et un serveur Ubuntu en tant que serveur multimédia et un tas d'autres goodies, et ce serveur doit être accessible depuis Internet. Mais le problème est que mon fournisseur fournit des données statiques contre de l'argent, qui peuvent toujours être utilisées à des fins plus utiles. Par conséquent, j'ai utilisé la combinaison ddclient + cloudflare.

Tout allait bien jusqu'à ce que ddclient cesse de fonctionner. Après avoir fouillé un peu, je me suis rendu compte que le moment était venu des béquilles et des vélos, car il fallait trop de temps pour trouver le problème. En fin de compte, tout s'est transformé en un petit démon qui fonctionne et je n'ai besoin de rien d'autre.
Si quelqu'un est intéressé, bienvenue chez Cat.

Outils utilisés et comment « ça » fonctionne

Donc la première chose que j'ai découverte sur le site cloudflare, c'est tout ce que vous devez savoir sur API. Et je m'étais déjà assis pour tout implémenter en Python (après m'être familiarisé avec Python, je l'utilise de plus en plus pour certaines tâches simples ou lorsque j'ai besoin de réaliser rapidement un prototype), quand je suis soudainement tombé sur une implémentation presque prête à l'emploi.
En général, l'emballage a été pris comme base python-cloudflare.

J'ai pris l'un des exemples de mise à jour DNS et ajouté l'utilisation d'un fichier de configuration et la possibilité de mettre à jour plusieurs enregistrements A au sein d'une zone et, bien sûr, un nombre illimité de zones.

La logique est la suivante:

  1. Le script reçoit une liste de zones du fichier de configuration et les parcourt
  2. Dans chaque zone, le script parcourt chaque enregistrement DNS de type A ou AAAA et vérifie l'adresse IP publique avec l'enregistrement
  3. Si l’adresse IP est différente, il la change ; sinon, il saute l’itération de la boucle et passe à la suivante.
  4. S'endort pendant le temps spécifié dans la configuration

Installation et configuration

Il serait probablement possible de créer un package .deb, mais je ne suis pas doué pour cela et ce n’est pas si difficile.
J'ai décrit le processus en détail dans README.md sur page du référentiel.

Mais juste au cas où, je vais le décrire en russe en termes généraux :

  1. Assurez-vous que python3 et python3-pip sont installés, sinon, installez-les (sous Windows, python3-pip est installé avec Python)
  2. Cloner ou télécharger le référentiel
  3. Installez les dépendances requises.
    python3 -m pip install -r requirements.txt

  4. Exécutez le script d'installation
    Pour Linux:

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

    Pour Windows : windows_install.bat

  5. Modifier le fichier de configuration
    Pour Linux:

    sudoedit /etc/zen-cf-ddns.conf

    Fenêtres :

    Ouvrez le fichier zen-cf-ddns.conf dans le dossier où vous avez installé le script.

    Il s'agit d'un fichier JSON ordinaire, les paramètres n'ont rien de compliqué - j'y ai spécifiquement décrit 2 zones différentes à titre d'exemple.

Qu'y a-t-il derrière les installateurs ?

install.sh pour Linux :

  1. Un utilisateur est créé pour exécuter le démon, sans créer de répertoire personnel et sans possibilité de se connecter.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Un fichier journal est créé dans /var/log/
  3. Faire de l'utilisateur nouvellement créé le propriétaire du fichier journal
  4. Les fichiers sont copiés à leur place (config dans /etc, fichier exécutable dans /usr/bin, fichier de service dans /lib/systemd/system)
  5. Le service est activé

windows_install.bat pour Windows :

  1. Copie l'exécutable et le fichier de configuration dans un dossier spécifié par l'utilisateur
  2. Crée une tâche dans le planificateur pour exécuter le script au démarrage du système
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Après avoir modifié la configuration, le script doit être redémarré ; sous Linux, tout est simple et familier :

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

pour Windows, vous devrez tuer le processus pythonw et réexécuter le script (je suis trop paresseux pour écrire un service pour Windows en C#) :

taskkill /im pythonw.exe

Ceci termine l'installation et la configuration, profitez-en pour votre santé.

Pour ceux qui veulent voir le code pas si joli de Python, le voici dépôt sur GitHub.

Licence MIT, alors faites ce que vous voulez avec ce genre de choses.

PS : je comprends que cela s'est avéré être un peu une béquille, mais il fait son travail avec brio.

MISE À JOUR : 11.10.2019/17/37 XNUMX:XNUMX
J'ai trouvé 1 autre problème, et si quelqu'un me dit comment le résoudre, je lui en serai très reconnaissant.
Le problème est que si vous installez des dépendances sans sudo python -m pip install -r ..., alors les modules ne seront pas visibles depuis l'utilisateur du service, et je ne voudrais pas forcer les utilisateurs à installer des modules sous sudo, et c'est Pas correcte.
Comment le rendre beau ?
UPD : 11.10.2019/19/16 XNUMX:XNUMX Le problème a été résolu en utilisant venv.
Il y a eu plusieurs changements. La prochaine version arrivera dans les prochains jours.

Source: habr.com

Ajouter un commentaire