Estava precisando disponibilizar acesso remoto contínuo a um computador windows via RDP (Terminal Services), mas tinham algumas "pedras" nesse caminho:
- O Link da máquina remota é via rádio, logo tive que pedir à provedora para desviar as portas;
- O rádio da provedora me oferece um IP interno, que é entregue ao meu roteador que distribui a conexão via cabo ou WiFi (com outra classe de Rede);
- O IP muda constantemente, logo tenho que partir para DNS Dinâmico;
- Não posso usar o DNS dinâmico do meu roteador, pois o IP WAN dele é sempre o mesmo (recebido do Rádio);
- A máquina windows está ligada direto, mas das provedoras grátis de DNS dinâmico que testei, nenhuma me oferecia um programa que rodasse no windows para atualizar o DNS;
Munido destes fatos e como sempre, procurando uma forma "tecnologicamente complexa" de resolver problemas, decidi inventar algo diferente:
Primeiro Passo: Atualizar o endereço IP da máquina remota em algum lugar acessível
O objetivo é que a máquina Windows envie o seu IP para algum lugar acessível das duas pontas periodicamente.Com isso, basta eu acessar uma URL para conseguir o IP atualizado da máquina remota. Fiz da seguinte forma:
Criei um script em PHP, com o único objetivo de salvar em um .txt o IP de quem o acessou;
<?php $ip = $_SERVER['REMOTE_ADDR']; $hdl = fopen('ip.txt', 'w'); fwrite($hdl, $ip); fclose($hdl); ?>
Publiquei este script em uma URL que, obviamente, só eu saiba (para evitar que algum engraçadinho acesse-a e prejudique meu acesso);
Na máquina Windows, Instalei o wget pra windows e criei um agendamento (Iniciar -> Painel de Controle -> Tarefas Agendadas) que roda a cada 10 minutos o seguinte batch file (
update.cmd
):@Echo off curl http://minha.url/secreta/ip.php
Segundo passo: Capturar este endereço da máquina de origem e acessar a máquina
Para ter acesso ao endereço IP é fácil, basta acessar a http://minha.url/secreta/ip.txt
e pronto! ip visível! detalhe para a extensão de acesso: txt. Quando acessamos o ip.php
ele atualiza o endereço IP; quando acessamos o ip.txt
temos acesso ao endereço salvo:
Mas ai vem a parte difícil, como explicar pro usuário que ele tem que acessar um endereço, pegar uns números, abrir o Iniciar -> Executar -> mstsc (ou um ícone com o RDP); colar o número e ai sim abrir a sessão remota?!
Mais um script!
Criei um arquivo em VisualBasic Script chamado remoto.vbs
com o seguinte conteúdo:
Dim oXMLHTTP
Dim oStream
Dim oFSO, oShell, strFileName, strComputerName
strFileName = "Rdp.rdp"
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0")
oXMLHTTP.Open "GET", "http://minha.url/secreta/ip.txt", False
oXMLHTTP.Send
If oXMLHTTP.Status = 200 Then
strComputerName = oXMLHTTP.responseText + ":3390"
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oStream = oFSO.CreateTextFile(strFileName, True)
oStream.WriteLine "full address:s:" + strComputerName
oStream.WriteLine "username:s:USUARIO"
oStream.WriteLine "promptcredentialonce:i:1"
oStream.WriteLine "gatewaycredentialssource:i:4"
oStream.WriteLine "prompt for credentials:i:0"
oStream.WriteLine "autoreconnection enabled:i:1"
oStream.WriteLine "authentication level:i:2"
oStream.Close
Set oShell = CreateObject("WScript.Shell")
oShell.Run "mstsc """ + strFileName + """"
End If
O script é bem simples:
- Pega o endereço IP da URL (que você deve corrigir para suas necessidades);
- Concatena com a porta (no meu caso 3390 - o padrão seria 3389);
- Cria o arquivo Rdp.rdp com o endereço, nome de usuário e outros parâmetros que habilitei para permitir salvar a senha do usuário;
- Salva e executa o RDP.
Desta forma, o usuário só tem que executar o script VBS, que se encarrega de busar o IP correto e conectar remotamente a máquina.