ESP8266: Como fazer um atualizador para DDNS Cloudflare

Eu não sou programador. Tudo o que garanto é que nas condições certas o programa funciona.

Correções e aperfeiçoamentos são bem-vindos.

Você precisa de:

Preencha os dados da sua rede sem fio e da sua conta Cloudflare e faça o upload. Se tudo estiver certo o procedimento do programa será o seguinte:

Ao inicializar:

  • Verifica o IP registrado para o host na sua conta Cloudflare;
  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Se forem diferentes atualiza a sua conta Cloudflare;
  • Guarda o IP para não precisar mais consultar a conta;

A cada 10 minutos

  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Compara com o ip armazenado e atualiza sua conta se forem diferentes;

Em caso de erro o programa reduz o intervalo entre checagens para 2 minutos. Retorna a 10 minutos após o primeiro sucesso.

 

A melhorar:

  • As rotinas de parse ainda são uma gambiarra;
  • Não testei se minhas checagens de erro realmente funcionam;
  • Com mais alguns GETs e parses JSON é possível obter o zone_id e o host_id a partir do host_name. Isso simplifica a vida de quem não sabe obter essas informações.

O programa não prossegue se o fingerprint do certificado for diferente do esperado. Infelizmente isso significa que quando o certificado da Clouflare for atualizado o programa deixará de funcionar até que um novo fingerprint seja inserido. Você pode remover esse requerimento mas fica sujeito a roubo de suas credenciais num ataque MITM. Uma sugestão seria armazenar o fingerprint em um arquivo no SPIFFS e fazer o programa ao não conseguir mais validar o certificado mandar uma mensagem para você e passar a procurar por uma atualização de fingerprint no seu domínio, em arquivo criptografado por você.

Infelizmente não parece haver meio do ESP8266 verificar a validade de certificados em tempo real. A checagem de fingerprints foi o melhor que a impressionante equipe por trás do desenvolvimento conseguiu fazer.

Ferramentas online úteis ao debugar esse projeto:

  • Teste da ArduinoJSON – Você pode testar algumas idéias sem ter que fazer upload para um arduino
  • dostring.com – Não sabe qual o tamanho do JSON em bytes? String Length diz.
  • JSON Parser Online – Não consegue visualizar a árvore mentalmente? Permite colapsar estruturas;
This entry was posted in Informação and tagged . Bookmark the permalink.

6 Responses to ESP8266: Como fazer um atualizador para DDNS Cloudflare

  1. Jefferson says:

    Corrigi um erro de comparação quer acontecia ao iniciar e fiz algumas tentativas de tornar o código mais robusto.

  2. Jefferson says:

    Como eu tenho dois acessos à internet hoje que posso escolher trocando o gateway eu tenho também dois IPs externos. Me ocorreu agora que seria útil modificar o programa para que possa atualizar um host com cada IP. Parece ser perfeitamente possível modificar o programa para, usando IP fixo em vez de DHCP, alternar entre os dois gateways e fazer as atualizações

  3. Jefferson says:

    O programa tem um problema em ParseJSON que faz vazar quantidades aparentemente aleatórias entre execuções (a cada 10 minutos). Numa execução a RAM livre podia continuar a mesma da anterior e na seguinte 4KB serem perdidos de uma vez. O resultado é que em menos de 100 minutos o programa pára de funcionar porque não há mais RAM livre (menos de 9KB) suficiente para jsonBuffer.parseObject operar.

    Pode ser que eu esteja chamando a função incorretamente mas eu resolvi o problema eliminando o uso da biblioteca ArduinoJSOn completamente e fazendo o parse da string eu mesmo. O programa parece estável agora com 18KB livres.

  4. Jefferson says:

    Em 4/06/2018 a Cloudflare passou a suportar apenas TLS v1.2 e rejeitar conexões TLS v1.1, que era a versão suportada pelo ESP8266 Core v2.3.0.

    Eu obtive sucesso usando o IDE Arduino 1.8.5 e ESP8266 Core 2.4.1, com uma ressalva: o sketch passou a acusar o erro “a conexão falhou” ao tentar acessar api.cloudflare.com.

    Ativando o modo de debug no IDE percebi que o erro era um “lookup error: -6” que ocorria na função [hostbyname]. Eu resolvi definindo manualmente um servidor de DNS (usei o da Google) para a chamada de Wifi.config().

    Notar que enquanto eu estava usando a versão 2.3.0 eu não observei esses erros de lookup.

  5. Jefferson says:

    O fingerprint atual do certificado Cloudflare é:
    E4 D2 7F F4 37 D0 93 2E 29 E6 E6 77 35 A9 0F F9 F0 D4 A5 D3

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *