30 Abril 2009

VNC sob SSH

  • Descrição do problema:
Quere-se ter acesso ao escritório duma computadora com o Windows instalado, mas o cliente desde o qual se quer fazer está numa rede administrativa atrás dum firewall que quebra as conexões. Isto pode ser porque não seja tráfego HTTP ou HTTPS, ou que não se permitam os acesos aos servidores remotos em portos distintos de 80 ou 443. Ademais a solução passa por ser uma alternativa livre.

  • Solução proposta:
Criar um túnel entre o cliente e a computadora remota que se conecte ao porto 443. De tal jeito, que o firewall não poderá discriminar o tráfego pelo porto de conexão nem pelo empacotamento, já que, ao estares encriptado com SSH o firewall não poderá distingui-lo duma conexão HTTPS.

  • Passos para levar a cabo esta solução
  1. Instalar e configurar um servidor SSH na computadora remota (no Windows)
  2. Instalar e configurar um servidor VNC na computadora remota (no Windows)
  3. Criar um túnel com o cliente SSH e emprega-lo para a conexão VNC (desde o cliente).

  • Instalar e configurar um servidor SSH na computadora remota (no Windows)
Pode-se empregar qualquer outro servidor SSH, mas neste caso vamos empregar o openSSH for Windows e as instruções que aqui se dão são específicas alem de que com outros servidores possam ser semelhantes.
Esta escolha está justificada pela limpeza deste servidor que se instala como um serviço e nem se quer é visível na barra inferior do Windows. Tendo como única contra-partida uma configuração mais complexa, ao estilo GNU/Linux, é dizer, mais elegante.

1.- Cria-se uma conta no Windows com contra-sinal, por exemplo, usario_ssh. Precisamos do contra-sinal porque para que um usuário possa fazer uma conexão SSH vamos precisar que se autentique com ele.
2.- Instala-se o openSSH para o Windows.
3.- Abre-se um cmd vai-se à pasta bin da instalação e executa-se:
mkpasswd -local > ..\etc\passwd
mkgroup -local > ..\etc\group
Isto o único que faz, é registar os grupos e usuários do Windows no servidor SSH.
4.- Abre-se o passwd e eliminam-se todas as linhas que não sejam a que se corresponde com o usuário que criamos no ponto um e assim evita-se ter registados usuários que não vão ser empregados para conectar-se pela rede.
5.- Na linha do nosso usuário editamos a linha /home/usuario_ssh põe-se cygdrive/c e guardamos. Porque assim modifica-se o directório de início para c:\ e evita-se que dê um erro por não existir o directório de início.
6.- Edita-se o ficheiro etc\sshd_config e modifica-se a linha onde ponha #Port 22 e substituimo-la por Port 443. Para que o servidor SSH escute nesse porto.
7.- Configura-se o firewall do Windows e engade-se uma excepção para o porto TCP 443.
8.- Configurar o router, se ter, para que o porto 443 esteja aberto e redirigido à computadora ajeitada.
9.- No Control Panel vamos ás Administrative Tools e aí a Services, procura-se por OpenSSH Server e iniciamo-lo para que o servidor carregue as novas configurações.

  • Instalar e configurar um servidor VNC na computadora remota (no Windows)
Ao igual que no caso do servidor SSH, aqui também se poderia ter escolhido qualquer outra opção, mas para o nosso caso vamos trabalhar com o TightVNC.

1.- Instalar o aplicativo TightVNC.
2.- Instala-lo como um serviço do Windows.
3.- Aceder à configuração por defeito, que é a que se carrega para o serviço (ter cuidado de não confundir com a configuração pessoal).
4.- Pôr um contra-sinal para o acesso ao servidor VNC.
5.- Habilitar somente o loopback. Como se vê na seguinte imagem.


  • Criar um túnel com o cliente SSH e emprega-lo para a conexão VNC (desde o cliente).
Neste caso vamos empregar o cliente SSH tradicional das contornas GNU/Linux, que não só se pode empregar no GNU/Linux senão que também no Windows com o Cygwin, o ssh e o cliente VNC que vamos empregar é o VncViewer que se pode descarregar de TightVNC. Ao igual que nos dois casos anteriores existem alternativas como por exemplo Putty, um cliente SSH para contornas Windows.

1.- Abrir um shell e executar o comando:
ssh -p 443 -L 1515:localhost:5900 usuario_ssh@ip_remoto
onde,
ssh é o cliente SSH
-p 443 indica que se quer conectar a um servidor SSH que está a escutar no porto 443.
-L 1515:localhost:5900 indica que se construa o túnel desde o porto 1515 de localhost ao porto 5900 remoto. E dizer, qualquer aplicação que se conecte a localhost no porto 1515 será encriptada e redirigida ao porto 443 do servidor remoto, onde será desencriptado e enviado ao porto 5900.
usuario_ssh@ip_servidor_remoto indica que se há que conectar à ip da computadora remota empregando o login usuario_ssh.
2.- Aguardar a que peça um contra-sinal e introduzir o de usuario_ssh.
3.- Agora podemos executar qualquer comando que habitualmente se posse executar numa sessão do cmd do Windows.
4.- Mas para ter uma conexão VNC, há que abrir outra shell e executar o seguinte comando:
java VncViewer HOST localhost PORT 1515

No caso de que se tenha um proxy para aceder ao exterior (à internet), pois haverá que instalar o Corkscrew. E o único que teremos que fazer é editar o $HOME/.ssh/config engadindo a seguinte linha:
Host * ProxyCommand /usr/local/bin/corkscrew proxy.exemplo porto %h %p

onde /usr/local/bin/corkscrew é o path onde está instalado o corkscrew, proxy.exemplo é o nosso proxy (pode-se pôr a ip ou o nome) e porto é o nosso porto. Depois tudo funciona igual. Isto com o Putty pode-se fazer sem o Corkscrew. Na categoria Proxy dentro de Conexão. Selecionando tipo de proxy HTTP e pondo o nome do proxy e o porto pelo que escuta. Tal e como se vê na imagem.


A seguinte imagem mostra o esquema geral da solução.