2009/04/22


Porta aberta, ao transpor-te entrei no céu

Lá vai uma dica para todos ratos de UNIX por aí.

Estava querendo fazer um túnel para permitir a um amigo usar a minha máquina através de um firewall, mas meu cenário é um pouco diferente do normal, então tive uma certa dificuldade.

O ssh consegue criar túneis, com as opções -L e -R, mas pelo que entendi nenhuma delas me atenderia.

Meu problema é o seguinte: estou numa máquina (meu notebook) atrás de um gateway. Eu até tenho IP real aqui, mas o gateway bloqueia tudo pro lado de dentro (é um "firewall" da vida). Eles inclusive bloqueiam conexões de bittorrent e IRC aqui... Gozado que MSN skype funcionam numa boa, ainda não descobri direito porque.

O lance é que eu consigo logar lá no servidor, e executar programas que ouvem portas altas. (Pssst, não digam pra ninguém isso é segredo.) Eu queria portanto dar um jeito de abrir uma porta lá no servidor, e simplesmente redirecionar o que quer que chegue pra minha porta 80, ou 22, e assim conseguir acessar essa minha máquina dentro da "intranet" pelo lado de fora.

Depois de muito penar pra concluir que não é isso que o ssh deixa fazer, e pesquisar em alguns blogs, finalmente cheguei na fórmula ideal. E a solução usa, como não podia deixar de ser, um dos mais maravilhosos programas pra estas situações: o netcat!

Depois que funciona dá aquela raiva, porque na verdade é bem simples. O que a gente precisa fazer é rodar um nc ouvindo a porta lá no firewall, e redirecionar tanto a entrada quanto saída dele prum outro nc que vai se conectar na porta que eu quero na minha máquina.

A dificuldade é fazer esse redirecionamento de entrada _e_ de saída, e ainda acertar a ordem de execução dos processos. A solução minha foi criar um fifo, e usar um pipe. Basta rodar portanto lá no gateway/firewall:

$ mkfifo fifi

E então

$nc -l 31337 < fifi | nc 654.234.654.142 80 > fifi

onde o 31337 é a porta (alta) que você escolher ouvir, e o número críptico é o ip (obviamente inválido) da sua máquina na intranet, seguido pela porta alvo. Neste caso, porta 80, de HTTP.

Agora qualquer browser que apontar para http://www.end.do.meu.servidor:31337 vai ser atendido, indiretamente, pela minha máquina. Não é legal?

(OBS: o título do post é da música do Vicente Celestino.)

ADDENDUM: parece que usando o ssh -R não funcionou só porque falta liberar o acesso da porta por IPs estrangeiros, através de uma diretriz GatewayPorts no arquivo sshd_config.

No comments: