DNS dinâmico personalizado com CloudFlare

Prefácio


Uma imagem para atrair a atenção Para necessidades pessoais, ele criou o VSphere, no qual eu giro um roteador virtual e um servidor Ubuntu como um servidor de mídia e um monte de brindes, e esse servidor deve estar acessível na Internet. Mas o problema é que meu provedor fornece estática por dinheiro, que você pode encontrar sempre um aplicativo mais útil. Portanto, usei um monte de ddclient + cloudflare.

Tudo estava bem até o ddclient parar de funcionar. Depois de cavar um pouco, percebi que havia chegado a hora de muletas e bicicletas, pois o tempo para procurar o problema começou a demorar muito. No final, tudo se transformou em um pequeno demônio que simplesmente funciona, mas eu não preciso de mais nada.
Quem se importa - bem-vindo ao gato.

Ferramentas usadas e como funciona


Portanto, a primeira coisa que aprendi no site cloudflare é tudo o que você precisa saber sobre a API . E eu já estava sentado para implementar tudo em Python (depois de conhecer o Python, eu o uso com mais frequência para algumas tarefas simples ou quando preciso criar rapidamente um protótipo) quando de repente me deparei com uma implementação quase pronta.
Em geral, o wrapper python-cloudflare foi tomado como base.

Tomei um exemplo para atualizar o 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, naturalmente, 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 passa por elas em um loop
  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, altere-o; caso contrário, pule a iteração do loop e passe para a próxima
  4. Adormece no horário especificado na configuração

Instalação e configuração


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

Mas por precaução, descreverei em russo em termos gerais:

  1. Verifique se você tem o python3 e o python3-pip instalados, caso contrário, instale (no Windows, o python3-pip está instalado com o Python)
  2. Clonar ou baixar 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 em que você instalou o script.

    Este é um arquivo JSON comum, nada é complicado pelas configurações - eu descrevi especificamente como exemplo 2 zonas diferentes nele.

O que está escondido atrás dos instaladores?


install.sh para Linux:

  1. Um usuário é criado para iniciar o daemon, sem criar um diretório inicial e recursos de login.

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

  2. Um arquivo de log é criado em / var / log /
  3. Tornamos o proprietário do arquivo de log do usuário recém-criado
  4. Os arquivos são copiados em seus locais (configuração 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. Copiar arquivo executável e arquivo de configuração para a pasta especificada pelo usuário
  2. Cria uma tarefa no planejador para executar um script na inicialização do sistema
    schtasks /create /tn "CloudFlare Update IP" /tr "%newLocation%" /sc onstart

Depois de 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ê precisará interromper o processo pythonw e executar novamente o script (tenho muita preguiça de escrever um serviço no Windows em C #):

 taskkill /im pythonw.exe 

Nesta instalação e configuração estiver concluída, use sua saúde.

Para aqueles que querem olhar para o código Python mais bonito, aqui está um repositório no GitHub .

Licença do MIT, faça o que quiser com esse bem.

PS: Entendo que acabou sendo uma muleta, mas lida com sua tarefa com um estrondo.

UPD: 10/10/2019 17:37
Encontrei mais um problema e, se alguém me disser como resolvê-lo, ficarei muito agradecido.
O problema é que, se você instalar dependências sem o sudo python -m pip install -r ..., então, sob o usuário do serviço, os módulos não estarão visíveis, mas eu não gostaria de forçar os usuários a instalar módulos no sudo, e isso não está correto.
Como torná-lo bonito?
UPD: 11/11/2019 19:16 O problema é resolvido usando venv.
Acabou algumas mudanças. O próximo lançamento será no outro dia.

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


All Articles