Jefferson, 29 de março de 2020, cloudflare, ddns Para entender este texto você precisa estar familiarizado pelo menos com o que expliquei neste outro.
A proposta de Scott Helme é uma solução mista de código aberto, que funciona no Windows e no Linux, mas requer que você tenha um servidor na internet com suporte a php.
São dois scripts. Um php rodando no servidor na internet e outro “batch” rodando na rede cujo ddns você quer manter atualizado. Todo o trabalho é feito pelo script php e o batch apenas serve para que o script php possa determinar qual seu atual endereço IP.
Se você usa Windows, ignore o script .sh fornecido e use os seguintes criados por mim (só funciona nas versões do Windows com suporte a Powershell – Windows 7 SP1 em diante):
cloudflare.bat
|
:loop powershell -executionpolicy bypass -File cloudflare_updater.ps1 timeout /t 120 goto loop |
Esse arquivo .bat vai executar o script a seguir a cada 120s.
cloudflare_updater.ps1
|
$postParams = @{auth='IjIraF4325678d1X8OI8j'} [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Invoke-WebRequest -Uri https://ryan.com.br/atualizar_ddns_cloudflare.php -Method POST -Body $postParams |
Notas:
- O que vem depois de “auth=” é uma senha/token que você pode definir como você quiser mas que precia ser igual ao que você definiu no script php. Por esse token é que o script vai saber ao mesmo tempo que você tem autorização e qual host você quer atualizar.
- Você tem que mudar o URL indicado (https://ryan.com.br/atualizar_ddns_cloudflare.php) para o endereço onde está hospedado o seu script php.
- Se o script .ps1 acusar um erro relacionado com o Internet Explorer, certifique-se de ter executado o IE na máquina ao menos uma vez para se livrar daquela pergunta que ele faz.
- A senha é necessária para evitar que alguém que descubra o endereço do seu script até mesmo por acidente (o mais provável é que seja maliciosamente) redirecione o ddns para si.
- Você pode precisar mudar o SecurityProtocolType do script para o usado pelo seu servidor de hospedagem. Eu usei tls12 porque foi o que funcionou com o meu.
Para que alguma mudança feita por Scott não quebre a compatibilidade da minha contribuição, aqui está uma cópia do script php dele da forma como funciona hoje, com algumas coisas traduzidas e/ou explicadas por mim. Note que com o token dado no meu arquivo .ps1 o subdomínio que terá o DDNS atualizado é subdominio1.automalabs.com.br:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
<?php /* Author: Scott Helme Site: https://scotthelme.co.uk */ // Você pode (mas não é obrigatório) gerar senhas aqui: https://scotthel.me/v1n0 // Exemplo: Kqt9TH4qBEOfNSGWfPM0 // Insert the appropriate "key" => "subdomain" values below $hosts = array( "IjIraF4325678d1X8OI8j" => "subdominio1", "ewrfwbffgyw8yrt43br4uf" => "subdominio2", "dhsahdaugdaswteq2we23q" => "subdominio3", "kariryeryhyhgrgfweaygq" => "subdominioX" ); // Verifica se o cliente chamador tem uma senha válida. if (empty($_POST['auth'])) { die("Requer autenticação\n"); } elseif (!array_key_exists($_POST['auth'], $hosts)) { die("Chave de autorização inválida\n"); } // Atualize os valores abaixo com as informações da sua conta Cloudflare. $apiKey = "CloudFlareApiKey"; // Sua CloudFlare API Key. $myDomain = "automalabs.com.br"; // O nome do seu domínio cadastrado na cloudflare. $emailAddress = "xxxxx@ryan.com.br"; // O endereço de email do seu cadastro na Cloudflare // Estes valores não precisam ser alterados. if (empty($hosts[$_POST['auth']])) $ddnsAddress = $myDomain; // If no subdomain is given, update the domain itself. else $ddnsAddress = $hosts[$_POST['auth']].".".$myDomain; // The subdomain that will be updated. $ip = $_SERVER['REMOTE_ADDR']; // The IP of the client calling the script. //$ip = $_SERVER['HTTP_CF_CONNECTING_IP']; // Replace the above line with this one if the DDNS server is behind Cloudflare $baseUrl = 'https://api.cloudflare.com/client/v4/'; // The URL for the CloudFlare API. // Array with the headers needed for every request $headers = array( "X-Auth-Email: ".$emailAddress, "X-Auth-Key: ".$apiKey, "Content-Type: application/json" ); // Sends request to CloudFlare and returns the response. function send_request($requestType) { global $url, $fields, $headers; $fields_string=""; if ($requestType == "POST" || $requestType == "PUT") { $fields_string = json_encode($fields); } // Send the request to the CloudFlare API. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, "curl"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $requestType); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($requestType == "POST" || $requestType == "PUT") { curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); return json_decode($result); } // Prints errors and messages and kills the script function print_err_msg() { global $data; if (!empty($data->errors)) { echo "Errors:\n"; print_r($data->errors); echo "\n"; } if (!empty($data->messages)) { echo "Messages:\n"; print_r($data->messages); echo "\n"; } die(); } // Determine protocol version and set record type. if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { $type = 'AAAA'; } else { $type = 'A'; } //Update $baseUrl $baseUrl .= 'zones'; // Build the request to fetch the zone ID. // https://api.cloudflare.com/#zone-list-zones $url = $baseUrl.'?name='.$myDomain; $data = send_request("GET"); // Continue if the request succeeded. if ($data->success) { // Extract the zone ID (if it exists) and update $baseUrl if (!empty($data->result)) { $zoneID = $data->result[0]->id; $baseUrl .= '/'.$zoneID.'/dns_records'; } else { die("Zone ".$myDomain." doesn't exist\n"); } // Print error message if the request failed. } else { print_err_msg(); } // Build the request to fetch the record ID. // https://api.cloudflare.com/#dns-records-for-a-zone-list-dns-records $url = $baseUrl.'?type='.$type; $url .= '&name='.$ddnsAddress; $data = send_request("GET"); // Continue if the request succeeded. if ($data->success) { // Extract the record ID (if it exists) for the subdomain we want to update. $rec_exists = false; // Assume that the record doesn't exist. if (!empty($data->result)) { $rec_exists = true; // If this runs, it means that the record exists. $id = $data->result[0]->id; $cfIP = $data->result[0]->content; // The IP Cloudflare has for the subdomain. } // Print error message if the request failed. } else { print_err_msg(); } // Create a new record if it doesn't exist. if (!$rec_exists) { // Build the request to create a new DNS record. // https://api.cloudflare.com/#dns-records-for-a-zone-create-dns-record $fields = array( 'type' => $type, 'name' => $ddnsAddress, 'content' => $ip, ); $url = $baseUrl; $data = send_request("POST"); // Print success/error message. if ($data->success) { echo $ddnsAddress."/".$type." record successfully created\n"; } else { print_err_msg(); } // Only update the entry if the IP addresses do not match. } elseif ($ip != $cfIP) { // Build the request to update the DNS record with our new IP. // https://api.cloudflare.com/#dns-records-for-a-zone-update-dns-record $fields = array( 'name' => $ddnsAddress, 'type' => $type, 'content' => $ip ); $url = $baseUrl.'/'.$id; $data = send_request("PUT"); // Print success/error message. if ($data->success) { echo $ddnsAddress."/".$type." successfully updated to ".$ip."\n"; } else { print_err_msg(); } } else { echo $ddnsAddress."/".$type." is already up to date\n"; } ?> |
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 07 de julho de 2017, automação, ddns O hardware completo consiste de:
- Um ESP8266 qualquer (R$15 ou menos no ML);
- Um regulador de 3.3V (Menos de R$1);
- Um cabo para ligar a alguma fonte de energia USB que você tenha de bobeira pela casa.
Exemplo:
Esse é o mínimo para que funcione. Um projeto comercial requer mais componentes.
Sim, tendo o resto do material necessário para programação o atualizador sai por menos de R$20 e você ainda pode rodar outras coisas nele.
Se você já tiver um ESP8266 na sua casa ou escritório ocupado com outra tarefa mas com espaço em flash sobrando (HTTPS requer muito do bicho) pode acrescentar o código nele. Afinal o processo leva segundos e ocorre apenas a cada x minutos. E não requer nenhuma GPIO.
Os detalhes da programação eu publiquei no automalabs por sem bem mais apropriado do que aqui.
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 06 de julho de 2017, ddns Este texto tem importância apenas para quem deseja fazer seu próprio script ou programa de atualização DDNS para Cloudflare.
Na primeira vez que tentei entender a documentação da API da Cloudflare há um ano eu falhei miseravelmente. Não entendi nada. Na segunda tentativa esta semana eu entendi em minutos. É engraçado como nosso cérebro funciona.
Aqui eu vou descrever apenas as partes necessárias para fazer atualizações DDNS. Vou usar como exemplo o cURL porque aí já aproveito os exemplos da documentação e apesar de ser uma ferramenta popular do Linux você também pode usar o cURL no Windows. Mas eu recomendo usar o complemento POSTMAN do Chrome inserindo os headers indicados (toda linha precedida por “-H” é um header).
O serviço permite que você cadastre vários domínios, que são referenciados como “zonas”.
Para atualizar um host você primeiro precisa do ID do domínio/zona. Se não sabe o id (ele também aparece na sua conta Cloudflare), primeiro peça uma listagem de zonas:
|
curl -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "X-Auth-Email: user@example.com" \ -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \ -H "Content-Type: application/json" |
A resposta é algo assim (este é o exemplo oficial. A resposta hoje é ligeiramente diferente):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
{ "success": true, "errors": [], "messages": [], "result": [ { "id": "023e105f4ecef8ad9ca31a8372d0c353", "name": "example.com", "development_mode": 7200, "original_name_servers": [ "ns1.originaldnshost.com", "ns2.originaldnshost.com" ], "original_registrar": "GoDaddy", "original_dnshost": "NameCheap", "created_on": "2014-01-01T05:20:00.12345Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name_servers": [ "tony.ns.cloudflare.com", "woz.ns.cloudflare.com" ], "owner": { "id": "7c5dae5552338874e5053f2534d2767a", "email": "user@example.com", "owner_type": "user" }, "permissions": [ "#zone:read", "#zone:edit" ], "plan": { "id": "e592fd9519420ba7405e1307bff33214", "name": "Pro Plan", "price": 20, "currency": "USD", "frequency": "monthly", "legacy_id": "pro", "is_subscribed": true, "can_subscribe": true }, "plan_pending": { "id": "e592fd9519420ba7405e1307bff33214", "name": "Pro Plan", "price": 20, "currency": "USD", "frequency": "monthly", "legacy_id": "pro", "is_subscribed": true, "can_subscribe": true }, "status": "active", "paused": false, "type": "full" } ], "result_info": { "page": 1, "per_page": 20, "count": 1, "total_count": 2000 } } |
Note que o nome de domínio é precedido por um “id”. É isso que você vai usar.
Para obter os registros DNS com o IP atual para um determinado domínio você usa os mesmos headers, mas muda o URL para algo assim:
https://api.cloudflare.com/client/v4/zones/id_do_dominio/dns_records
Exemplo de resposta (eu suprimi vários registros desnecessários para a explicação e editei informação confidencial):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
{ "result": [ { "id": "####################################", "type": "A", "name": "automalabs.com.br", "content": "192.185.224.99", "proxiable": true, "proxied": true, "ttl": 1, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2016-09-13T21:49:36.667689Z", "created_on": "2016-09-13T21:49:36.667689Z", "meta": { "auto_added": true } }, { "id": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", "type": "A", "name": "localhost.automalabs.com.br", "content": "127.0.0.1", "proxiable": false, "proxied": false, "ttl": 1, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2016-09-13T21:49:36.745572Z", "created_on": "2016-09-13T21:49:36.745572Z", "meta": { "auto_added": true } }, { "id": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "type": "A", "name": "batcaverna.automalabs.com.br", "content": "189.70.xx.yyy", "proxiable": true, "proxied": false, "ttl": 120, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2017-07-07T04:35:16.994150Z", "created_on": "2017-07-07T04:35:16.994150Z", "meta": { "auto_added": false } }, } ], "result_info": { "page": 1, "per_page": 20, "total_pages": 1, "count": 3, "total_count": 3 }, "success": true, "errors": [], "messages": [] } |
Para se limitar a receber o dados de um host específico (é este o comando que finalmente traz o IP configurado para o host):
https://api.cloudflare.com/client/v4/zones/id_do_dominio/dns_records/id_do_host
Exemplo de resposta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
{ "result": { "id": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "type": "A", "name": "batcaverna.automalabs.com.br", "content": "127.0.0.1", "proxiable": false, "proxied": false, "ttl": 120, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2017-07-07T04:17:14.185987Z", "created_on": "2017-07-07T04:17:14.185987Z", "meta": { "auto_added": false } }, "success": true, "errors": [], "messages": [] } |
Para atualizar um host (preste atenção aos vários campos que você precisa modificar):
|
curl -X PUT "https://api.cloudflare.com/client/v4/zones/id_do_dominio/dns_records/id_do_host" \ -H "X-Auth-Email: user_email" \ -H "X-Auth-Key: api_key" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"batcaverna.automalabs.com.br","content":"192.168.0.1","ttl":120,"proxied":false}' |
“name” precisa ter o nome completo e correto do host. Por alguma razão se o nome estiver errado e não bater com id_do_host a API acrescenta um novo host com esse nome, em vez de atualizar.
No Postman, escolha RAW, JSON e insira os dados de uma chave à outra.
Exemplo de resposta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
{ "result": { "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "type": "A", "name": "batcaverna.automalabs.com.br", "content": "192.168.0.1", "proxiable": false, "proxied": false, "ttl": 120, "locked": false, "zone_id": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "zone_name": "automalabs.com.br", "modified_on": "2017-07-07T04:03:37.550700Z", "created_on": "2017-07-07T04:03:37.550700Z", "meta": { "auto_added": false } }, "success": true, "errors": [], "messages": [] } |
Tenha em mente que os IDs de domínio e host não mudam se você não apagar a definição do host. Então depois que você tem esses IDs só precisa usar dois comandos: o que verifica os dados do host (se quiser saber o IP que está lá) e o PUT que faz a atualização.
Pronto. Esse é o básico necessário da API para atualização DDNS. Queria ter achado algo assim no ano passado.
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 05 de julho de 2017, ddns, Redes Daniel Plácido deu a dica em novembro de 2015. Eu testei em setembro de 2016 e só agora estou tendo tempo de escrever sobre isso. É, infelizmente desde eu saber de algo até escrever sobre o assunto no blog às vezes se passa um looooooongo tempo.
A Cloudflare difere de serviços “normais” de DDNS como o no-ip e o dyndns em aspectos muito importantes que podem ser vistos como problemas:
- Você precisa configurar a Cloudflare como servidor de DNS de todo o seu domínio;
- Não existe cliente oficial de atualização para Windows e não há nenhum suporte embutido em nenhum modem/roteador que eu conheça;
Mas tem vantagens expressivas:
- Não há realmente limite definido no número de hosts. A no-ip hoje só permite três hosts gratuitos por conta;
- Você vai poder criar ilimitados endereços no formato seuhost.seudominio.com.br. Nada do amadorismo de hostqueestavadisponivel.no-ip.com;
Como é o único serviço gratuito e sem frescuras disponível hoje, vale a pena passar por cima dos problemas. É o que vou tentar explicar aqui.
Primeiro você precisa ter configurado Cloudflare como o servidor DNS do domínio. Enquanto esse passo não estiver pronto não adianta prosseguir.
Faça login na sua conta Cloudflare;
Selecione o domínio. Se você tiver apenas um talvez esse passo não exista;
Clique em DNS;
Você vai cair na página que lista todos os registros DNS, mas só nos interessa a parte que adiciona um novo registro.
- O tipo de registro que nos interessa para DDNS será sempre do tipo A;
- Aqui você coloca o nome de host que você escolheu. No caso o resultado seria batcaverna.automalabs.com.br;
- O IP inicial que você quer dar ao registro. Pode ser o seu atual endereço IP externo, o mesmo IP do resto do domínio ou qualquer IP externo que você queira. Você pode até apontar para IP do Google se quiser, embora isso faça você cair em uma mensagem de erro deles. Por outro lado apontar para o IP do UOL dá totalmente certo;
- Por quanto tempo você quer que seja válido, sem exigir nova consulta DNS. Durante testes é melhor colocar 2 minutos (o mínimo);
- Se você quer que a Cloudflare também faça o cache do conteúdo. A escolha pode variar dependendo do uso que você vai fazer, mas desligar o cache vai facilitar os testes. O default, que é ativar o cache, tem o benefício adicional de ocultar seu verdadeiro IP de quem saiba o seu endereço DDNS, porque sempre será visto o IP da Cloudflare;
- Clique em Add Record.
Hosts adicionados começam a responder segundos depois. Hosts modificados podem demorar bastante porque isso depende do TTL e da propagação. Para você ter uma idéia do problema, às vezes no prompt de comando o PING já resolve para o novo IP mas só minutos depois o Chrome se dá conta;
Como atualizar automaticamente
Seja lá qual for o meio que você encontrar de atualização, vai ter que usar no mínimo seu email cadastrado na Cloudflare e sua chave de API, que você pode obter seguindo os caminhos depois de fazer login na sua conta Cloudflare:
Overview – > Get Your API Key -> Global API Key -> View API key
ou
Clique no seu email no canto superior direito -> Settings -> Global API Key -> View API key
Como eu disse lá no início infelizmente dispositivos de rede como roteadores e modems não tem suporte a Cloudflare, o que é um tanto bizarro considerando que há muitos anos o serviço existe e os habituais serviços DDNS estão ficando menos acessíveis a cada ano que passa. Se você tiver algum box Linux na sua rede existem opções de script para fazer isso (não testei nenhuma) mas se você depender de um servidor Windows a melhor opção que conheço é o CloudFlare DDNS Updater, cujo uso não é nada intuitivo.
Execute CloudflareDDNS.exe
Clique em Tools -> Settings
Em “Domain Name” tenho o cuidado de colocar o nome de domínio sem incluir host, como mostrado acima. Em “Auto Fetch Time” a periodicidade da atualização em minutos. O resto é auto explicativo. Clique em Apply.
Em seguida, e essa é a parte não intuitiva que cria problemas, você precisa clicar em Tools -> Fetch Records e selecionar os hosts que você quer que sejam atualizados com seu IP externo.
Em seguida clique em Tools -> Update Records. Está configurado.
Erro “Zone does not exist”: Você provavelmente grafou o “domain” errado lá em tools -> settings.
Para instalar o programa como um serviço e assim não ser necessário que haja um usuário logado para ele ser executado, abra um prompt de comando elevado o diretório dele e execute
|
CloudFlareDDNS.exe /install |
Veja também:
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 30 de novembro de 2015, ddns Graças à modificação feita por Ethanpil no script cPanel original (parte 2 deste texto), os métodos que vou explicar a seguir são compatíveis com a atualização de serviços como dyndns e no-ip. Ou seja: você pode usá-los também, com pequenas modificações, para atualizar seu IP dinâmico oferecido por esses serviços.
É interessante consultar também: DNS Dinâmico: Como ter no seu site a funcionalidade de whatismyip, check.dyndns ou icanhazip
Windows – arquivo batch híbrido com javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
@if (@This==@IsBatch) @then @echo off rem **** zona batch ********************************************************* rem Elaborado por Jefferson Ryan - https://ryan.com.br/blogs/quicktalk/?p=4107 rem baseado parcialmente em: http://stackoverflow.com/a/20787029 setlocal enableextensions disabledelayedexpansion rem aqui o comando ping é usado como uma forma de consulta DNS for /f "tokens=2 delims=[]" %%a in ('ping -n 1 teste.exemplo.com.br') do set "ipaddress=%%a" rem este mesmo script vai ser chamado de novo, com %ipaddress% como parâmetro para a zona Javascript. rem Se o script for chamado por wscript, os comandos .Echo abrirão janelas popup. rem Melhor usar cscript na nossa aplicação cscript //E:JScript "%~dpnx0" %ipaddress% rem remova esta pausa quando tiver terminado de testar o script pause rem End of batch area. Ensure batch ends execution before reaching rem javascript zone exit /b @end // **** zona Javascript ***************************************************** var $usuario = "usuario"; //mesmo usuário configurado no script cPanel var $senha = "senha"; //mesma senha configurada no script cPanel var $ServicoIPexterno = "http://icanhazip.com/"; var $EnderecoScriptAlvo = "http://exemplo.com.br/dyndns.php"; var $hostname = "teste"; //ao mudar isto aqui, lembre de mudar também o comando "for" na zona batch. //O mecanismo javascript do Windows não tem suporte para a função .trim() //por isso é preciso implementar uma //http://stackoverflow.com/a/2308157 if(typeof String.prototype.trim !== 'function') { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); } } // Aqui entra o parâmetro passado pela zona batch var $DNSip = WScript.Arguments.Item(0); WScript.Echo($DNSip); var http = WScript.CreateObject('Msxml2.XMLHTTP.6.0'); http.Open("GET", $ServicoIPexterno, false); http.Send(); //Este script requer que a única resposta da consulta de IP seja o número IP //Nenhuma tentativa é feita para achar o IP na resposta var $ip =http.ResponseText; WScript.Echo($ip); $DNSip = $DNSip.trim(); $ip = $ip.trim(); if ($DNSip == $ip){ WScript.Echo("Os endereços são iguais. Nada a fazer."); }else { //executa o outro script em $EnderecoScriptAlvo, usando $hostname e $ip como parâmetros http.open("GET", $EnderecoScriptAlvo+"?hostname="+$hostname+"&myip="+$ip, false, $usuario, $senha); http.send(); //Exibe a resposta do outro script. Útil para debug. WScript.Echo(http.responseText); } WScript.Quit(0); |
Uso
Edite as variáveis na zona javascript
|
var $usuario = "usuario"; var $senha = "senha"; var $ServicoIPexterno = "http://icanhazip.com/"; var $EnderecoScriptAlvo = "http://exemplo.com.br/dyndns.php"; var $hostname = "teste"; //ao mudar isto aqui, lembre de mudar também o comando for na zona batch. |
E faça uma edição correspondente na zona batch
|
for /f "tokens=2 delims=[]" %%a in ('ping -n 1 teste.exemplo.com.br') do set "ipaddress=%%a" |
Salve o script com a extensão .cmd em uma máquina Windows qualquer que esteja na mesma rede cujo IP externo você quer atribuir ao host. Crie uma tarefa agendada que o execute a cada x minutos. Se não for detectada nenhuma mudança no IP, o script que se conecta ao cPanel nem será chamado.
Testado apenas no Windows 8.1 x64. Não requer permissão de administrador para rodar.
Esse script não tem nenhuma checagem contra problemas de conectividade.
Windows – Powershell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
# ============= variáveis a editar $usuario = "usuario" $senha = "senha" $hostname = "teste" $dominio = "exemplo.com.br" $ServicoIPexterno = "http://icanhazip.com/" $EnderecoScriptAlvo = "http://exemplo.com.br/dyndns.php" # ============== $webclient = new-object System.Net.WebClient # NetworkCredentials precisa ser preenchida com o usuário e senha de acesso ao script (não as credenciais cPanel) $webclient.Credentials = new-object System.Net.NetworkCredential($usuario, $senha) $IPatual = $webclient.DownloadString($ServicoIPexterno) $UltimoIP = [System.Net.Dns]::GetHostAddresses("$hostname.$dominio.")[0].ToString() $IPatual = $IPatual.Trim() $UltimoIP = $UltimoIP.Trim() Write-Output "IP externo atual: $IPatual" Write-Output "DNS Lookup : $UltimoIP" if ($UltimoIP.CompareTo($IPatual) -eq 0) { Write-Output "Nao e´ necessario atualizar." } else { Write-Output "Rodando agora o script de atualizacao $URLfinal..." $URLfinal =$EnderecoScriptAlvo+"?hostname="+$hostname+"&myip="+$IPatual Write-Output $webclient.DownloadString($URLfinal) } |
Uso
- Edite as variáveis no início do script
- Salve como, por exemplo, ddns_updater.ps1
- Use um batch como o seguinte para executá-lo, adaptando o caminho para o arquivo de acordo com sua situação:
|
powershell -executionpolicy bypass -File E:\_PS_Scripts\ddns_updater.ps1 rem remova a pausa quando tiver terminado de debugar o script pause |
- Crie uma tarefa agendada que execute esse batch a cada x minutos. Se não for detectada nenhuma mudança no IP, o script que se conecta ao cPanel nem será chamado.
Testado apenas no Windows 8.1 x64. Não requer permissão de administrador para rodar.
Esse script não tem nenhuma checagem contra problemas de conectividade.
O arquivo batch intermediário é necessário porque, como o Windows é alvo de abusos e o Powershell é poderoso, a MS decidiu bloquear a execução de scripts Powershell por default. Aparentemente é possível agendar uma tarefa para rodar o script diretamente, mas ainda preciso confirmar isso.
Outro dia eu expandirei este texto com exemplos de:
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 29 de novembro de 2015, ddns Eu coloquei “whatismyip” no título mais para fins de compreensão imediata da finalidade. Eu não pretendo duplicar a funcionalidade desse serviço específico porque ela cresceu além das necessidades do DNS dinâmico. O script a seguir duplica exatamente a funcionalidade e resposta de icanhazip.com e pode facilmente duplicar a resposta de check.dyndns.com com o mero acréscimo de algumas palavras.
A finalidade é não depender de terceiros. Se você tem um site, por que não usá-lo? Com o bônus de não ter nenhuma surpresa futura com o dono do domínio avacalhando tudo (direito dele) e obrigando você a mudar seus scripts, como aconteceu com whatismyip.com.
O script é decepcionante simples:
|
<?php header("Content-type: text/plain"); echo $_SERVER['REMOTE_ADDR']; ?> |
Basta salvar isso como, por exemplo, “meuip.php” no seu site e rodá-lo de qualquer lugar. O resultado é idêntico ao de icanhazip.com.
Há quem acredite que o conteúdo da variável REMOTE_ADDR pode ser falsificado pelo usuário e induzir uma vulnerabilidade no script, e que por isso você deveria ao menos checar se o valor recebido é mesmo um valor IP, como neste exemplo:
|
<?php //fonte: https://www.webmasterworld.com/php/3598882.htm if(isset($_SERVER['REMOTE_ADDR']) && (strlen($_SERVER['REMOTE_ADDR']) > 0) && (ereg('[^0-9\.]', $_SERVER['REMOTE_ADDR']) === false)) { // This variation should be bulletproof, but ereg has already rejected input // containing anything except numerals and periods, so it's also unnecessary. // echo htmlentities(strip_tags($_SERVER['REMOTE_ADDR']), ENT_QUOTES); // Thus, this should do. echo $_SERVER['REMOTE_ADDR']; } else echo 'Unknown'; ?> |
Mas segundo o que é explicado aqui e pelo usuário Achernar aqui, essa preocupação não se justifica, porque REMOTE_ADDR é preenchida pelo servidor www (apache, por exemplo) com o valor na camada de rede, que só pode ser um IP mesmo. Ao contrário de outras variáveis como aquela que identifica o seu browser (HTTP_USER_AGENT) e que podem ter na realidade qualquer texto que o usuário remoto queira.
Então você pode usar o primeiro script sem medo.
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 29 de novembro de 2015, ddns Este texto é auxiliar da série de textos sobre DNS dinâmico.
O seu modem é sempre o primeiro a saber qual o seu IP externo e seria perfeito se existisse um mecanismo padronizado para que ele avisasse quando obtivesse um IP. Infelizmente esse mecanismo não existe e o meio mais “simples” de saber qual o seu IP externo acaba sendo, contra-intuitivamente, perguntar a terceiros!
Você pode nem saber o que é um IP externo mas cada site que você acessa sabe qual é o seu, porque essa informação é indispensável e faz parte do protocolo de conexão. Sendo assim, como a maioria dos meus leitores deve saber, há muito tempo sites vem oferecendo uma gambiarra para contornar essa deficiência dos protocolos de conexão à internet: basta abrir a página deles que eles respondem com o seu endereço IP. Entre eles estão:
- http://whatismyip.com/ – Eu suponho que seja o mais conhecido de todos, mas as constantes mudanças no código fonte dificultam seu uso em projetos de automação e o constante entulhamento da interface dificulta até perguntar a alguém pelo telefone que número está aparecendo;
- http://www.ipchicken.com/ – Faz DNS reverso automático, mostrando a você o nome DNS da sua conexão. Útil quando você quer saber se a linha é GVT ou Velox ou se é IP fixo ou dinâmico.
- http://icanhazip.com/ – Serviço oferecido por Major Hayden. Embora esteja entre os mais feios, é o mais prático. A resposta é unicamente o endereço IP em texto puro, sem formatação. Perfeito para uso em automação. Neste outro texto explico como ter a mesma funcionalidade no seu site;
- http://checkip.dyndns.com/
Mas o que danado é IP externo?
Como este texto foi criado primariamente para dar suporte aos meus textos sobre DNS dinâmico eu imagino que a maioria dos leitores não precise ser lembrado do que é isso. Porém muita gente pode cair aqui via Google, então aí vai uma explicação sucinta, que eu posso ou não expandir depois (não tenho tempo agora):
Uma das primeiras coisas a confundir os novatos é que cada dispositivo conectado à internet através de um roteador (que pode ser o modem) tem dois endereços IP:
- O interno, que só vale dentro de sua própria rede e é você quem determina. Se você estiver de qualquer forma conectado a uma rede, você tem um endereço IP interno, mesmo que seja “inventado” pelo SO (endereços de auto configuração);
- O externo, que é o IP atribuído pelo provedor de acesso à sua conexão e na maioria das conexões ADSL muda toda vez que você desconecta e reconecta. Esse endereço somente existe quando você está conectado à internet E geralmente só é importante se você deseja que alguém inicie uma conexão com você a partir da internet.
Como explicado acima, o IP externo não é uma informação “óbvia”, depende de você estar conectado ou não à internet e geralmente muda com freqüência. Não é algo que possa simplesmente ser memorizado. Se alguém pergunta a você “qual o seu IP externo?” geralmente está esperando que você verifique ou tenha verificado isso recentemente pelos meios indicados acima ou similares.
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 28 de novembro de 2015, ddns Na parte 1 deste texto eu expliquei como criar um “A RECORD” no seu domínio usando o cPanel que aponta para um IP qualquer na internet, imitando o funcionamento de um serviço de DNS dinâmico como o no-ip ou dyndns. Nesta segunda parte eu começo a explicar como automatizar a atualização desse registro. A automação do processo é dividida em duas partes para facilitar a implementação em dispositivos mais simples, como roteadores. E também facilita a implementação e o diagnóstico.
AVISO: O script que apresentarei a seguir tem problemas de segurança que você deve conhecer. Preste atenção a tudo o que é explicado antes de usá-lo.
Origem
A automação do processo de atualização da zona DNS no cPanel foi elaborada por Mitchel Haan e publicada em seu site [link morto] em abril de 2013. O site de Mitchel foi apagado em algum momento entre 5 e 23 de fevereiro de 2015 mas por sorte ainda existe uma cópia na Wayback Machine. De qualquer forma a versão que apresento a seguir é uma adaptação feita por Ethanpil.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
|
<?php // Based on the hard work of Mitchel Haan // https://haanenterprises.com/2013/04/host-your-own-dynamic-dns-using-php-and-cpanel-apis/ // // usage: // http://username:password@website.com/dyndns.php?hostname=remote&myip=192.168.1.1 // // per the settings below, the above will update the IP remote.example.com to 192.168.1.1 // myip is not required, will default to the remote IP calling the script // // most dyndns clients will work with a custom url setting. you will likely need to only // provide the subdomain and not the full address. // (ie: with this script, hostname=remote instead of hostname=remote.example.com // // primeiro você precisa criar o hostname (A NAME record) no servidor. Use o // "Simple DNS Zone Editor" do cPanel para isso e/ou checar se o hostname existe. // // Erro "no hosts found" ao evocar o script significa que tal hostname não foi achado. // Se o script estiver rodando em algum lugar da internet, teste com: // http://nome_de_usuario:senha@exemplo.com.br/atualiza.php?hostname=teste // // // Resposta do script se tudo OK: // // teste // Update successful: teste.ryan.com.br. (187.78.217.99) // // Total cPanel API call time: 2.256665 seconds // // /***** Variables *****/ #The username and password used by the updater to send the request. #HTTP Basic authentication $php_auth_user='nome_de_usuario'; $php_auth_pw='senha'; #The url of the cpanel server $dyndnsCpanel = 'https://exemplo.com.br:2083'; #username and password used to login to cpanel $dyndnsCpanelUser = 'usuario_cpanel'; $dyndnsCpanelPass = 'senha_cpanel'; #the main domain name of the account on cpanel $dyndnsDomain = 'exemplo.com.br'; #the base domain of which the subdomain has a dynamic ip $dyndnsRemoteHostDomain = '.exemplo.com.br.'; // Plain text output header('Content-type: text/plain'); if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="CPanel DynDyns"'); header('HTTP/1.0 401 Unauthorized'); die('Authentication Required.'); } if(!($_SERVER['PHP_AUTH_USER']==$php_auth_user && $_SERVER['PHP_AUTH_PW']==$php_auth_pw)) { sleep(10); die('Invalid Credentials'); } // Make sure a host was specified if (empty($_GET['hostname'])) die('Must specify host'); define('DYNDNS_ALLHOSTS', ""); // Validate IP address if (!filter_var($ip, FILTER_VALIDATE_IP)) die('Invalid IP address'); // Get and validate ttl $ttl = $_GET['ttl']; if (!is_numeric($ttl) || $ttl < 60) $ttl = 300; // Create class object $dyn = new DynDnsUpdater(); // Connection information $dyn->setCpanelHost($dyndnsCpanel); $dyn->setDomain($dyndnsDomain); $dyn->setHostDomain($dyndnsRemoteHostDomain); // Set username $dyn->setCpanelUsername($dyndnsCpanelUser); // Set password $dyn->setCpanelPassword($dyndnsCpanelPass); $dyn->updateHost($_GET['hostname'], $ip); if ($dyn->apiCallTime > 0.0) { echo "\nTotal cPanel API call time: {$dyn->apiCallTime} seconds\n"; } // End of processing exit; /**********************************/ /*** Function definitions below ***/ /**********************************/ class DynDnsUpdater { public $apiCallTime; private $curl; private $cpanelHost; private $cpanelUsername; private $cpanelPassword; private $domain; private $hostDomain; /***** Constructor / Destructor *****/ function __construct() { // Create curl object $this->curl = curl_init(); $curlDefaults = array( CURLOPT_SSL_VERIFYPEER => false, // Allow self-signed certs CURLOPT_SSL_VERIFYHOST => false, // Allow certs that do not match the hostname CURLOPT_RETURNTRANSFER => true, // Return contents ); curl_setopt_array($this->curl, $curlDefaults); $this->apiCallTime = 0.0; } function __destruct() { // Release curl object curl_close($this->curl); } /***** Setters *****/ function setCpanelHost($host) { $this->cpanelHost = $host; } function setCpanelUsername($username) { $this->cpanelUsername = $username; } function setCpanelPassword($password) { $this->cpanelPassword = $password; } function setDomain($domain) { $this->domain = $domain; } function setHostDomain($domain) { $this->hostDomain = $domain; } /***** Public Functions *****/ public function updateHost($host, $ip) { $hosts = $this->getHost($host); if ($hosts === false) return false; foreach ($hosts as $hostInfo) { if ($hostInfo['address'] == $ip) { echo "No update required: {$hostInfo['name']} ($ip)\n"; return true; } $updateParams = array( 'cpanel_jsonapi_module' => 'ZoneEdit', 'cpanel_jsonapi_func' => 'edit_zone_record', 'domain' => $this->domain, 'Line' => $hostInfo['Line'], 'type' => $hostInfo['type'], 'address' => $ip ); $result = $this->cpanelRequest($updateParams); if ($result) echo "Update successful: {$hostInfo['name']} ($ip)\n"; else echo "Update failed: {$hostInfo['name']}\n"; } } /***** Private Functions *****/ private function getHost($host) { echo $host."\n"; $fetchzoneParams = array( 'cpanel_jsonapi_module' => 'ZoneEdit', 'cpanel_jsonapi_func' => 'fetchzone_records', 'domain' => $this->domain, 'customonly' => 1 ); $result = $this->cpanelRequest($fetchzoneParams); if (empty($result['data'])) return false; // Get the payload $zoneFile = $result['data']; $hosts = array(); foreach ($zoneFile as $line) { /***** echo $line['name']."\n"; *****/ if ( ($line['type'] == 'A') && ($host == DYNDNS_ALLHOSTS || (strcasecmp($line['name'], $host.$this->hostDomain) === 0)) ) { $hosts[] = $line; } } if (!empty($hosts)) return $hosts; else echo "No hosts found\n"; return false; } private function cpanelRequest($params) { if (empty($this->curl) || empty($params)) return false; curl_setopt($this->curl, CURLOPT_URL, $this->cpanelHost.'/json-api/cpanel?'.http_build_query($params)); curl_setopt($this->curl, CURLOPT_HTTPHEADER, array( 'Authorization: Basic ' . base64_encode($this->cpanelUsername.':'.$this->cpanelPassword)) ); $result = curl_exec($this->curl); $this->apiCallTime += curl_getinfo($this->curl, CURLINFO_TOTAL_TIME); $error = false; // Check for valid result if ($result === false) { echo curl_error($this->curl)."\n"; // If curl didn't return anything, there's nothing else to check return false; } // Check for error code if (curl_getinfo($this->curl, CURLINFO_HTTP_CODE) != '200') { $err = curl_getinfo($this->curl, CURLINFO_HTTP_CODE); echo "Error $err\n"; $error = true; } // Attempt to process result $jsonResult = json_decode($result, true); if (empty($jsonResult)) { echo "Invalid JSON: \n".$result."\n"; return false; } // Check for cpanelresult object if (isset($jsonResult['cpanelresult'])) { $jsonResult = $jsonResult['cpanelresult']; } else { $error = true; } // Check for cpanel error if (isset($jsonResult['error'])) { echo $jsonResult['error']."\n"; $error = true; } if ($error) { // No sense going past here... no more information to get return false; } return $jsonResult; } } ?> |
Uso
A primeira coisa a fazer é preencher toda a seção de variáveis. As duas primeiras podem ser o que você quiser porque servem apenas para identificar você ao executar o script, evitando que terceiros possam remotamente executar o seu script indicando um IP sob controle deles.
|
#The username and password used by the updater to send the request. #HTTP Basic authentication $php_auth_user='nome_de_usuario'; $php_auth_pw='senha'; |
As outras variáveis são relacionadas ao seu domínio e sua conta cPanel:
|
#The url of the cpanel server $dyndnsCpanel = 'https://exemplo.com.br:2083'; #username and password used to login to cpanel $dyndnsCpanelUser = 'usuario_cpanel'; $dyndnsCpanelPass = 'senha_cpanel'; #the main domain name of the account on cpanel $dyndnsDomain = 'exemplo.com.br'; #the base domain of which the subdomain has a dynamic ip $dyndnsRemoteHostDomain = '.exemplo.com.br.'; |
Note o “.” inicial na última variável. Não é erro de digitação. Sem ele o script não funciona.
Parâmetros do script
- hostname – indispensável. É o nome do host cujo IP você quer atualizar;
- myip – Endereço IP que você quer atribuir ao host indicado por hostname. Se você omitir, o script usará o IP que consta no cabeçalho da conexão http (o IP de quem executou o script).
Parâmetros são separados pelo caractere “&”. Cada valor é separado do respectivo parâmetro pelo caractere “=”. Estas são convenções universais e não do script.
Salve o script no servidor www. Digamos que tenha sido na raiz do domínio exemplo.com.br e o nome do arquivo seja atualiza.php.
Rode o script colocando em qualquer browser, exceto Internet Explorer:
http://nome_de_usuario:senha@exemplo.com.br/atualiza.php?hostname=teste&myip=189.70.37.12
Isso atualizará o host teste.exemplo.com.br para apontar para o IP 189.70.37.12
Se tudo estiver OK a resposta do script, no browser, será algo assim:
|
teste Update successful: teste.exemplo.com.br. (187.70.37.12) |
Na terceira parte desta série de textos eu vou abordar as maneiras de você enviar esse comando para o script automaticamente. Mas é importante que o que expliquei até aqui já esteja funcionando corretamente. Se não está, não adianta procurar a solução na Parte 3.
Para quem nunca viu um URL como o acima:
A sintaxe http://usuario:senha@dominio é uma forma muito antiga e conveniente de passar credenciais de autenticação HTTP básica no URL, permitindo até mesmo gravar a autenticação nos favoritos. O IE deixou de suportar isso a partir da versão 7 porque começou a ser usado para fins maliciosos
Problemas de segurança
1 – Isso não é jeito de tratar credenciais cPanel
O script foi criado com a intenção de rodar no mesmo servidor onde roda o domínio a atualizar. Entretanto isso é preocupante porque como você pode ver, as credenciais cPanel são escancaradas no script:
|
#username and password used to login to cpanel $dyndnsCpanelUser = 'usuario_cpanel'; $dyndnsCpanelPass = 'senha_cpanel'; |
Qualquer invasor que tenha acesso meramente de leitura ao seu diretório www (e existem infindáveis meios de se conseguir isso) poderá eventualmente esbarrar nesse script e aí… “perdeu playboy”. Com as credenciais cPanel o invasor tem o controle de toda a conta, com todos os seus domínios, www, email, bancos de dados… No meu caso isso seria uma catástrofe.
Uma forma de minimizar esse problema é rodar esse script fora do domínio que ele atualiza. Por exemplo, se você já tem um servidor local rodando 24h, que não oferece nenhum serviço para a internet (menos vulnerável), você pode rodar o script nele. Uma “gambiarra” para conseguir isso em uma máquina Windows sem precisar fazer qualquer modificação no script é instalar o XAMPP.
Eu simulei isso no meu desktop e funcionou. Mas tenha o cuidado de manter o uso de https na variável $dyndnsCpanel. Dessa forma será bem mais difícil capturar as suas credenciais do cPanel interceptando a conexão entre seu servidor local e o seu domínio:
|
#The url of the cpanel server $dyndnsCpanel = 'https://exemplo.com.br:2083'; |
Se você usar http (nem estou certo de que o cPanel permita) as credenciais cPanel poderão ser interceptadas.
Outra forma de tentar minimizar o problema é obfuscar o código PHP. Obfuscação não vai impedir um invasor determinado a descobrir do que se trata, mas dificulta bastante. Se você der um nome ao script que não denuncie seu propósito e obfuscar o suficiente o conteúdo, aumenta muito as chances de que o invasor ache que não vale a pena perder tempo com isso. Deixando escancarado qualquer script kiddie vai ter um orgasmo. Como fazer essa obfuscação precisará ser tema para outro texto.
2 – A conexão com o script pode ser interceptada
Estando o script em uma máquina remota, as credenciais de acesso ao mesmo podem ser interceptadas com relativa facilidade, porque são transmitidas claramente no URL:
http://nome_de_usuario:senha@exemplo.com.br/atualiza.php?hostname=teste&myip=189.70.37.12
Isso não é problema se no lugar de HTTP o seu domínio usa HTTPS, porque nesse caso até o URL é criptografado.
Mas se você não usa HTTPS qualquer pessoa observando o seu tráfego, como o operador do seu provedor de acesso via rádio, poderá assumir o controle de para onde aponta esse hostname. Dependendo do quanto ele seja esperto ele pode conseguir induzir você a fornecer senhas de acesso extras simulando em máquina controlada por ele o dispositivo que você quer acessar, entre outras coisas. Se você rodar o script fora do seu domínio como explicado no item anterior pode minimizar esse problema também.
Nota: na primeira revisão deste texto eu afirmei que os serviços de DDNS gratuitos como o no-ip e dyndns também são vulneráveis a interceptação. Isso está parcialmente correto. O no-ip, por exemplo, suporta http e https, mas o simples fato de suportar os dois já é motivo para preocupação porque só Deus sabe que protocolo está usando o danado do roteador, modem ou dvr onde nós colocamos nossas credenciais. Somente interceptando nós mesmos a atualização para termos certeza.
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 27 de novembro de 2015, ddns O processo que explico aqui, é inteiramente manual e pouco prático, mas funciona.
Entre no cPanel
Em Domains, escolha Advanced DNS Zone Editor
Digamos que você queira adicionar o host “teste” no domínio “ryan.com.br”:
- Selecione o domínio. Muitas vezes você tem apenas um mesmo, mas uma conta cPanel pode administrar ilimitados domínios;
- Escreva o nome do host. Ao dar ENTER o cPanel preenche o resto;
- Preencha o TTL desejado. Recomendo que leia este outro post se estiver incerto quanto ao valor;
- O tipo de registro que você deve criar para DDNS é “A” (A RECORD);
- Coloque o IP atual do seu dispositivo. Geralmente esse é o IP externo da conexão de banda larga onde o dispositivo está instalado. Se for na conexão onde você está, você pode obter o IP visitando sites como WhatisMyIP.com;
- Clique em Add Record.
Imediatamente após adicionar você já pode testar. Um ping para teste.ryan.com.br deve retornar o IP que você colocou em Address.
Este processo não é prático porque toda vez que o IP mudar você tem que manualmente atualizar o Address no cPanel. Na segunda parte deste texto eu explico como automatizar isso.
(Prefira clicar em "Responder" se estiver comentando um comentário)
Jefferson, 26 de novembro de 2015, ddns Este texto foi escrito para dar suporte a outros textos que postarei mais tarde. Eu não estou ainda satisfeito com a minha explicação por isso o texto pode mudar bastante, mas a teoria que tento explicar até onde sei está correta.
Primeiro, vamos fazer uma breve resumo do que constitui um “domínio”…
- Embora a maioria das pessoas veja um domínio como um servidor, na realidade cada domínio pode ser constituído por um número ilimitado de máquinas ou dispositivos. Cada uma dessas máquinas/dispositivos é chamada de “host” e cada host tem seu endereço IP. Normalmente esses hosts fazem parte da mesma rede particular, mas você também pode fazer com que eles apontem para um dispositivo do outro lado do mundo.
…E do que é DNS e como funciona:
- A internet é uma rede baseada em IP e só entende números IP mesmo. O fato de você poder escrever “ryan.com.br” em seu browser e chegar ao meu site é resultado de uma série de “artifícios” para poder representar números IP por nomes e o serviço que se encarrega de fazer essa tradução é o DNS;
- Como não faz sentido perder tempo perguntando repetidas vezes algo que você já sabe, mantemos uma memória (no jargão, “cache”) de que IP corresponde a que nome;
- Mas como essa relação entre nome e IP pode mudar de uma hora para outra, essa memória precisa ter uma duração finita. Aí entra o TTL.
TTL, do inglês Time To Live (tempo de vida) é o parâmetro que determina a “validade” da resposta do servidor DNS e é parte integrante de todo registro DNS. Se o dispositivo recebe uma resposta do servidor DNS dizendo que o TTL é de x segundos, ele só vai consultar o servidor DNS novamente para aquele host se alguém acessá-lo novamente depois de passados x segundos. Esse parâmetro é praticamente irrelevante no dia a dia, mas você precisa estar atento a ele quando usa qualquer serviço de DDNS.
Serviços de DNS dinâmico como o no-ip costumam ter um TTL de 60 segundos. O valor padrão em um serviço de hospedagem como o Hostgator costuma ser 14400 (4 horas). Não é recomendado baixar para menos que 300 (5 minutos) porque o seu provedor pode não gostar do stress desnecessário no servidor DNS dele. E francamente ele tem razão.
Tenha em mente que entre você e o host que você quer acessar existem diversos servidores DNS ou “caches” secundários, inclusive em cada um dos seus roteadores. Quando você configura manualmente no seu PC ou dispositivo um servidor DNS você passa por cima de vários, mas no mínimo você deve contar com o cache no seu dispositivo, o do servidor DNS que você configurou e qualquer um depois dele.
Para um número “n” de caches TTL DNS no caminho, o tempo de propagação “x” é
TTL >= x <= n * TTL
Então, por exemplo, se existirem 3 caches e o TTL for de 4h, o tempo de propagação (o tempo que leva para o dispositivo que fez a consulta receber uma resposta atualizada) será qualquer coisa entre 4h e 12h.
Se por acaso você fizer seu primeiro teste de DDNS com TTL de 14400 e mudar o IP, mesmo que você baixe o TTL para 300 pode ter que esperar 4 horas ou mais até poder “ver” essa mudança ter efeito.
Confuso? Vamos tentar com um exemplo simples:
Servidor DNS configurado na sua máquina: Google (8.8.8.8)
host que você quer acessar: teste.ryan.com.br, que acaba de ser criado e foi configurado com TTL 14400 (default)
Na primeiríssima vez que você acessar teste.ryan.com.br, o Windows não sabe qual é o IP, mesmo que ele saiba o IP default de “ryan.com.br”, porque se trata de outro “host” e vai perguntar ao servidos DNS configurado (o da Google). O servidor da Google também não faz idéia de quem seja (o hostname acaba de ser criado), por isso vai consultar o servidor DNS que tem autoridade sobre o domínio ryan.com.br. A resposta dirá que o TTL é de 14400, assim o servidor da Google só vai perguntar quem é teste.ryan.com.br novamente em 4 horas. Ele repassa a informação para o Windows, que também vai ver esse TTL de 14400 e só vai perguntar novamente ao servidor da Google em 4 horas. Você pode esvaziar o cache DNS do Windows, forçando-o a perguntar mais cedo, mas o servidor da Google ainda acha que o TTL é de 4 horas e não adianta reduzir o TTL de teste.ryan.com.br para 300 nesse meio tempo, porque o servidor da Google só vai tomar conhecimento da redução do TTL quando o prazo expirar e ele fizer uma nova consulta a pedido de alguém.
Escolher qualquer outro servidor DNS nesse meio tempo, como o do OpenDNS (208.67.222.222 ou 208.67.220.220) ou um serviço de ping remoto (vai depender de que servidor DNS esse serviço usa) pode acelerar o processo de teste.
(Prefira clicar em "Responder" se estiver comentando um comentário)
|
|
Eu já conhecia o dnsomatic.com mas ainda assim preferia usar minha solução, mas eu tenho tantos DDNS e vivia tendo que atualizar meu script de autenticação por conta de atualizações nas APIs que desisti e agora meu script atualiza somente no DNSOmatic que se encarrega de atualizar em todo o restante, a gama de servidores suportados é imensa.
Ontem, enquanto escrevia este texto, eu dei uma olhada no dns-o-matic mas achei complicado demais para quem quer apenas atualizar uma meia dúzia de endereços no mesmo serviço (Cloudflare). O fato de eu ter que criar uma conta com eles, mesmo sendo gratuita, já me incomodou. Não quero depender de mais serviços. Meu setup já é confuso o bastante com hospedagem na Hostgator e DNS na Cloudflare.