Você está na página 1de 6

Myhro Blog

About

Archives

Redirecionamento de portas no
SSH
Jul 9, 2012 Tiago Ilieve

H poucos meses falei aqui sobre algumas das facilidades do SSH, citando a
possibilidade de se utilizar o recurso de redirecionamento de portas locais para se
acessar indiretamente um computador na rede interna, sem deixar esta porta
aberta publicamente na internet. Tambm falei sobre como o VNC inseguro e
que o NX Server era melhor por rodar em cima do SSH. Porm, aliando alguns
destes recursos de tunelamento e redirecionamento de portas do SSH com a
simplicidade do VNC, podemos criar uma soluo muito interessante para acesso
remoto, alm de segura, multi-plataforma e muito flexvel.
Por padro, o VNC escuta nas faixas das portas 5800 e 5900. Digo nas faixas,
porque um mesmo servidor VNC pode abrir n sesses, cada uma em uma porta,
contando a partir da 5900: 5901, 5902, 5903 No caso da 5800 quase a mesma
coisa, com a nica diferena sendo o fato de que estas portas so utilizadas no
servidor Java, o que permite a um cliente acessar o servidor remotamente via
web, sem ter o aplicativo-cliente instalado. O maior problema desta configurao,
que mesmo tendo um sistema de autenticao encriptado, no muito prudente
deixar o servidor VNC disponvel abertamente na internet. Algumas
implementaes do VNC nem mesmo suportam senhas de mais de 8 caracteres.
O mais prudente considerar que no h segurana suficiente no VNC e deixar
isto a cargo do SSH.
Para criar um tnel e acessar um servidor VNC que est instalado na mesma
mquina onde est o servidor SSH, a sintaxe do comando para efetuar a conexo
a partir do cliente esta:
$ ssh -L 5901:localhost:5901 usuario@<ip-do-servidor>

O parmetro -L, diz que estamos criando uma porta local. Isto muito
importante, pois o que estamos fazendo na verdade criado um tnel que ser
usado da seguinte forma: a porta 5901 da sua mquina passar a redirecionar

para a porta 5901 do servidor, em sua interface de rede local. Sendo assim, ao se
conectar no servidor VNC, voc no mais especificaria o endereo **:1**" (o VNC
pede apenas o nmero da sesso, no necessrio somar seu valor porta
5900) e sim utilizaria o endereo "**localhost:1**".
Neste exemplo estamos utilizando a mesma porta em ambos os lados da
conexo, mas importante deixar bem claro que voc pode especificar o nmero
que bem entender ao criar uma porta local. Voc poderia, por exemplo, fazer com
que a porta local 20000 apontasse para a porta 21 do servidor, criando um tnel
encriptado para suas transferncias de arquivos, e em seguida conectaria seu
cliente FTP no endereo localhost:2000.
No Putty a configurao to simples quanto a utilizao do cliente SSH via
terminal, basta ir em Connection -> SSH -> Tunnels, especificar a porta local
(5901) no campo Source port e o restante (localhost:5901) no campo
Destination, em seguida marcando a opo Local logo abaixo. Ao clicar no
boto Add, a porta especificada adicionada lista Forwarded ports.

Esta a ideia de se redirecionar uma porta local para outra qual o servidor tenha
acesso. Acontece que esta porta no precisa ser necessariamente uma porta do
servidor, pode ser outra da rede interna, por exemplo. Se o conceito ficar confuso,

recomendo a leitura do post j citado onde explico como utilizar o conceito para
tunelar uma conexo da rea de trabalho remota do Windows. A ideia que o
localhost especificado poderia ser qualquer outro endereo que o servidor possa
se comunicar, alm dele mesmo, incluindo um host disponvel na internet, uma
vez que o objetivo acessar um outro servidor, passando pelo tnel criado pelo
SSH.
As coisas comeam a ficar mais interessantes quando nos deparamos com
situaes como a seguinte: um computador, que se encontra atrs de NAT, seja
de um simples routeador caseiro ou dentro da rede de uma grande empresa ou
universidade, que possui apenas um IP privado (como 10.0.0.x ou 192.168.0.x),
portanto, inacessvel atravs da internet, poderia se beneficiar dos tneis providos
pelo SSH para ser acessado externamente? A resposta, como voc j deve ter
imaginado, sim! Da mesma forma como abrimos uma porta local para acessar o
servidor atravs do tnel, possvel abrir uma porta remota, para que a partir do
servidor possamos acessar o cliente.
Nem sempre possvel utilizar a abordagem de se conectar a um servidor e em
seguida acessar, de forma indireta, uma mquina presente na rede interna. E se
voc no tiver acesso a este servidor? No meu caso, onde o servidor era o meu
prprio routeador, o processo foi simples. Mas e se o meu routeador no tivesse
um servidor SSH? Eu teria de recorrer a servios (muito bons) como o LogMeIn e
Teamviewer, que possuem uma abordagem parecida, onde todo o trfego passa
pelos servidores deles, ou simplesmente, utilizar o recurso de porta remota do
SSH. A sintaxe praticamente idntica utilizada para se abrir uma porta local:
$ ssh -R 5901:localhost:5901 usuario@<ip-do-servidor>

Como voc pode ver, s muda o parmetro, que agora passa a ser -R. No Putty,
a mudana equivalente, bastando escolher a opo Remote:

A partir de agora, qualquer conexo realizada no servidor na porta 5901 passar a


redirecionar para a porta 5901 do cliente, enquanto o tnel permanecer ativo.
muito importante salientar que, neste caso, a situao se inverte, pois o localhost
aqui corresponde ao cliente qual se conectou ao servidor. Isto significa duas
coisas diferentes: o servidor no necessariamente estar ouvindo a porta 5901
apenas na interface de rede local, conforme explicarei adiante, e o servio qual se
deseja acessar no cliente no precisa estar disponvel na rede interna, muito
menos na internet, uma vez que o tnel se refere a sua interface local (127.0.0.1).
Leia novamente este pargrafo caso a situao ainda no esteja clara - isto pode
lhe poupar muitas dores de cabea, futuramente, ao se perguntar porque o tnel
no est funcionando como deveria.
O detalhe que mais torna a situao dos tneis reversos, estes com a utilizao da
porta remota, confusos a questo da visibilidade da porta que foi aberta. Por
padro, ao se realizar a criao deste tnel, o servidor SSH permitir conexes na
porta remota apenas na interface de rede local. at mesmo uma questo de
segurana, uma vez que nem sempre quando a inteno se conectar a uma
mquina atrs de NAT, o desejo de torn-la disponvel globalmente na internet.
Voc poderia acess-la apenas a partir do servidor qual estabeleceu a conexo
SSH, e no a partir de conexes externas realizadas ao mesmo servidor. fcil
conferir isso com o auxlio do comando netstat:
[root@squeeze:~]# netstat -tap | grep 5901 | tr -s ' '
tcp 0 0 localhost:5901 *:* LISTEN 2910/4

Os parmetros -tap listam todos os sockets TCP abertos em todas as interfaces


rede, o grep filtra somente a porta que queremos e o tr com o parmetro -s
remove os espaos desnecessrios. Perceba que o servidor est aceitando
conexes apenas na interface de rede localhost (127.0.0.1). H duas formas de
contornar isto: a forma segura e a no to segura. A segunda consiste em tornar

disponveis globalmente estes sockets abertos pelo SSH, adicionando a opo


GatewayPorts yes no arquivo de configurao do servidor SSH (no Debian o
/etc/ssh/sshd_config) e em seguida reiniciando-o. Ao realizar novamente a
conexo, veja como fica a porta aberta:
[root@squeeze:~]# netstat -tap | grep 5901 | tr -s ' '
tcp 0 0 *:5901 *:* LISTEN 2996/4
tcp6 0 0 [::]:5901 [::]:* LISTEN 2996/4

Agora o socket est disponvel no apenas em todas as interfaces, como em


ambos os protocolos IPv4 e IPv6. Sendo assim, voc poderia, por exemplo, a
partir de uma terceira mquina no envolvida no processo de criao do tnel,
acessar o VNC disponvel na mquina cliente, se conectando ao **:1**". Esta
possibilidade muito interessante, no apenas porque possibilita o acesso a um
computador antes inacessvel via internet, mas pelo fato de que no nos interessa
o IP do mesmo. Com um servidor com um IP fixo, voc no precisaria se
preocupar com diversos clientes com IPs dinmicos (mutveis), pois todos
estariam acessveis a partir de um ponto central.
Por ltimo, vamos forma segura de se acessar esta mquina. Ao invs de tornar
a porta disponvel na internet, muito mais seguro, e at mesmo mais simples por
no tornar necessria a mudana na configurao do servidor SSH, utilizarmos
uma porta local na outra ponta, aliando as duas tcnicas de tunelamento. A partir
da terceira mquina, basta utilizar o mesmo comando que seria necessrio para
se conectar a uma sesso do VNC disponvel no servidor. Afinal, por mais que o
servio em si no esteja rodando l, a porta est disponvel, e atravs do tnel
podemos acess-la mesmo se esta estiver restrita a interface local.
$ ssh -L 5901:localhost:5901 usuario@<ip-do-servidor>

Da mesma forma, a partir do cliente VNC voc se conectaria ao endereo


localhost:1. A nica diferena que desta vez a conexo passaria por dois
tneis:
terceira-mquina -> servidor
servidor -> mquina-cliente

Pode no parecer to prtico, mas veja alguns dos problemas que resolvemos e
benefcios que obtivemos com esta abordagem.

A nica porta aberta para a internet, levando em conta os trs computadores,


a porta do servidor SSH.
possvel se conectar a mquinas que antes estariam inacessveis.
No necessrio se preocupar com o IP voltil das mquinas envolvidas
(levando em conta que o servidor tenha um IP fixo ou pelo menos um servio
de DNS dinmico configurado).
Um protocolo inseguro como o VNC foi encapsulado em tneis seguros com a
reconhecida criptografia do SSH.
Sua nica preocupao consiste em estabelecer os tneis e recri-los em
caso de perdas de conexo, o que pode ser feito automaticamente com
ferramentas gratuitas como o Tunnelier.
O processo pode no ser to simples, a princpio, mas a segurana e flexibilidade
trazidas podem valer muito mais a pena do que simplesmente abrir uma porta no
modem. A internet hoje uma selva. No deixe a segurana de lado apenas
porque nunca aconteceu com voc.
Referncias:
Howto use SSH local and remote port forwarding

Copyright 2015 - Tiago Ilieve

Powered by Jekyll