Discuta este tópico no fórum

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

quinta-feira, 12 de fevereiro de 2015

OpenWRT: Cliente VPN com OpenVPN

Mais um artigo da série sobre o OpenWRT.

No post anterior, apresentei a configuração de um servidor VPN utilizando OpenVPN. Comecei por esta solução de VPN por ser, ao meu ver, a mais simples de ser implementada. Apesar de não nativa em nenhum ambiente, ela possui clientes para quase tudo que você vai precisar (inclusive ambientes mobile). A grande vantagem do OpenVPN é a sua facilidade de implementação. Ele opera como qualquer outro serviço de rede com SSL. Tudo acontece em uma porta única (padrão 1194/udp). Servidor atrás de uma NAT? Só encaminhar a porta. Cliente atrás da NAT? Sem problemas! No pior dos casos, aonde existe conexão com a internet com filtragem, provavelmente o firewall permite conexão direta pela porta do HTTPS(443). Em geral ele nem vai sentir se você usar OpenVPN em uma porta 443/tcp. Ah, também funciona sobre proxy HTTP. Fora isto, não precisa de grandes modificações no sistema operacional para suportar o OpenVPN. Basta ele fornecer um mecanismo de placa de rede virtual do tipo TUN ou TAP que o resto é implementado fora do kernel.

Mas eu não gostei do OpenVPN por que ele precisa de uma CA! Não necessariamente, mas é recomendado e normalmente a melhor solução segura e de longo prazo. Existem outras formas de autenticação para OpenVPN como utilizando usuário/senha ou chave compartilhada. Só não considero as melhores para um caso geral. A primeira, utilizando usuário/senha, evita a necessidade de gerar certificados para os clientes. Contudo, você ainda terá o certificado do servidor, que precisa ser validado pelo cliente (e não validá-lo é sim MUITO PERIGOSO). Isto vai exigir que o cliente ainda tenha o ca.crt na sua configuração. Se você terá que gerenciar uma CA para um certificado do servidor, vai ter que copiar o ca.crt para todos os clientes, então já gera o certificado do cliente também e faz o serviço completo. Já a chave compartilhada pode ser útil se você tem apenas uma conexão VPN e nunca mais terá outro cliente. Se tiver mais de um cliente, não é recomendado. Imagine se alguém, que não devia, tem acesso a esta chave? Ao comprometer a chave em um cliente qualquer, a MESMA chave em todos os demais clientes terá que ser alterada. Nada prático para um ambiente com mais de 3 clientes.

Bem, vamos a tema deste artigo: um cliente OpenVPN em OpenWRT. Primeiro, quando vou usar o OpenVPN como cliente em um roteador? Para ligar um segmento de rede remoto. Isto pode ligar a rede da matriz com a filial da outra cidade ou conectar a rede LAN dos seus pais na sua para facilitar aquele suporte de última hora (recomendo).

Instalação

Os pacotes necessários são iguais um servidor, exceto pela CA (que nem precisaria estar no servidor). A diferença entre um servidor e um cliente é apenas configuração. Por isto, copio do post do servidor OpenVPN:

<CTRL+C>
Na versão Barrier Breaker, existe 3 opções de openvpn:
  • openvpn-nossl (sem criptografia)
  • openvpn-openssl
  • openvpn-polarssl

A primeira é mais enxuta mas não utiliza criptografia, o que normalmente é um requisito de um serviço VPN. Os dois seguintes são equivalentes, variando apenas a implementação de ssl que será utilizada. O polarssl é mais enxuto tanto em funcionalidades como em tamanho. É muito interessante para ambientes com restrição de recursos como o roteador e provavelmente terá tudo que você precisa. Contudo, se você já tem o libopenssl instalado por requisito de outro pacote, não vale a pena instalar o polarssl em paralelo. No meu caso, como tenho outros pacotes que já exigem o openssl, vou instalar o segundo pacote (em destaque).
<CTRL+V>

Configuração

A configuração é no mesmo local, /etc/config/openvpn, só com alguns parâmetros a menos/mais:

config 'openvpn' 'client_vpn'      
         option 'client' '1'
         option 'dev' 'tun'
         option 'resolv_retry' 'infinite'
         option 'nobind' '1'
         option 'persist_key' '1'
         option 'persist_tun' '1'
         option 'comp_lzo' 'no'
         option 'verb' '3'
         option 'remote_cert_tls' 'server'
         option 'enable' '1'
         option 'proto' 'udp'
         option 'ca' '/xxx/ca.crt'
         option 'cert' '/xxx/client.crt'
         option 'key' '/xxx/client.key'
         option 'remote' 'endereco.do.meu.servidor 1194'

As grandes adições na configuração são o "client", indicando que é um cliente, o "remote", informando como chegar no servidor e a troca do certificado e chave, antes do servidor para os do cliente. O ca.crt é o mesmo. Coloquei a referência em /xxx, que não existe, para ficar claro que é um diretório arbitrário. Sugiro que você coloque em /etc/openvpn/ mesmo. Outra opção importante é a "remote_cert_tls server". Isto faz com que o cliente não aceite um servidor se o certificado dele não dizer que ele é um servidor (lembra do build-key-server ao invés do build-key no easy-rsa?). Isto evita que um servidor falso de OpenVPN utilizando um certificado de um cliente, mesmo que válido, não se passe por um servidor legítimo.

É hora de disparar o serviço:

/etc/init.d/openvpn start

Acompanhe pelo logread por possíveis erros. Assim como no servidor VPN, se tudo ocorrer como esperado, neste ponto você terá um novo dispositivo (tun0) no seu roteador. Parabéns, você fez a sua primeira conexão VPN entre um cliente e servidor OpenWRT.

Assim como na configuração do servidor, neste momento, o tun0 não pertence a nenhuma interface do OpenWRT (e consequentemente, a nenhuma zona do firewall). Por padrão, este tráfego será descartado.

Pela interface Luci, adicione uma nova interface (sugestão de nome: vpn) no OpenWRT em Rede/Interfaces. Configure-a para ser não gerenciada e escolha o dispositivo tun0. Nesta mesma interface, você já pode atribuir uma zona do firewall (sugiro o nome vpn). Diferentemente do servidor VPN, a zona vpn no cliente atua como uma WAN (que fornece conectividade aos clientes da LAN) especial e não como outra LAN (de onde vem as conexões dos clientes). Por este motivo, a configuração é distinta. Você vai querer habilitar o encaminhamento de pacotes entre a zona vpn e a lan. Se optar por mascarar a rede (NAT), não vai precisar de configurações extras. Se não existir colisões de rede e você quiser acessar diretamente os clientes, explico mais adiante. Para ambiente corporativo, pode ser interessante retirar o encaminhamento padrão da lan para a wan. Isto evita o acesso dos clientes da LAN à internet pela WAN. Caso eles necessitem de acesso internet, terão que passar pela VPN e sair pela conexão internet da rede do servidor VPN.

Configuração com um "plus a mais"

Para não utilizar o mascaramento da rede LAN de um cliente VPN, você precisa informar ao servidor OpenVPN que existe a rede 10.4.3.0/24 atrás do cliente de VPN client-filial1. Isto fará com que o OpenVPN adicione rotas locais que encaminham os pacotes para a rede 10.4.3.0/24 ao endereço IP em uso atualmente pelo cliente client-filial1. Vamos precisar alterar a configuração do servidor VPN.

No servidor VPN (em /etc/config/openvpn), adicione o "client_config_dir" uma única vez e uma rota para cada subrede de clientes VPN:

/etc/config/openvpn:
       option 'client_config_dir' '/etc/openvpn/ccd'
       list 'route' '192.168.4.0 255.255.255.0'
       list 'route' '192.168.5.0 255.255.255.0'
       ...

O "route" adiciona a rota ao sistema do servidor para enviar pacotes de cada uma das respectivas redes ao OpenVPN. Se um cliente possuir mais de uma rede ou existir mais de um cliente com subredes, adicione novas linhas. OK, mas com o OpenVPN sabe para qual cliente ele deve enviar? Ai entra o client_config_dir. Neste diretório existirão arquivos individuais que acrescentam configurações específicas para cada cliente. Na sugestão, os arquivos ficam em /etc/openvpn/ccd/xxx, onde xxx é o nome do CN informado na geração do certificado no comando build-key (não o nome do arquivo!). Se não lembrar o que você digitou, pode resgatar esta informação com este comando sobre o arquivo .crt do cliente:


# openssl x509 -in /etc/easy-rsa/keys/client1.crt -text | grep Subject: 
Subject: C=BR, ST=XX, ... CN=client-abc/name=EasyRSA/emailAddress=abc@abc.com

No caso, seria o cliente-abc e você precisaria criar o arquivo em /etc/openvpn/ccd/cliente-abc no servidor VPNNeste arquivo, adicione as rotas para as LANs alcançáveis através deste cliente VPN:

/etc/openvpn/ccd/cliente-abc:
iroute 192.168.4.0 255.255.255.0

Lembrando que a rede no iroute é a mesma que também está presente na configuração do servidor VPN (mas neste caso é iroute mesmo e não route).

Feito! Agora você já pode acessar o computador da sua mãe para achar onde ela salvou aquele arquivo importante sem precisar de voltas mirabolantes, encaminhamentos de porta ou soluções para atravessar a NAT. Basta acessar o computador como se fosse um outro computador da sua rede.

No próximo post, vou tentar preparar um artigo sobre VPN utilizando IPsec. É um tanto mais complicado e bem mais entrelaçado aos recursos do sistema operacional. IPsec é implementado no kernel e os programas auxiliares cuidam apenas da parte burocrática como negociar as chaves, configurar rotas e informar o kernel dos parâmetros do IPsec.

Alguma dúvida? Criei um fórum para o blog e com um tópico para cada novo artigo. Até a próxima.

9 comentários:

  1. A muito tempo eu tento conectar meu router com OpenWRT no serviço cactusvpn e nunca tive sucesso, por nenhum meio, somente com o a DD-WRT. Eu tentei isso ai que passou, porém para nesse erro:
    daemon.err openvpn(sample_client)[1850]: ERROR: Cannot open TUN/TAP dev /dev/net/tun: Permission denied (errno=13)


    Tem ideia de como resolver? Desde já, obrigado.

    ResponderExcluir
    Respostas
    1. André, dificilmente é realmente problema de permissão. As vezes este tipo de erro se manifesta por outro motivo. As outra linhas do openvpn podem dar alguns dica. Os com carinho mesmo os warnings.

      Qual versão do openwrt você está usando?

      Excluir
  2. Oi Luiz, eu estava tentando criar um servidor VPN aqui para acesso remoto do roteador.

    A princípio queria fazer com o OpenVPN mas não tinha disponível o pacote "openvpn-easy-rsa" para o meu roteador (Barrier Breaker - Pandorabox), então decidi tentar com o "ocserv" (OpenConect VPN server) aliado com no-ip, entretanto não consegui nada!

    Depois de muito quebrar a cabeça, descobri que o motivo de não funcionar era o fato de eu não ter um IP real, mas um compartilhado (internet via rádio).

    Vendo que não seria possível uma conexão direta entre meu roteador (como servidor) e algum cliente por não ter acesso direto a ele pelo IP, resta, ao meu ver, tentar alguma coisa que funcionasse de forma semelhante ao Hamachi.

    Pelo que eu vi no seu outro tutorial, o "openvpn-easy-rsa" só é necessário para criar um servidor, então ainda dá pra fazer o procedimento de cliente com o openvpn-openssl, mas para isso, precisaria de algum serviço de servidor online que conectasse todos os meus clientes, parecido com o Hamachi, neorouter, e afins...

    Vc sabe me indicar algum que funcionasse para esse propósito?

    Ou então, sabe como contornar o problema do IP compartilhado sem redirecionamento de porta do provedor para o meu roteador (nesse caso usaria o Openconect server que me pareceu fácil o manuseio)?

    Grato pela atenção!

    ResponderExcluir
    Respostas
    1. É, sem IP real é complicado mesmo. Talvez se seu provedor habilitar a negociação do encaminhamento de porta por nat-pnp ou equivalente. Caso contrário, não tem como. Resta esperar pelo IPv6 :-)

      Uma alternativa é contratar um servidor e colocar um OpenVPN lá. Não conheço provedor de qualidade de VPN no Brasil, mas você poderia contratar um servidor linux genérico e instalar o serviço.

      Excluir
  3. Olá.
    Eu uso o PPTP e gostaria de conecta-lo diretamente pelo roteador...Você já fez ? Teria algum palpite? Está dificil encontrar a solução...

    ResponderExcluir
    Respostas
    1. Olá Jonas,

      Já fiz com IPSec e OpenVPN mas nunca com PPTP (pois é sabidamente inseguro).
      Se quiser arriscar, esta é a documentação:
      https://wiki.openwrt.org/doc/howto/vpn.server.pptpd

      Excluir
  4. Bom dia Luiz, tudo bem? Minha dúvida é o seguinte, eu já tenho a algum tempo um serviço de VPN para proteger a privacidade do acesso à internet da minha casa. Basicamente ele mascara minha real conexão a partir do meu provedor. Estou tentando fazer rodar silmultaneamente o OPENVPN para que eu acesso o roteador remotamente para algum suporte para meus familiares, porem quando inicio a segunda instancia do Openvpn, ele quebra o acesso a internet de todos os clientes. Para o mode de Openvpn para privacidade, utlizo um serviço de VPN chamado My Open VPN (Provedor na Inglaterra). Estou utizando para o Openvpn modo server, o túnel configurado como TAP.

    ResponderExcluir
  5. Olá Luiz ! Parabéns pelo tutorial muito bem redigido. Estou com dificuldade em acessar a rede local do lado do cliente openvpn. Tenho roteador Openwrt 19.07 rodando o servidor, em rede local 192.168.x.0, entregando vpn 25.x.x.0 em uma cidade. E um Orange PI zero rodando Openwrt 19.07 como cliente Openvpn , IP cliente dhcp de rede local 192.168.y.232, recebendo ip vpn: 25.x.x.2 na rede do cliente o gateway é um roteador tp-link com firmeware original, onde existe uma rota estática (destino 192.168.x.0, mascara 255.255.255.0 e gateway 192.168.y.232). Apartir da rede 192.168.y.0 eu acesso todos os ips da rede 192.168.x.0. Mas apartir da rede 192.168.x.0 eu só consigo acessar ssh, http entre outros do roteador orange pi zero openwrt openvpn cliente pelo ip vpn 25.x.x.2, apartir desta rede 192.168.x.0, o 192.168.y.232 nem responde ao ping. O que eu preciso fazer para conseguir que os pacotes da rede sejam encaminhados do tun0 (VPN) passando pelo ip 192.168.y.232 (organge pi zero que só tem uma placa de rede) e redirecionados para o 192.168.y.1, que é o roteador tp-link e apartir deste, seja redirecionado na rede local do cliente openvpn (192.168.y.0) ?. isso é possivel?

    ResponderExcluir
    Respostas
    1. Tudo é possível... é uma questão de tempo e dinheiro.

      Tive que desenhar para entender mas tenho uma boa ideia do problema. A rede 192.168.y.0 consegue rotear para 192.168.x.0 provavelmente por causa da rota padrão. Tudo que passa pela VPN vai desembocar nela, seja google ou 192.168.x.0. Se não era essa a ideia, não envie a rota padrão pela VPN. Agora vamos a como fazer para funcionar... e nos dois sentidos.

      Você precisa imaginar que existe um roteador virtual dentro da vpn, que vai ter rota para cada um dos clientes. Normalmente teremos apenas as rotas para cada um dos endereços IPs VPN (25.x.x.0) e a padrão (saindo pelo servidor). E se eu quiser enviar mais rotas, como dizer para enviar pacotes para 192.168.y.0 pelo clienteN? Você deve usar o iroute, normalmente na configuração CCD. Você pode ver estas rotas em /var/run/openvpn... no cliente e servidor.

      Fora isso pode ter problemas na autorização do encaminhamento de pacotes. No firewall do OpenWrt, nenhuma zona encaminha para outra sem autorização explícita e só a LAN pode encaminhar para WAN por padrão. Se criou uma zona nova para a vpn (dispositivo tun0), você precisa autorizar o encaminhamento da zona da vpn de/para a LAN. Se não configurou uma zona, não vai encaminhar também.

      Excluir