Seu DNS dinâmico com o CloudFlare

Prefácio

Seu DNS dinâmico com o CloudFlare Para necessidades pessoais em casa, levantei o VSphere, no qual rodo um roteador virtual e um servidor Ubuntu como servidor de mídia, além de várias outras coisas interessantes, e esse servidor deve ser acessível pela Internet. Mas o problema é que meu provedor oferece IP fixo por um custo, que sempre pode ser melhor utilizado. Portanto, utilizei a combinação ddclient + cloudflare.

Tudo estava bem, até que o ddclient parou de funcionar. Depois de investigar um pouco, percebi que era hora de improvisações, pois o tempo gasto na busca pela solução estava se tornando excessivo. No final, tudo resultou em um pequeno daemon que simplesmente funciona, e é tudo que eu precisava.
Para quem tiver interesse – sejam bem-vindos ao post.

Ferramentas utilizadas e como "isso" funciona

Então, a primeira coisa que fiz foi aprender no site da cloudflare tudo o que precisava saber sobre API. E já estava pronto para implementar tudo em Python (depois de conhecer o Python, tenho o usado cada vez mais para tarefas simples ou quando preciso rapidamente fazer um protótipo), quando de repente me deparei com uma implementação praticamente pronta.
Em resumo, foi utilizado como base o wrapper python-cloudflare.

Peguei um dos exemplos para atualização do DNS e adicionei a utilização de um arquivo de configuração e a possibilidade de atualizar múltiplos registros A dentro de uma zona, além, é claro, da capacidade de lidar com um número ilimitado de zonas.

A lógica é a seguinte:

  1. O script obtém de um arquivo de configuração uma lista de zonas e itera sobre elas em um loop.
  2. Em cada zona, o script percorre em loop cada registro de DNS do tipo A ou AAAA e compara o IP público com o registro.
  3. Se o IP for diferente – ele o altera; se não, ignora a iteração do loop e passa para o próximo.
  4. Dorme por um tempo especificado na configuração.

Instalação e configuração

Provavelmente poderia ter feito um pacote .deb, mas não sou bom nisso, e também não é tão complicado.
O processo está descrito em detalhes no README.md na página do repositório.

Mas, para garantir, descreverei em russo de forma geral:

  1. Certifique-se de que você tem python3 e python3-pip instalados; se não, instale (no Windows, python3-pip é instalado junto com o Python).
  2. Clone ou baixe o repositório.
  3. Instale as dependências necessárias.
    python3 -m pip install -r requirements.txt

  4. Execute o script de instalação.
    Para Linux:
    chmod +x install.sh
    sudo ./install.sh

    Para Windows: windows_install.bat

  5. Edite o arquivo de configuração.
    Para Linux:
    sudoedit /etc/zen-cf-ddns.conf

    Para Windows:

    Abra o arquivo zen-cf-ddns.conf na pasta onde você instalou o script.

    Este é um arquivo JSON comum; as configurações não são complicadas - escrevi como exemplo duas zonas diferentes nele.

O que está por trás dos instaladores?

install.sh para Linux:

  1. Um usuário é criado para executar o daemon, sem que um diretório inicial seja criado e sem possibilidade de login.
    sudo useradd -r -s /bin/false zen-cf-ddns

  2. Um arquivo para registro de log é criado em /var/log/
  3. Tornamos o proprietário do arquivo de log o usuário recém-criado
  4. Os arquivos são copiados para seus respectivos locais (configuração em /etc, arquivo executável em /usr/bin, arquivo de serviço em /lib/systemd/system)
  5. O serviço é ativado

windows_install.bat para Windows:

  1. Copia o arquivo executável e o arquivo de configuração para a pasta especificada pelo usuário
  2. Cria uma tarefa no agendador para executar o script na inicialização do sistema
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Após a alteração da configuração, o script precisa ser reiniciado, em Linux é simples e habitual:

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 será necessário finalizar o processo pythonw e reiniciar o script (realmente é uma chatice eu escrever um serviço em Windows em C#):

taskkill /im pythonw.exe

Com isso, a instalação e configuração estão concluídas, aproveitem.

Para quem quer ver um código Python não tão bonito, aqui está repositório no GitHub.

Licença MIT, então façam o que quiserem com isso.

P.S.: Entendo que ficou um pouco improvisado, mas cumpre bem sua função.

UPD: 11.10.2019 17:37
Encontrei mais um problema, e se alguém puder me ajudar a resolvê-lo, ficarei muito grato.
O problema é que se instalar as dependências sem sudo python -m pip install -r …, os módulos não serão visíveis sob o usuário do serviço, e eu não gostaria de forçar os usuários a instalar módulos com sudo, além de que isso não está certo.
Como fazer isso corretamente, de forma elegante?
UPD: 11.10.2019 19:16 O problema foi resolvido utilizando venv.
Algumas mudanças foram feitas. Um novo lançamento será anunciado em breve.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster