DNS dynamique personnalisé avec CloudFlare

Préface


Une image pour attirer l'attention Pour des besoins personnels, il a soulevé VSphere, sur lequel je tourne un routeur virtuel et un serveur Ubuntu en tant que serveur multimédia et un tas de goodies, et ce serveur devrait être accessible depuis Internet. Mais le problème est que mon fournisseur donne des statistiques pour de l'argent, que vous pouvez toujours trouver une application plus utile. Par conséquent, j'ai utilisé un tas de ddclient + cloudflare.

Tout allait bien jusqu'à ce que ddclient cesse de fonctionner. Après l'avoir creusé un peu, j'ai réalisé que le moment était venu pour les béquilles et les vélos, car il commençait à prendre trop de temps pour trouver le problème. Au final, tout s'est transformé en un petit démon qui fonctionne, mais je n'en ai plus besoin.
Peu importe - bienvenue au chat.

Outils utilisés et comment ça marche


La première chose que j'ai apprise sur le site cloudflare est donc tout ce que vous devez savoir sur l' API . Et j'étais déjà assis pour implémenter tout en Python (après avoir fait connaissance avec Python, je l'utilise plus souvent pour certaines tâches simples ou quand j'ai besoin de créer rapidement un prototype), quand je suis soudain tombé sur une implémentation presque prête à l'emploi.
En général, le wrapper python-cloudflare a été pris comme base.

J'ai pris un exemple pour mettre à jour DNS et ajouté l'utilisation d'un fichier de configuration et la possibilité de mettre à jour plusieurs enregistrements A dans une zone et naturellement 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 traverse en boucle
  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 IP est différent, changez-le; sinon, sautez l'itération de la boucle et passez à la suivante
  4. S'endort à l'heure spécifiée dans la config

Installation et configuration


Il serait probablement possible de faire un package .deb, mais je ne suis pas fort à ce sujet, et ce n'est pas si compliqué.
J'ai décrit le processus en détail dans README.md sur la page du référentiel .

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

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

    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. Editez le fichier de configuration
    Pour Linux:

     sudoedit /etc/zen-cf-ddns.conf 

    Pour Windows:

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

    Il s'agit d'un fichier JSON standard, rien n'est compliqué par les paramètres - j'ai spécifiquement décrit comme exemple 2 zones différentes.

Qu'est-ce qui se cache derrière les installateurs?


install.sh pour Linux:

  1. Un utilisateur est créé pour démarrer le démon, sans créer de répertoire personnel ni de capacités de connexion.

     sudo useradd -r -s /bin/false zen-cf-ddns 

  2. Un fichier journal est créé dans / var / log /
  3. Nous rendons le propriétaire du fichier journal de l'utilisateur nouvellement créé
  4. Les fichiers sont copiés à leur place (configuration 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. Copiez le fichier exécutable et le fichier de configuration dans le dossier spécifié par l'utilisateur
  2. Crée une tâche dans le planificateur pour exécuter un script au démarrage du système
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Après avoir changé 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 relancer le script (je suis très paresseux pour écrire un service sous Windows en C #):

 taskkill /im pythonw.exe 

Une fois l'installation et la configuration terminées, utilisez votre santé.

Pour ceux qui ne veulent pas regarder le plus beau code Python, voici un référentiel sur GitHub .

Licence MIT, alors faites ce que vous voulez avec ce bien.

PS: Je comprends que cela s'est avéré être une petite béquille, mais fait face à sa tâche avec fracas.

UPD: 10/10/2019 17:37
J'ai trouvé un 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 sous l'utilisateur du service, les modules ne seront pas visibles, mais je ne voudrais pas forcer les utilisateurs à installer des modules sous sudo, et ce n'est pas correct.
Comment le rendre beau?
UPD: 10/11/2019 19:16 Le problème est résolu en utilisant venv.
Il s'est avéré quelques changements. La prochaine version sera l'autre jour.

Source: https://habr.com/ru/post/fr471102/


All Articles