Interligação de redes com OpenVPN
<absHTML>
<tbody> </tbody>Esta página está em construção e deverá estar pronta em poucos dias. Por favor, volte depois ou consulte-a agora com cautela e paciência. |
</absHTML>
by (C) João Eriberto Mota Filho <eriberto (a) eriberto pro br>
Artigo criado em: 27 de junho de 2007.
Última atualização: veja o rodapé desta página.
Tiny URL ou bit.ly: {{{2}}}
Sobre este artigo
Este artigo pretende descrever a configuração do OpenVPN, como cliente e servidor, no Debian GNU/Linux.
Vantagens do uso do OpenVPN
O OpenVPN possui diversas vantagens em relação ao IPSec na montagem de VPNs. Algumas delas:
- Grande facilidade de instalação e configuração.
- Excelente desenvoltura perante NATs em filtros de pacotes que estejam no caminho, evitando a necessidade de adaptações e de modificações no sistema de firewall.
- Permite o uso de UDP, evitando o efeito "TCP over TCP".
- Utilização de chaves assimétricas para a autenticação.
- Disponível para GNU/Linux e MS Windows.
- Grande estabilidade.
A criação das chaves
Algumas chaves assimétricas serão necessárias para que o OpenVPN seja instalado. Essas chaves poderão ser criadas com o OpenSSL e deverão ser assinadas por uma CA (autoridade certificadora) oficial ou por uma CA própria.
Para maiores detalhes sobre a criação das chaves, consulte o artigo Autoridade Certificadora (CA) com o OpenSSL.
Situação 1: um servidor (gateway) e vários clientes
A situação 1 encontra-se ilustrada na figura a seguir:
O gateway VPN, que geralmente é o filtro de pacotes mais externo do sistema de firewall, irá receber as conexões dos clientes externos. Poderá haver diversos clientes VPN.
Configuração do gateway OpenVPN (para a situação 1)
Instalação do OpenVPN (Debian Etch)
Para instalar o OpenVPN no Debian Etch, execute o comando:
# apt-get install openvpn
Criação dos certificados e das chaves
Com base no artigo Autoridade Certificadora (CA) com o OpenSSL, crie um par de chaves para ser utilizado no gateway. A chave pública deverá ser assinada pela CA, o que irá gerar um certificado.
No commonName coloque o nome completo (FQDN) do gateway completo da máquina que atuará como gateway. Exemplo: gangorra.rede.com.br. No emailAddress, coloque o endereço de e-mail do administrador da rede. |
Depois de gerar as chaves, torne a chave privada insegura, para que a mesma possa ser utilizada no gateway sem que haja um pedido de senha a cada conexão. Apenas para fins didáticos, utilize o nome insegura.key para a chave privada insegura.
O próximo passo será renomear as chaves para melhorar a identificação das mesmas. Considerando que o nome do seu gateway seja gangorra, execute os comandos:
# mv newcert.pem gangorra.crt # mv insegura.key gangorra.key
Também será necessário obter uma cópia do certificado raiz da CA que assinou a sua chave pública. Geralmente, o nome original desse certificado raiz é cacert.pem. Seria interessante renomeá-lo também (renomeie uma cópia dele, preservando o original). Um exemplo, considerando o domínio rede.com.br:
# mv cacert.pem rede.crt
Será necessária uma terceira chave. Essa chave só existirá do lado do gateway e será utilizada para troca inicial de informações, quando ainda estará sendo fechado o canal criptográfico. Para gerar a chave, com 1024 bits de tamanho, utilize o seguinte comando:
# openssl dhparam -out nome.dh 1024
Ainda, crie uma chave para ser utilizada como segurança adicional no TLS. Essa chave existirá tanto no cliente quanto no gateway. Utilize o comando:
# openvpn --genkey --secret gangorra.tlskey
Note que o comando anterior foi openvpn e não openssl. |
Instalação dos certificados e das chaves
Uma vez criados os certificados, os mesmos deverão ser colocados nos diretórios corretos dentro da máquina que será o gateway. Assim, coloque os seguintes arquivos nos seguintes diretórios:
rede.crt (cópia de cacert.crt) ---> /etc/ssl/certs/ gangorra.crt (antigo newcert.pem) ---> /etc/ssl/certs/ gangorra.key (antiga insegura.key) ---> /etc/ssl/private/ gangorra.dh (chave Diffie-Hellman) ---> /etc/ssl/private/ gangorra.tlskey (segurança TLS) ---> /etc/ssl/private/
A seguir, altere as permissões dos arquivos gerados para ter mais segurança:
# chmod 644 /etc/ssl/certs/rede.crt # chmod 644 /etc/ssl/certs/gangorra.crt # chmod 400 /etc/ssl/private/gangorra*
Arquivo de configuração do gateway (um exemplo)
No Debian, após instalar o pacote OpenVPN, será criado o diretório /usr/share/doc/openvpn/, que conterá diversas informações relevantes. Ao seguir os procedimentos existentes neste artigo, tudo deverá funcionar corretamente. No entanto, para um melhor entendimento e aprofundamento, seria interessante consultar o conteúdo do citado diretório.
O arquivo /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz é um exemplo, comentado, de arquivo de configuração do OpenVPN. É com base nele que deverá ser gerado o arquivo de configuração da vpn no gateway (em /etc/openvpn/).
O arquivo de configuração do gateway, a ser criado em /etc/openvpn/, poderá ter qualquer nome, desde que a extensão de tal arquivo seja .conf. |
A seguir, um exemplo de arquivo de configuração do gateway:
local 200.200.200.200 port 35000 proto udp dev tun ca /etc/ssl/certs/rede.crt cert /etc/ssl/certs/gangorra.crt key /etc/ssl/private/gangorra.key dh /etc/ssl/private/gangorra.dh server 192.168.231.0 255.255.255.0 push "route 10.0.0.0 255.0.0.0" push "dhcp-option DOMAIN rede.com.br" push "dhcp-option DNS 10.0.0.6" keepalive 10 120 tls-auth /etc/ssl/private/gangorra.tlskey 0 cipher BF-CBC comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log verb 3
Alguns comentários sobre algumas das linhas de configuração:
- local: contém o IP real do gateway na Internet.
- port: uma porta, escolhida aleatoriamente, para servir a conexão.
- proto: permite escolher o protocolo de transporte a ser utilizado. O protocolo UDP é o mais indicado, por ser simples e rápido.
- server: estabelece a rede de comunicação a ser utilizada pelos envolvidos para se comunicarem. Escolha uma rede que não exista em ambos os lados.
- push: utilizado pelo gateway para passar dados para os cliente, como um servidor DHCP. A linha route, por exemplo, estabelece a rota a ser utilizada para alcançar a rede 10.0.0.0/255.0.0.0 que, no caso, representa a rede interna a ser acessada via vpn.
- tls-auth: adiciona um grau de segurança. Deverá ter o parâmetro 0 no gateway e 1 nos clientes.
A figura a seguir ilustrará alguns detalhes da configuração realizada:
Para mais detalhes sobre os parâmetros do arquivo de configuração, leia o conteúdo do arquivo /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz e o howto existente em http://openvpn.net/howto.html. |
A configuração, como foi apresentada, permite que o cliente navegue na rede a qual ele está diretamente ligado, além da rede remota servida pela VPN. Caso você deseje que o cliente permaneça isolado, fazendo com que ele só tenha acesso à rede oposta (via VPN), acresça a seguinte linha:
push "redirect-gateway"
Inicialização do serviço
Para inicializar o serviço, utilize o comando a seguir:
# /etc/init.d/openvpn start
Verifique se o OpenVPN no gateway inicializou corretamente. Utilize o comando:
# ps ax | grep openvpn
Caso o OpenVPN não tenha inicializado corretamente, verifique o motivo no log /var/log/openvpn.log.
Configuração dos clientes OpenVPN em máquinas GNU/Linux (para a situação 1)
Cada máquina cliente terá que ser configurada, individualmente, de acordo com as instruções a seguir.
Instalação do OpenVPN
Assim como foi feito no servidor, instale o OpenVPN com o comando a seguir:
# apt-get install openvpn
Criação dos certificados e das chaves para o cliente
Inicialmente, crie um par de chaves para o cliente. A CA deverá assinar a chave pública. A chave privada poderá ou não ser tornada insegura. Vide o artigo Autoridade Certificadora (CA) com o OpenSSL.
Caso a chave privada do cliente não seja tornada insegura, será pedida a senha para acessar a VPN. Isso poderá ser uma boa idéia, caso a máquina em questão seja pública. |
Renomeie as chaves para melhorar a identificação das mesmas. Utilize o nome da máquina cliente ou outra identificação qualquer.
Você também irá precisar de uma cópia do certificado raiz da CA que assinou a sua chave pública e da chave TLS do gateway (no caso, gangorra.tlskey).
Instalação dos certificados e das chaves no cliente
Uma vez criados os certificados, os mesmos deverão ser colocados nos diretórios corretos dentro da máquina cliente. Assim, coloque os seguintes arquivos nos seguintes diretórios:
rede.crt (certificado raiz da CA) ---> /etc/ssl/certs/ canopus.crt (certificado do cliente) ---> /etc/ssl/certs/ canopus.key (chave privada do cliente) ---> /etc/ssl/private/ gangorra.tlskey (segurança TLS) ---> /etc/ssl/private/
A seguir, altere as permissões dos arquivos gerados para ter mais segurança:
# chmod 644 /etc/ssl/certs/rede.crt # chmod 644 /etc/ssl/certs/canopus.crt # chmod 400 /etc/ssl/private/canopus.key # chmod 400 /etc/ssl/private/gangorra.tlskey
Arquivo de configuração do cliente (um exemplo)
O arquivo /usr/share/doc/openvpn/examples/sample-config-files/client.conf é um exemplo, comentado, de arquivo de configuração do OpenVPN. É com base nele que deverá ser gerado o arquivo de configuração da vpn no cliente (em /etc/openvpn/).
A seguir, um exemplo de arquivo de configuração do cliente:
client dev tun proto udp remote 200.200.200.200 35000 resolv-retry infinite nobind persist-key persist-tun ca /etc/ssl/certs/rede.crt cert /etc/ssl/certs/canopus.crt key /etc/ssl/private/canopus.key tls-auth /etc/ssl/private/gangorra.tlskey 1 cipher BF-CBC comp-lzo status /var/log/openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log verb 3
Inicialização do cliente
Para inicializar o cliente, utilize o comando a seguir:
# /etc/init.d/openvpn start
Verifique se o OpenVPN no cliente inicializou corretamente. Utilize o comando:
# ps ax | grep openvpn
Caso o OpenVPN não tenha inicializado corretamente, verifique o motivo no log /var/log/openvpn.log.
Teste da conexão
Para testar a conexão, "pingue" um endereço IP que pertença à rede a ser acessada.
A resolução de nomes
Caso você esteja sem resolução de nomes no cliente, há várias saídas. Algumas delas:
- Editar o arquivo /etc/resolv.conf e inserir o IP do servidor DNS da rede de destino.
- Criar um servidor DNS local que faça forward de zona para o servidor DNS da rede de destino.
- Editar o arquivo /etc/hosts e inserir o nome e o IP das máquinas desejadas.
Configuração dos clientes OpenVPN em máquinas MS Windows XP (para a situação 1)
Cada máquina cliente terá que ser configurada, individualmente, de acordo com as instruções a seguir.
Instalação do OpenVPN
- Baixe e instale o pacote OpenVPN para MS Windows, disponível no site OpenVPN.NET (link Windows Installer). Sugiro fazer a instalação padrão, que deverá ocorrer em C:\Arquivos de Programas\OpenVPN.
- Baixe e instale o front-end OpenVPN GUI. Utilize a versão estável (stable) do tipo completa com instalação (installation package). Caso a instalação da interface TAP apresente problemas, clique em ignorar. Isso ocorre, uma vez que a interface virtual TAP já foi instalada pelo pacote OpenVPN e poderá já estar ativada. Sugiro fazer a instalação padrão (sem remover ou acrescer itens).
Criação dos certificados e das chaves para o cliente
Inicialmente, crie um par de chaves para o cliente. A CA deverá assinar a chave pública. A chave privada poderá ou não ser tornada insegura. Vide o artigo Autoridade Certificadora (CA) com o OpenSSL.
Caso a chave privada do cliente não seja tornada insegura, será pedida a senha para acessar a VPN. Isso poderá ser uma boa idéia, caso a máquina em questão seja pública. |
Renomeie as chaves para melhorar a identificação das mesmas. Utilize o nome da máquina cliente ou outra identificação qualquer.
Você também irá precisar de uma cópia do certificado raiz da CA que assinou a sua chave pública e da chave TLS do gateway (no caso, gangorra.tlskey).
Instalação dos certificados e das chaves no cliente
Uma vez criados os certificados, os mesmos deverão ser colocados nos diretórios corretos dentro da máquina cliente. Assim, coloque os seguintes arquivos dentro de C:\Arquivos de Programas\OpenVPN\config:
rede.crt (certificado raiz da CA) canopus.crt (certificado do cliente) canopus.key (chave privada do cliente) gangorra.tlskey (segurança TLS)
Arquivo de configuração do cliente (um exemplo)
O arquivo C:\Arquivos de Probgramas\OpenVPN\sample-config\client.ovpn é um exemplo, comentado, de arquivo de configuração do OpenVPN. É com base nele que deverá ser gerado o arquivo de configuração da vpn no cliente. O arquivo final também ficará em C:\Arquivos de Programas\OpenVPN\config\ e a sua extensão tem que ser .ovpn.
A seguir, um exemplo de arquivo de configuração do cliente:
client dev tun proto udp remote 200.200.200.200 35000 resolv-retry infinite nobind persist-key persist-tun ca rede.crt cert canopus.crt key canopus.key tls-auth gangorra.tlskey 1 cipher BF-CBC comp-lzo status openvpn-status.log # comente esta linha se for utilizar o OpenVPN GUI log openvpn.log # comente esta linha se for utilizar o OpenVPN GUI log-append openvpn.log # comente esta linha se for utilizar o OpenVPN GUI verb 3
Inicialização do cliente
A inicialização do cliente poderá ser feita pelo OpenVPN ou pelo OpenVPN GUI. Para inicializar pelo OpenVPN, vá para C:\Arquivos de Programas\OpenVPN\config e dê um clique com o botão direito sobre o arquivo de configuração (.ovpn). A seguir, selecione Start OpenVPN on this config file. Será pedida a senha da chave privada do cliente, caso a mesma não tenha sido tornada insegura.
Após a inicialização da VPN, serão criados os arquivos de log em C:\Arquivos de Programas\OpenVPN\config. |
Para inicializar o cliente pelo OpenVPN GUI (método aconselhado), clique com o botão direito do mouse sobre o ícone do mesmo, existente no SysTray, conforme mostrado na figura a seguir, e escolha a opção Connect.
Caso o OpenVPN não tenha inicializado corretamente, verifique o motivo no log openvpn.log.
Teste da conexão
Para testar a conexão, "pingue" um endereço IP que pertença à rede ou tente acessar um site da mesma.
Links externos
Controle de acessos
<absHTML>
</absHTML>