De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Tunelando com OpenSSH

Colaboração: Ricardo Iramar dos Santos

Data de Publicação: 01 de Outubro de 2004

Apesar de a palavra "Tunelando" não existir no português (túnel não é um verbo), porém 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 iram 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!

Pré-requisitos

Instalação

Como na grande maioria das distribuições o OpenSSH já vem instalado, a procedimento para sua instalação não será abortado 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$

Procedimento

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

Smith acessando 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 roando 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 .

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 manter 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.

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 seram encriptados e trafegaram com muito mais segurança pela internet.

Outra coisa interessante. que eu mesmo utilizo quase que diariamente. é fazer um 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.

Referências


Dúvidas, críticas e sugestões devem ser enviadas para agent.smith@globo.com.

Quer saber mais um pouco sobre o autor desta documentação? Acesse minha home page em http://www.agentsmith.kit.net.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Ricardo Iramar dos Santos