Seu próprio DNS dinâmico usando CloudFlare

Prefácio

Seu próprio DNS dinâmico usando CloudFlare Para necessidades pessoais em casa, instalei o VSphere, no qual executo um roteador virtual e um servidor Ubuntu como servidor de mídia e um monte de outras vantagens, e esse servidor deve estar acessível pela Internet. Mas o problema é que meu provedor fornece dados estáticos em troca de dinheiro, que sempre podem ser usados ​​para fins mais úteis. Portanto, usei a combinação ddclient + cloudflare.

Tudo estava bem até que o ddclient parou de funcionar. Depois de fuçar um pouco, percebi que havia chegado a hora das muletas e das bicicletas, pois estava demorando muito para encontrar o problema. No final, tudo virou um pequeno daemon que simplesmente funciona e não preciso de mais nada.
Se alguém estiver interessado, seja bem-vindo ao gato.

Ferramentas usadas e como “isso” funciona

Então a primeira coisa que descobri no site da cloudflare é tudo o que você precisa saber sobre API. E eu já havia me sentado para implementar tudo em Python (depois de me familiarizar com Python, uso-o cada vez mais para algumas tarefas simples ou quando preciso fazer um protótipo rapidamente), quando de repente me deparei com uma implementação quase pronta.
Em geral, o invólucro foi tomado como base python-cloudflare.

Peguei um dos exemplos de atualização de DNS e adicionei o uso de um arquivo de configuração e a capacidade de atualizar vários registros A dentro de uma zona e, claro, um número ilimitado de zonas.

A lógica é a seguinte:

  1. O script recebe uma lista de zonas do arquivo de configuração e percorre-as
  2. Em cada zona, o script percorre cada registro DNS do tipo A ou AAAA e verifica o IP público com o registro
  3. Se o IP for diferente, ele o altera; caso contrário, ele pula a iteração do loop e passa para a próxima.
  4. Adormece pelo tempo especificado na configuração

Instalação e configuração

Provavelmente seria possível criar um pacote .deb, mas não sou bom nisso e não é tão difícil.
Descrevi o processo detalhadamente em README.md em página do repositório.

Mas, por precaução, vou descrevê-lo em russo em termos gerais:

  1. Certifique-se de ter python3 e python3-pip instalados, caso contrário, instale-os (no Windows, python3-pip é instalado junto com 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 normal, as configurações não são nada complicadas - descrevi especificamente 2 zonas diferentes nele como exemplo.

O que está por trás dos instaladores?

instalar.sh para Linux:

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

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

windows_install.bat para Windows:

  1. Copia o arquivo executável e de configuração para uma 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 alterar a configuração, o script precisa ser reiniciado; no Linux tudo é simples e 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 você terá que encerrar o processo pythonw e executar novamente o script (estou com preguiça de escrever um serviço para Windows em C#):

taskkill /im pythonw.exe

Isso completa a instalação e configuração, aproveite para sua saúde.

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

Licenciado pelo MIT, então faça o que quiser com essas coisas.

PS: Entendo que acabou sendo uma espécie de muleta, mas faz seu trabalho com força.

ATUALIZAÇÃO: 11.10.2019/17/37 XNUMX:XNUMX
Encontrei mais 1 problema, e se alguém me disser como resolver ficarei muito grato.
O problema é que se você instalar dependências sem sudo python -m pip install -r ..., os módulos não serão visíveis para o usuário do serviço, e eu não gostaria de forçar os usuários a instalar módulos no sudo, e isso é incorreto.
Como fazer com que fique lindo?
UPD: 11.10.2019/19/16 XNUMX:XNUMX O problema foi resolvido usando venv.
Houve várias mudanças. O próximo lançamento será nos próximos dias.

Fonte: habr.com

Adicionar um comentário