Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

sábado, 24 de março de 2012

OpenWRT: Túneis e Proxy na sua Casa ou "Escapando do Big Brother"

Mais um artigo da série sobre o OpenWRT. Este vai ser um artigo não diretamente um recurso do OpenWRT mas o que você poderá fazer com ele.

Várias vezes fui questionado de qual seria a vantagem de instalar o OpenWRT se corro o risco de não dar certo e, além disto, perder a garantia. O grande diferencial do OpenWRT não são propriamente os recursos desenvolvidos pela comunidade OpenWRT, que já são muito melhores dos originais, mas a possibilidade de usar todos os recursos desenvolvidos para o ambiente Linux diretamente no seu roteador. Vou comentar neste artigo o uso de túneis e proxy SOCKS sobre um conexão SSH.

O SSH surgiu como um substituto seguro dos finados rlogin, rsh e telnet (ainda não muito morto). Ele é usado como uma das formas de gerenciar seu roteador, além da interface WEB. Porém, mais do que reimplementar as funcionalidades dos programas finados, o SSH foi além e acrescentou diversos recursos. Um dos mais interessantes, mas ainda pouco conhecidos, é a criação de túneis.

Os túneis ou encaminhamento de porta no SSH são como despachantes. Você indica onde quer conectar e ele abre a conexão para você. Para quem recebe a conexão, quem está conectando é o despachante e não você. Um bom exemplo de "homem do meio". O SSH pode criar túneis tanto do servidor para o cliente (-R) como do cliente para o servidor (-L). Na conexão com a opção "-L", uma porta local é aberta no computador cliente. Ao receber uma conexão nesta porta, o SSH solicita que o servidor conecte em um destino pré-definido e todo o tráfego fluindo por esta conexão trafegará pelo SSH. Para todos os casos, quem está efetivamente conectando ao destino é o servidor SSH e não a máquina cliente. A opção "-R" é simplesmente o inverso: o servidor abre uma porta local que, ao ser acessava, quem conecta ao destino é o cliente SSH.

Vamos a um exemplo simples. Suponha que você está em casa, sem camisa, na sua folga, tomando uma cervejinha e alguém liga do trabalho que uma conta de um usuário importante no banco de dados está bloqueada. Se você tiver um SSH dentro da empresa acessível pela internet, poderá resolver o problema antes de esquentar a cerveja:
computador-casa$ ssh usuario@servidor-ssh.empresa.net -L 6666:servidor-banco.intranet:5432
servidor-ssh$ 
Ao completar a autenticação, você receberá o shell de sempre. Porém, devido ao comando -L, o cliente SSH local abrirá uma porta local: a 6666. Você poderá verificar isto usando o netstat ou o ss. Aponte o cliente do banco de dados para conectar nesta porta local no computador local:
computador-casa$ psql -h localhost -p 6666 -U usuarioadm -W
Quando o cliente SSH rodando em computador-casa receber o pedido de conexão na porta 6666, ele solicitará ao servidor servidor-ssh.empresa.net que este conecte em servidor-banco.intranet na porta 5432. Tudo isto utilizando uma conexão cifrada entre o computador-casa e o servidor-ssh. Seu cliente de banco de dados vai achar que existe um servidor de banco de dados rodando na máquina local na porta 6666. O servidor de banco de dados vai achar que o servidor-ssh.empresa.net está conectando nele. Simples. Resolva o problema e volte para a cervejinha. 
Nota: se a solução for utilizar um cliente em modo texto, como o psql, normalmente faz mais sentido simplesmente rodar o psql no servidor-ssh ou conectar a partir deste em um computador que o tenha e conectar de dentro da própria rede.
Isto também pode ser usado para a WEB, usando a porta 80. Porém, as inúmeras referências externas do HTML, o uso de referências absolutas e servidores que utilizam virtualhosts baseados em nomes fariam com que esta técnica de tunelamento individual se torne improdutiva. Para sanar este problema, foi criada a opção "-D" para a criação de túneis dinâmicos, simulando um servidor SOCKS.

A opção "-D porta" cria um servidor SOCKS (protocolo de PROXY não específico para HTTP), no computador cliente, fazendo com que as conexões saiam pelo servidor SSH.  Isto funciona com a maioria dos servidores e clientes SSH, incluindo o dropbear presente no OpenWRT. Vamos ao exemplo.

Imagine que você deseja acessar no trabalho um endereço sem o conhecimento do administrador da sua rede local (desde que o administrador não seja eu). Supondo que você instalou o OpenWRT na sua casa e o SSH está liberado para acesso remoto, bastaria você executar:
computador-empresa$ ssh root@ip-do-meu-roteador -D 8888
Isto abrirá uma porta local 8888. Agora, basta configurar o seu navegador para utilizar um proxy SOCKS no endereço localhost:8888. Todas as suas requisições do navegador serão enviadas para o cliente SSH local, cifradas, enviadas ao seu roteador em casa e este sim acessará o site desejado. Simples e seguro. Como seu roteador também vê a rede interna, você pode utilizar o mesmo recurso para acessar um serviço na sua rede local (192.168.x.x). Tudo isto abrindo para a Internet no seu roteador apenas o serviço SSH.

Em geral, os bons programas tem suporte a usar um servidor SOCKS. Para os demais casos, você pode usar uma biblioteca/programa que intercepte as conexões e as envie ao servidor PROXY. Desta forma, funciona para quase todos os casos.

Claro, é bom lembrar que rastros ficam no computador cliente como logs, cache do navegador e essas coisas. Se o objetivo é ser "furtivo", deve tomar mais alguns cuidados.


Não é bem o caso mas, se seu cliente necessariamente é um Windows, o Putty também possui estes recursos de encaminhamento de porta e proxy.

Happy hacking...

13 comentários:

  1. Este comentário foi removido por um administrador do blog.

    ResponderExcluir
  2. Olá Patrique,

    Se seu caso for um Proxy HTTP (estilo squid) e não um SOCKS, poderia sugerir uma regra de firewall para proxy transparente. Isto também depende de o servidor PROXY suportar. Porém, ele não vai funcionar para HTTPS. O melhor seria, neste caso, usar um script wpad e configurar sua rede local para "detectar automaticamente as configurações de proxy".

    Se for um SOCKS, você precisa de algo como http://darkk.net.ru/redsocks/.
    Para o openwrt, não usei mas em uma busca rápida vi alguns pacotes interessantes:
    socksify, srelay, transocks, tsocks

    Começa olhando por ai

    ResponderExcluir
  3. oi luiz!! muito obrigado pelo retorno amigo!!!

    fiquei mais perdido agora.. mas normal com tanta informação nova para eu estudar agora hehehe

    da uma olhada neste tópico q eu fiz
    https://forum.openwrt.org/viewtopic.php?pid=166334#p166334

    eu não sei se espliquei direito ao amigo meu problema pq manjo pouco de openwrt..

    não tenho conhecimento nem para esplicar direito vou tentar de novo hehehe

    tenho router TL-WR1043ND
    instalei o openwrt
    instalei os ipks e configurei o 3g
    ele conecta tudo certo..

    ai eu tenho que ir no meu firefox e configurar no http proxy 200.122.110.147 port 80

    ai o bixo navega! mas tipo se for usar um skype tenho q configurar o http proxy nele tb..

    tem como fazer para o openwrt conectar a este proxy e repassar a internet direto sem fazer tanto esquema hehehe

    e o principal configurar isto em um estilo copy paste for dummies hehehe

    flw amigo abração! valeu pela ajuda eim!!!

    ResponderExcluir
    Respostas
    1. Como eu temia, é um proxy HTTP.

      Você até pode criar uma regra de proxy transparente mas não vai ajudar muito. Só irá resolver para HTTP (e não para HTTPS e qualquer outro) e se o servidor de PROXY suportar. Os pacotes que eu passei eram para o caso de um servidor SOCKS...

      Infelizmente, o que eu conheço que é mais "transparente" para os usuários é a configuração automática. Recomendo você estudar sobre WPAD e PAC. O que você pode fazer é hospedar o script de configuração no seu roteador.

      Abs,

      Excluir
  4. Boa noite.
    Sei que essa postagem é meio antiga mas gostaria da sua ajuda.
    Já tenho o OpenWrt rodando no meu roteador e queria sua ajuda para configurar o túnel SSH para acessar alguns sites bloqueados no meu trabalho rsrs
    Não achei nada muito claro na internet de como fazer a configuração.
    Eu já acesso meu roteador pela internet usando o no-ip para acessar o transmission, ftp e outras coisas mais.
    O que eu tenho que fazer? Usar o Dropbear? Como ele funciona? Ou só libero a porta do SSH e executo a linha de comando que vc posto no Putty?
    Agradeço se puder ajudar!

    ResponderExcluir
  5. Vou considerar que você usa o OpenWRT no seu roteador e que seu cliente é windows.

    Use a configuração de túneis do Putty. É equivalente ao "ssh -D" do unix. Procure que você vai achar. Você precisa criar um túnel dinânico. Coloque uma porta a sua escolha, ex: 8080. Ao conectar pelo SSH, tudo estará pronto. Não precisa digitar qualquer comando no putty.

    Configure o seu navegador para usar um Proxy socks em http://localhost:porta, onde porta é a porta que você configurou no putty. Só navegar. Todo seu tráfego irá para seu roteador por SSH e de lá sair para a internet.

    ResponderExcluir
    Respostas
    1. Procurei no google mas acho que não entendi muito bem.
      Não tenho que mudar nada nas configurações no OpenWrt? Abrir alguma porta para o SSH ou alguma coisa assim?
      O putty eu tenho que usar no meu PC cliente no meu trabalho ou em casa para configurar o roteador?
      Confirmando que uso Windows tanto em casa como no meu trabalho e meu roteador já esta rodando o OpenWrt.
      Obrigado pela ajuda.

      Excluir
    2. Se você consegue conectar no SSH do roteador a partir do trabalho, não precisa abrir qualquer porta. O encaminhamento por SSH não tem relação com o encaminhamento de portas feito pelo firewall, que permite o acesso externo a serviços em computadores da rede interna (pode ser esta a confusão).

      A configuração padrão do dropbear (ssh no openwrt) já suporta o encaminhamento de portas. É questão do cliente (putty) solicitar. O putty só rodará no seu cliente (trabalho).


      O computador em casa não participa do encaminhamento, somente o roteador. Sei que parece que falta alguma coisa mas vai funcionar. Só precisa conseguir conectar no seu roteador do seu computador no trabalho.

      Excluir
    3. Agora consegui entender o que vc tinha dito e realmente antes eu achava que estava faltando alguma coisa mas não estava.
      Meu roteador já estava configurado para aceitar conexões SSH, a única coisa que eu fiz foi mudar a porta para 1422 (por segurança) e liberar a mesma no firewall.
      Fiz o teste no meu android e consegui conectar no roteador por SSH usando o 3G.
      Meu problema é que tentando pela rede da empresa sempre da timeout na conexão. Aqui no trabalho eu me conecto na internet através de um proxy da empresa.
      O que pode ser? Eles conseguem bloquear conexão SSH na rede?
      Existe algum programa para identificar quais portas estão abertas para entrada e saída no proxy?
      O engraçado é que meu transmission está configurado para a porta 9091 e eu consigo acessá-lo normalmente pela internet da empresa.
      Agradeço se puder ajudar.


      Excluir
    4. Bem, este é o seu problema. A sua empresa está bloqueando estas conexões. Sim, eles conseguem. Se quiser ir mais afundo, busque port "SSH over HTTP proxy". Porém, não vou poder ajudar muito mais pois isto vai além do que proponho neste espaço.

      Excluir
  6. oi Luiz muito bom seu blog, gostaria de uma ajuda posso criar um proxy servidor no próprio openwrt para uso particular e usar para burlar franquia do 3g isso funciona ? meu roteador é
    tplink wr1043nd , tem como criar um proxy que aceite http https ? se isso não funciona exite outro meio ?

    ResponderExcluir
    Respostas
    1. "...criar um proxy servidor no próprio openwrt para uso particular... " é tranquilo. Mas tem q ter um motivo...
      "...usar para burlar franquia do 3g..." só se a operadora for muito amadora (e provavelmente não é). A franquia conta a quantidade de bits, não importando se está sobre um túnel.

      Excluir
  7. No caso de utilizar o proxy no openwrt com um playstation 4, qual seria o mais recomendado?

    ResponderExcluir