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.