DNS dinámico personalizado con CloudFlare

Prólogo


Una imagen para llamar la atención. Para necesidades personales, crió a VSphere, en el cual giré un enrutador virtual y un servidor Ubuntu como servidor de medios y un montón de cosas buenas, y este servidor debería ser accesible desde Internet. Pero el problema es que mi proveedor proporciona estadísticas estáticas por dinero, que siempre puede encontrar una aplicación más útil. Por lo tanto, usé un montón de ddclient + cloudflare.

Todo estuvo bien hasta que ddclient dejó de funcionar. Después de cavar un poco, me di cuenta de que había llegado el momento de las muletas y las bicicletas, ya que comenzó a tomar demasiado tiempo para encontrar el problema. Al final, todo se convirtió en un pequeño demonio que simplemente funciona, pero ya no lo necesito.
A quién le importa, bienvenido a cat.

Herramientas usadas y cómo funciona "eso"


Entonces, lo primero que aprendí en el sitio cloudflare es todo lo que necesita saber sobre la API . Y ya estaba sentado para implementar todo en Python (después de conocer Python, lo uso con más frecuencia para algunas tareas simples o cuando necesito hacer un prototipo rápidamente), cuando de repente me topé con una implementación casi lista.
En general, el envoltorio python-cloudflare se tomó como base.

Tomé un ejemplo para actualizar DNS y agregué el uso de un archivo de configuración y la capacidad de actualizar varios registros A dentro de una zona y, naturalmente, un número ilimitado de zonas.

La lógica es la siguiente:

  1. El script recibe una lista de zonas del archivo de configuración y las pasa en un bucle.
  2. En cada zona, el script recorre cada registro DNS de tipo A o AAAA y verifica la IP pública con el registro
  3. Si la IP es diferente, cámbiela; de lo contrario, omita la iteración del bucle y pase al siguiente
  4. Se queda dormido a la hora especificada en la configuración

Instalación y configuración


Probablemente sería posible hacer un paquete .deb, pero no soy fuerte en eso, y no es tan complicado.
Describí el proceso en detalle en README.md en la página del repositorio .

Pero por si acaso, describiré en ruso en términos generales:

  1. Asegúrese de tener instalado python3 y python3-pip, si no, instale (en Windows, python3-pip está instalado con Python)
  2. Clonar o descargar el repositorio
  3. Instalar las dependencias necesarias.

    python3 -m pip install -r requirements.txt 

  4. Ejecute el script de instalación
    Para Linux:

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

    Para Windows: windows_install.bat
  5. Edite el archivo de configuración
    Para Linux:

     sudoedit /etc/zen-cf-ddns.conf 

    Para Windows:

    Abra el archivo zen-cf-ddns.conf en la carpeta donde instaló el script.

    Este es un archivo JSON normal, nada es complicado por la configuración: describí específicamente como ejemplo 2 zonas diferentes en él.

¿Qué se esconde detrás de los instaladores?


install.sh para Linux:

  1. Se crea un usuario para iniciar el demonio, sin crear un directorio de inicio y capacidades de inicio de sesión.

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

  2. Se crea un archivo de registro en / var / log /
  3. Hacemos que el propietario del archivo de registro del usuario recién creado
  4. Los archivos se copian en su lugar (configuración en / etc, archivo ejecutable en / usr / bin, archivo de servicio en / lib / systemd / system)
  5. El servicio está activado

windows_install.bat para Windows:

  1. Copie el archivo ejecutable y el archivo de configuración a la carpeta especificada por el usuario
  2. Crea una tarea en el planificador para ejecutar un script al inicio del sistema
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Después de cambiar la configuración, el script debe reiniciarse, en Linux todo es simple y familiar:

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

para Windows, debe eliminar el proceso de pythonw y volver a ejecutar el script (es muy vago para mí escribir un servicio en Windows en C #):

 taskkill /im pythonw.exe 

En esta instalación y configuración completada, use su salud.

Para aquellos que no quieren ver el código Python más hermoso, aquí hay un repositorio en GitHub .

Licencia MIT, así que haz lo que quieras con este bien.

PD: Entiendo que resultó ser una pequeña muleta, pero hace frente a su tarea con una explosión.

UPD: 10/10/2019 17:37
Encontré un problema más, y si alguien me dice cómo resolverlo, estaré muy agradecido.
El problema es que si instala las dependencias sin sudo python -m pip install -r ..., entonces, desde debajo del usuario del servicio, los módulos no serán visibles, pero no quisiera obligar a los usuarios a instalar módulos bajo sudo, y esto no es correcto.
¿Cómo hacerlo hermoso?
UPD: 10/11/2019 19:16 El problema se resuelve usando venv.
Resultó algunos cambios. El próximo lanzamiento será el otro día.

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


All Articles