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.
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!
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$
Para facilitar o entendimento irei subdividir esse item em dois com base no sentido da comunicação entre Smith e 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 .
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.
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.
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.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários