Prólogo
Para necesidades personales en casa, levanté VSphere, en el que corro un enrutador virtual y un servidor Ubuntu como servidor multimedia, además de un montón de otras cosas interesantes, y este servidor debe ser accesible desde Internet. Pero el problema es que mi proveedor cobra por IP estática, que siempre podría usarse para algo más útil. Por eso, estuve utilizando la combinación de ddclient + cloudflare.
Todo iba bien hasta que ddclient dejó de funcionar. Después de investigar un poco, me di cuenta de que había llegado el momento de soluciones improvisadas, ya que estaba dedicando demasiado tiempo a encontrar el problema. Al final, todo se convirtió en un pequeño demonio que simplemente funciona, y eso es todo lo que necesito.
Para quienes estén interesados, bienvenidos a seguir leyendo.
Herramientas utilizadas y cómo funciona 'esto'
Así que lo primero que hice fue consultar en el sitio de cloudflare, todo lo que necesitaba saber sobre . Y ya estaba por implementar todo en Python (después de familiarizarme con Python, lo utilizo cada vez más para tareas simples o cuando necesito hacer un prototipo rápidamente), cuando de repente me encontré con una implementación prácticamente lista.
Así que tomé como base un wrapper .
Tomé uno de los ejemplos para actualizar DNS y añadí el uso de un archivo de configuración y la posibilidad de actualizar múltiples registros A dentro de la zona y, por supuesto, un número ilimitado de zonas.
La lógica es la siguiente:
- El script obtiene de un archivo de configuración una lista de zonas y las recorre en un ciclo.
- En cada zona, el script recorre en un ciclo cada registro DNS tipo A o AAAA y compara la IP pública con el registro.
- Si la IP es diferente, la cambia; si no, salta a la siguiente iteración del ciclo.
- Se duerme por el tiempo indicado en la configuración.
Instalación y configuración
Probablemente podría haber hecho un paquete .deb, pero no soy experto en eso, y tampoco es tan complicado.
He descrito el proceso con bastante detalle en el README.md en .
Pero por si acaso, lo describiré en ruso con palabras generales:
- Asegúrate de que tengas instalado python3 y python3-pip; si no, instálalo (en Windows, python3-pip se instala junto con Python).
- Clona o descarga el repositorio.
- Instala las dependencias necesarias.
python3 -m pip install -r requirements.txt - Ejecuta el script de instalación.
Para Linux:chmod +x install.sh sudo ./install.shPara Windows: windows_install.bat
- Edita el archivo de configuración.
Para Linux:sudoedit /etc/zen-cf-ddns.confPara Windows:
Abre el archivo zen-cf-ddns.conf en la carpeta donde instalaste el script.
Este es un archivo JSON común; no hay nada complicado en la configuración; lo describí específicamente como un ejemplo de 2 zonas diferentes.
¿Qué se esconde detrás de los instaladores?
install.sh para Linux:
- Se crea un usuario para ejecutar el demonio, sin crear un directorio home ni permitir el inicio de sesión.
sudo useradd -r -s /bin/false zen-cf-ddns - Se crea un archivo para registrar logs en /var/log/
- Hacemos propietario del archivo de logs al usuario recién creado
- Se copian los archivos a sus lugares correspondientes (configuración en /etc, archivo ejecutable en /usr/bin, archivo de servicio en /lib/systemd/system)
- Se activa el servicio
windows_install.bat para Windows:
- Copia el archivo ejecutable y el archivo de configuración en la carpeta especificada por el usuario
- Crea una tarea en el programador para ejecutar el script al arrancar el sistema
schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart
Después de cambiar la configuración, el script debe reiniciarse; en Linux 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
en Windows tendrás que matar el proceso pythonw y reiniciar el script (me da pereza escribir un servicio para Windows en C#):
taskkill /im pythonw.exeCon esto, la instalación y configuración han terminado; disfruten.
Para aquellos que quieren ver un código Python no tan bonito, aquí está .
Licencia MIT, así que hagan lo que quieran con esto.
P.D.: Entiendo que quedó un poco provisional, pero cumple con su tarea de maravilla.
UPD: 11.10.2019 17:37
Encontré otro problema, y si alguien puede darme una solución, estaré muy agradecido.
El problema es que si se instalan las dependencias sin sudo python -m pip install -r …, entonces los módulos no serán visibles desde el usuario del servicio, y no quiero obligar a los usuarios a instalar módulos con sudo; eso no es correcto.
¿Cómo hacerlo correctamente para que se vea bien?
UPD: 11.10.2019 19:16 Problema resuelto utilizando venv.
Se realizaron varios cambios. Habrá un nuevo lanzamiento en los próximos días.
Fuente: habr.com
