Tunelando com OpenSSH Ricardo Iramar dos Santos - Agent Smith %%date(%d/%m/%Y) - Versão 0.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 http://www.openssh.com] 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 http://www.realvnc.com] 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 http://www.realvnc.com/documentation.html] 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 + - OpenSSH (http://www.openssh.com). - VNC (http://www.realvnc.com). + 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$ ``` + Procedimento + Para facilitar o entendimento irei subdividir esse item em dois com base no sentido da comunicação entre Smith e Trinity. ++ 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 . ++ 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. + 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. + 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 ricardo.iramar@gmail.com]. Quer saber mais um pouco sobre o autor desta documentação? Acesse minha home page em [http://ricardo-iramar.com.br http://ricardo-iramar.com.br]. [[img/pwrbytxt2tags.png] http://txt2tags.sourceforge.net]