Tunelando com OpenSSH

Ricardo Iramar dos Santos - Agent Smith
26/09/2004 - Versão 0.1



1. Introdução

Apesar de a palavra "Tunelando" não existir no português (túnel não é um verbo), tecnicamente faz muito sentido empregar tal palavra na utilização do OpenSSH descrita nesta documentação.

O OpenSSH cria um "túnel virtual" através de um Firewall inserindo um cabeçalho com direitos de acesso (protocolo, porta e endereço) no lado do cliente e fazendo o processo inverso no lado do servidor. Além disso todos os dados que irão trafegar nesse túnel seram encriptados tornando assim a conexão muito segura.

As possibilidades de aplicações são infinitas, nesta documentação veremos uma aplicação que servirá como base para todas as demais.

Nesta documentação o ambiente consiste em duas máquinas (Smith e Trinity) com Slackware 10.0 fechando um túnel entre si. Em Smith usarei o usuário ricardo e em Trinity o usuário agent. Nas duas máquinas possuo o OpenSSH instalados como cliente e servidor.

Smith está atrás de um Firewall fazendo NAT onde tem permissões para sair pela porta 22 e 80. Já a Trinity é uma máquina com um IP válido dinâmico (Speedy).

  	                ________
  	 -------       |        |               /°°°°°°°°\               ---------
  	| Smith | --- [ Firewall ] ---/ ~ /--- ( Internet ) ---/ ~ /--- | Trinity |
  	 -------       |________|               \......../               ---------

Smith irá acessar Trinity através de um "túnel virtual" utilizando o VNC e vice-versa. Portanto irei instalar o VNC (servidor e cliente) nas duas máquinas. O VNC utiliza a porta 590x (por padrão 5900 no Windows e 5901 no Linux) e o protocolo RFB, mais informações podem ser obtidas na área documentações no site do VNC. Perceba que o Firewall não permite esse tipo de acesso nos dois sentidos.

Hey Ho! Let's Go!

2. Pré-requisitos

- OpenSSH (http://www.openssh.com).

- VNC (http://www.realvnc.com).

3. Instalação

Como na grande maioria das distribuições o OpenSSH já vem instalado, o procedimento para sua instalação não será abordado aqui.

A versão atual do VNC é a 4.0. Segue abaixo a instalação super simples dos binários do VNC.

  	ricardo@smith:~/binarios/VNC$ wget http://www.realvnc.com/dist/vnc-4.0-x86_linux.tar.gz
  	(...)
  	ricardo@smith:~/binarios/VNC$ tar jxvf vnc-4.0-x86_linux.tar.gz
  	(...)
  	ricardo@smith:~/binarios/VNC$ cd vnc-4.0-x86_linux
  	ricardo@smith:~/binarios/VNC/vnc-4.0-x86_linux$ su
  	Password authentication bypassed.
  	root@smith:/home/ricardo/binarios/VNC/vnc-4.0-x86_linux# ./vncinstall /usr/local/bin
  	(...)
  	root@smith:/home/ricardo/binarios/VNC/vnc-4.0-x86_linux# exit
  	exit
  	ricardo@smith:~/binarios/VNC/vnc-4.0-x86_linux$

4. Procedimento

Para facilitar o entendimento irei subdividir esse item em dois com base no sentido da comunicação entre Smith e Trinity.

4.1. Smith acesando Trinity

Para este primeiro caso imagine que estou próximo a Smith em meu serviço e Trinity está em casa a 25 Km conectada a internet via Speedy. Relembrando que já possuo o sshd (OpenSSH servidor) rodando nas duas máquinas.

Primeiramente Smith (VNC cliente) irá acessar Trinity (VNC servidor), desta forma precisamos executar o vncserver em Trinity. Como estou longe de Trinity irei fazer isso via ssh (OpenSSH cliente).

Se for a primeira vez que estiver executando o vncserver será necessário definir a senha de acesso que será gravada em ~/.vnc/passwd.

  	ricardo@smith:~$ ssh agent@[IP da Trinity]
  	agent@[IP da Trinity]'s password: [senha do usuário agent em Trinity]
  	(...)
  	agent@trinity:~$ vncserver 
  	
  	New 'trinity:1 (agent)' desktop is trinity:1
  	
  	Starting applications specified in /home/agent/.vnc/xstartup
  	Log file is /home/agent/.vnc/trinity:1.log
  	
  	agent@trinity:~$ exit
  	logout
  	Connection to [IP da Trinity] closed.
  	ricardo@smith:~$

Veja a linha "Starting applications specified in /home/agent/.vnc/xstartup", isso quer dizer que quando você se conectar a está máquina utilizando o vncviewer o vncserver irá executar o X e em seguinta os comandos em ~/.vnc/xstartup. Eu deixo neste arquivo o seguinte conteúdo.

  	#!/bin/sh
  	
  	[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
  	vncconfig -iconic &
  	sh $HOME/.xinitrc

Assim quando me conectar em Trinity via VNC será iniciado o Window Manager padrão para meu usuário, isto é, o mesmo quando executo o startx.

Agora localmente em Smith iremos redirecionar a porta local 1024 para a porta remota 5901 em Trinity utilizando ssh. Você pode utilizar qualquer porta acima de 1023 pois abaixo ou igual só o root terá permissão para fazer isso.

  	ricardo@smith:~$ ssh -f -N -L 1024:localhost:5901 agent@[IP da Trinity]
  	agent@[IP da Trinity]'s password: [senha do usuário agent em Trinity]
  	ricardo@smith:~$

O parâmetro -f serve para deixar o processo rodando em segundo plano não prendendo o prompt. Com o comando acima foi criado o famoso "túnel virtual" redirecionando as portas citadas de uma forma convenientemente.

Agora que a mágica acontece, com o comando abaixo em Smith iremos acessar via VNC a Trinity através do túnel criado acima.

  	ricardo@smith:~$ vncviewer localhost:1024:1 &
  	(...)
  	ricardo@smith:~$

Se o vncviewer perguntar a senha do vncserver configurada acima já pode ficar feliz, caso contrário revise os passos acima. Perceba o & no final da linha para executar o vncviewer em segundo plano liberando o prompt.

Na janela do vncviewer utilize a tecla F8 para configurar-lo em tempo real ou até mesmo sair. Quando tudo estiver terminado finalize o vncserver da seguinte forma.

  	ricardo@smith:~$ ssh agent@[IP da Trinity]
  	agent@[IP da Trinity]'s password: [senha do usuário agent em Trinity]
  	(...)
  	agent@trinity:~$ vncserver -kill :1
  	Killing Xvnc process ID 2563
  	agent@trinity:~$ exit
  	logout
  	Connection to [IP da Trinity] closed.
  	ricardo@smith:~$

Localmente em Smith finalize o processo do OpenSSH responsável pela criação do túnel da seguinte forma.

  	ricardo@smith:~$ ps aux | grep [IP da Trinity]
  	ricardo  10473  0.0  0.6  3208 1604 ?        S    11:41   0:00 ssh -f -N -L 1024:localhost:5901 agent@[IP da Trinity]
  	ricardo@smith:~$ kill -9 10473
  	ricardo@smith:~$
  

A velocidade de atualização da tela no VNC é diretamente proporcional a velocidade do link em Smith e Trinity. Porém essa velocidade será afetada devido a encriptação dos dados trafegados pelo túnel. De qualquer forma isso pode ser solucionado com um link de 2Mbps nas duas pontas :^D .

4.2. Trinity acesando Smith

O procedimento é bem similar ao item anterior, só que agora de uma forma reversa.

O problema está no Firewall que não permite nenhum tipo de acesso a Smith. Mas se Smith abrir e mantiver esse acesso à Trinity, irá fazer com que o Firewall "pense" que na verdade Smith é quem esta acessando Trinity.

Tendo isso em mente minutos antes de eu ir para minha casa, onde se encontra Trinity, irei excutar o vncserver para acesso remoto futuramente de casa e em seguinda abrir um túnel redirecionando a porta local 5901 em Smith para a porta remota 1024 em Trinity da seguinte forma.

  	ricardo@smith:~$ vncserver
  	
  	New 'smith:1 (ricardo)' desktop is smith:1
  	
  	Starting applications specified in /home/ricardo/.vnc/xstartup
  	Log file is /home/ricardo/.vnc/smith:1.log
  	ricardo@smith:~$ ssh -f -N -R 1024:localhost:5901 agent@[IP da Trinity]
  	agent@[IP da Trinity]'s password: [senha do usuário agent em Trinity]
  	ricardo@smith:~$

Perceba que a sintaxe é bem similar a do item anterior, exceto o -L que agora é -R de "reverse".

Deixando Smith ligado no serviço vou para casa e de la executo o seguinte comando.

  	agent@trinity:~$ vncviewer localhost:1024:1
  	agent@trinity:~$

Mais uma vez a mágica acontece, agora é só digitar a senha do vncserver configurada no serviço e partir para brincadeira.

Para finalizar tudo basta matar os processos como explicado no item anterior.

5. Conclusão

A minha conclusão é que os desenvolvedores do OpenSSH são gênios!

Além da aplicação com o VNC você pode utilizar o Tunelamento com OpenSSH para diversas outras aplicações. Como por exemplo fazer uma conexão segura com um servidor POP, desta forma tanto o seu nome de usuário e senha enviados ao servidor POP como seus e-mails serão encriptados e trafegarão com muito mais segurança pela internet.

Outra coisa interessante. que eu mesmo utilizo quase que diariamente. é fazer uma ponte com uma terceira máquina. No meu caso não gosto de deixar minha máquina em casa ligada por muito tempo para não fritar o processador AMD, desta forma eu faço todo o procedimento acima com uma terceira máquina na qual tenhu uma conta shell com acesso ao OpenSSH e quando estou em casa fecho o túnel entre essa terceira máquina e a minha máquina.

Isso irá afetar diretamente a velocidade, mas se você for usar somente o console, assim como eu, não terá problema algum.

6. Referências

- http://www.openssh.com

- http://www.realvnc.com

- http://www.google.com.br


Dúvidas, críticas e sugestões devem ser enviadas para ricardo.iramar@gmail.com.

Quer saber mais um pouco sobre o autor desta documentação? Acesse minha home page em http://ricardo-iramar.com.