Um túnel SSH é uma forma segura de acessar serviços críticos, mesmo quando a nossa conexão com a Internet não é confiável. Outra finalidade é acessar um serviço remoto a partir de uma máquina sem permissão, desde que você tenha acesso ao SSH de uma outra máquina com permissão para tal.
Existem três forma de se criar um túnel SSH: Túnel de conexão local, túnel de conexão remota e túnel dinâmico. Neste texto veremos um pouco sobre os túneis de conexão local, ficando os outros dois para outra oportunidade.
Por exemplo eu poderia usar um túnel que me leva da porta 2121, do meu desktop de casa, até a porta 21 do servidor FTP da minha empresa. Desta forma, mesmo sendo o FTP um protocolo inseguro, tudo o que trafegar de/para minha máquina com relação a este serviço será criptografado tornando a conexão segura.
Outro exemplo seria o acesso a sites, sistemas e serviços que estão disponíveis apenas a partir de uma faixa de endereços especifica, tal como a assinatura de periódicos científicos que em geral é feita para ter acesso liberado somente a partir de um único endereço IP; ou mesmo para acessar serviços internos a sua rede empresarial a partir de um computador fora dela.
Neste último caso, por exemplo, eu poderia acessar o servidor Intranet da minha empresa simplesmente atravessando um túnel devidamente preparado para me levar da porta 8880 da minha máquina até a porta 80 do servidor Intranet da minha empresa.
A “mágica” acontece de forma bem simples. Um túnel nada mais é do que uma máquina intermediária rodando o serviço SSH e que será acessada de forma especial para repassar as nossas solicitações para uma outra máquina que não podemos ou queremos acessar diretamente.
Sendo assim se analisarmos o último exemplo teremos que:
- Eu entro pela porta 8880 da minha máquina;
- Dali eu sou conduzido à porta 22 da máquina intermediária (que faz o papel de túnel);
- A máquina intermediária repassa a minha solicitação para a porta 80 do servidor Intranet que por sua vez devolve o resultado da solicitação fazendo o caminho inverso.
Túnel de conexão local
Estes tipos de túnel são assim chamados porque eles abrem uma porta de conexão localmente na estação e que será usada como “entrada do túnel”. Para não enrolar, vou deixar a explicação dos outros tipos para uma nova oportunidade.
Estes tipos de túneis são simples de serem criados e não requerem privilégios administrativos em nenhuma das máquinas envolvidas, podendo inclusive ser usado a partir de uma estação Windows.
Sintaxe de uso no Linux
O comando a seguir deve ser executado na linha de comandos da sua estação Linux, fazendo as devidas substituições dos valores em maiúsculas e seguido de ENTER.
ssh -L PORTALOCAL:SERVIDOR:PORTASERVIÇO LOGINTUNEL@SERVIDORSSH
Obs: Veja o que são estes valores na seção “Requisitos”.
Caso o SERVIDORSSH esteja rodando em outra porta que não a 22, você poderá usar o parâmetro -l (letra L minúscula) seguida do número da porta que o servidor está escutando.
Dica: se você quiser uma ferramenta bacana para gerenciar seus túneis, você pode dar uma olhada na “Gnome SSH Tunnel manager” (gSTM) [1] que está disponível nos repositórios Ubuntu e provavelmente de outras distribuições também. Com ela você pode salvar as configurações, iniciar e parar um túnel sem precisar abrir um terminal de comandos.
Criando túneis a partir do Windows
Para usuários Windows, o utilitário Putty oferece uma interface gráfica relativamente amigável para se criar túneis.
Para tal, use a janela de configuração de novas conexões (aquela primeira tela exibida, quando se chama o utilitário).
Segue um “mapa” com as configurações no Putty. Sempre que o texto se referir à:
- SERVIDORSSH – considere a categoria “Session” e o campo “Host Name”;
- Obs: o campo “Port” em geral vai ficar 22, a não ser que o seu servidor SSH esteja usando uma porta diferente)
- Connection type, sempre como “SSH”
- LOGINTUNEL – considere a categoria “Connection” > “Data” e o campo “Auto-login username”;
- PORTALOCAL – considere a categoria “Connection” > “SSH” > “Tunnels” e o campo “Source port”;
- SERVIDOR:PORTASERVICO – considere a categoria “Connection” > “SSH” > “Tunnels” e o campo “Destination”, onde você deverá digitar o endereço do servidor e a porta de serviço separadas por “:”;
- Como estamos falando de tuneis de conexão local, certifique-se de marcar a opção “Local” em “Connection” > “SSH” > “Tunnels”;
- Após digitar todos os valores você deve clicar no botão “Add”e depois no botão “Open” para abrir a conexão
Dica: Depois de ter este trabalhão todo para configurar o túnel no Putty, se você conectar imediatamente, quando encerrar a sessão suas configurações serão perdidas e da próxima vez você deverá digitá-la toda novamente. Para evitar isso, na categoria “Session” você pode digitar um nome para esta configuração (no campo “Saved Sessions”) e então clicar no botão “Save” para salvar a configuração e poder usa-la de outras vezes.
E ainda dizem que Windows é mais fácil que Linux 😉
Requisitos
Para simplificar eu deixei separadas as definições de cada um daqueles valores dados nas explicações acima. Você deverá substituir os indicadores em MAIUSCULA pelos valores que se adequem a sua necessidade. Caso ainda tenha dúvidas dê uma lida nos exemplos que seguem ao final do texto.
- PORTALOCAL – É uma porta alta (>1024) que será acessível em localhost (escolha um número que você goste mais, pois não faz diferença qual é ele, desde que você se lembre qual é);
- SERVIDOR – É o servidor onde está o serviço que você deseja acessar;
- PORTASERVICO – Se você acessasse o SERVIDOR diretamente, qual seria a porta em que o serviço desejado estaria rodando?
- SERVIDORSSH – É um servidor intermediário, que satisfaça as seguintes condições:
- Você tenha acesso por SSH
- Consiga acessar o SERVIDOR:PORTASERVIÇO sem restrições
- LOGINTUNEL – É o seu login SSH no SERVIDORSSH (Você TEM QUE TER uma conta SSH naquele servidor)
Vantagens deste tipo de túnel
- Sua conexão será criptografada até o SERVIDORSSH
- Nos relatórios de acesso ao SERVIDOR:PORTASERVIÇO, será visto como se o acesso acontecesse de SERVIDORSSH e não da sua máquina
- Você pode acessar um serviço crítico mesmo que a sua conexão Internet seja insegura (como em lanhouse e cybercafé)
- Não é preciso ter privilégios administrativos para usá-lo
Desvantagem
- É preciso ter uma conta de login para acesso SSH no SERVIDORSSH;
- A conexão do SERVIDORSSH até o SERVIDOR não é criptografada
- Nos relatórios de acesso ao SERVIDOR:PORTASERVIÇO, será visto como se o acesso acontecesse de SERVIDORSSH e não da sua máquina (Por isso SERVIDORSSH precisa ter acesso ao SERVIDOR:PORTASERVIÇO)
- O computador usado como cliente deve ser confiável (não adianta ser o da lanhouse, onde você não sabe o que tem rodando para monitorar suas atividades)
Esquema de funcionamento
O esquema abaixo é bastante tosco, mas acredito que dê para ilustrar bem o funcionamento do túnel. Observando onde a conexão é criptografada e onde não é e ainda é possível observar quais portas estamos acessando e onde.
localhost:PORTALLOCAL >=====> SERVIDORSSH:22 >=======>SERVIDOR:PORTASERVIÇO +++++Conexão criptografada++++++ ---------- Conexão aberta -------------
Onde usar
Você usa um únel de conexão local nos seguintes casos:
- Para acessar SERVIDOR:PORTASERVIÇO a partir de qualquer lugar, como se você estivesse acessando a partir de SERVIDORSSH;
- Para acessar um serviço crítico em SERVIDOR:PORTASERVIÇO atravessando por uma conexão não confiável (WIFI Zone em cybercafé, aeroporto etc); Como os dados entrarão e sairão da sua máquina critografados, não tem sniffer que veja o que está sendo feito;
Exemplos de uso
Segue abaixo dois exemplos de uso do túnel para ilustrar o seu funcionamento na prática. Para simplificar compare os valores usados com a sintaxe que eu passei lá no início e que eu transcrevo novamente aqui:
ssh -L PORTALOCAL:SERVIDOR:PORTASERVIÇO LOGINTUNEL@SERVIDORSSH
Acessando meu webmail inseguro em viagens
ssh -L 5000:webmail.empresa.com.br:80 welington@servidorcomssh
Executando este comando no meu notebook, por exemplo, eu poderia acessar o meu webmail do trabalho de forma segura, mesmo sem usar HTTPS, pois toda a comunicação do Notebook até o “servidorcomssh” será criptografada.
Para acessar o webmail bastaria abrir o navegador web no endereço http://localhost:5000 , ao invés de http://servidorwebmail
Este “servidorcomssh” pode ser qualquer máquina rodando SSH e que eu possa logar a partir do meu notebook.
Navegando na Internet como se estivesse do trabalho
ssh -L 4000:proxy.empresa.com.br:3128 welington@servidorcomssh
Se você configurar o navegador web do seu notebook para usar localhost:4000 como proxy, você poderá navegar de qualquer lugar no planeta usando o proxy da sua empresa e como se estivesse fazendo isso a partir do “servidorcomssh”.
Desta forma, além da segurança que você tem na rede por navegar pela rede da sua empresa que é/deve ser monitorada a todo tempo, seus dados estarão trafegando seguros até lá;
Lembrando que você precisa ter um login em “servidorcomssh” e este servidor precisa ter permissão de acesso ao “proxyminhaempresa”.
Este exemplo é um aperfeiçoamento do exemplo anterior, pois enquanto o anterior permite acessar apenas o Webmail, com este nós podemos acessar qualquer site.Entretanto é preciso lembrar que isto só é possível pois as requisições http são enviadas para o proxy que é quem acessa as páginas web nos devolvendo o resultado via tunel criptografado.
Conclusão
Outros exemplos seriam similares aos apresentados acima. Você pode substituir a PORTASERVIÇO (80 e 3128, dos exemplos acima) por qualquer outra como 143 para acessar um servidor IMAP, 25 para acessar um servidor SMTP, 110 para o POP3, 5900 para acessar o VNC etc.
O importante de lembrar é que você precisa ter um login para acessar o SERVIDORSSH e este servidor deve ter permissão para acessar o SERVIDOR que você deseja acessar. Uma vez que isto seja garantido você deverá substituir SERVIDOR:PORTASERVIÇO por localhost:PORTALOCAL para que o acesso se dê pelo túnel.
Em outra oportunidade veremos como criar os outros dois tipos de túneis que também possuem suas aplicações e vantagens. Quaisquer outras dúvidas é só comentar, ou procurar no Google 😉
Referências
Alexandre Cunha. Criando túneis de tráfego através de ligações SSH – Enviar e receber correio electrónico criptado num túnel SSH. Disponível em <http://alexandrecunha.com/artigo/software/criando_tuneis_de_trafego_atraves_de_ligacoes_ssh_enviar_receber_correio_electronico>
Elgio. Túneis cifrados com SSH. Disponível em <http://www.vivaolinux.com.br/artigo/Tuneis-cifrados-com-SSH>
Hoshi. Como passar pela maioria das restrições firewalls. Disponível em <http://www.hoshi.com.br/content/view/125/86/lang,brazilian_portuguese/>
Matheus Lamberti de Abreu. Criando tuneis criptografados com ssh. Disponível em <http://www.dicas-l.com.br/arquivo/criando_tuneis_criptografados_com_ssh.php>
UFC. Navegação Virtual. Disponível em <http://www.fisica.ufc.br/rede/virtual/>
Ótimo post! Sempre uso túneis quando necessário.
Mais uma dica, essa para quem não tem acesso a um servidor proxy. O ssh faz um pra você! =)
Basta fazer:
$ ssh -D 8080 usuario@servidor
E configurar seu browser para navegar através do proxy SOCKS aberto na porta local 8080.
E se eu estiver em numa maquina “client-linux” dentro da empresa, e conectar no servidor da empresa usando o SSH -D…..,
Como que eu configuro nessa maquina “client-linux” o acesso a internet sem que eu tenha o ambiente grafico nela.
Tem algum arquivo nesse “client-linux” que eu configuro o localhost + essa porta usada no -D para que o “client-linux” entenda que é para ele sair para internet usando essa porta?
@JC ,
Se entendi bem o que você quer fazer você deve configurar a variável de ambiente *_proxy correspondente ao protocolo desejado neste seu acesso.
Por exemplo se você quiser fazer o download de algum arquivo por http via comando wget bastaria fazer:
export all_proxy=socks://localhost:porta
wget http://servidor.dominio/arquivo-download-.txt
Além de all_proxy que serve para todos os protocolos, temos http_proxy, https_proxy, ftp_proxy, gopher_proxy