Configurando OpenVpn básico.
Sumário:
A ideia foi realizar uma configuração onde ficava transparente para o operador a possibilidade de adicionar hosts na rede virtual privada de forma fácil. A técnica adotada nesse paper não é recomendada pois utiliza apenas um certificado para todos os hosts da VPN, podendo ser uma brecha de segurança, podendo não, é.
Basicamente a implementação consiste em instalar os pacotes, mover os arquivos de configuração no servidor para o local indicado, configurar tais arquivos, preparar as chaves do servidor e depois as do cliente, mover as chaves do cliente para o respectivo cliente, iniciar a VPN no lado servidor e fechar a conexão. Contudo, tecnicamente falando não é assim tão simples.
Relatório Técnico:
O ambiente foi homologado nos sistemas operacionais abaixo:
- PRETTY_NAME=”Debian GNU/Linux 8 (jessie)”
- CentOS Linux release 7.3.1611 (Core)
A instalação muda em relação ao sistema, é algo sutil, uma delas foi alguns diretórios e a outra diferença basicamente foi no gerenciador de pacotes apenas(Yellowdog updater, modified aka yum /Apt) essa diferença de pacotes é devido aos sistemas centOS não tem alguns pacotes(OPENVPN) nos repositórios padrão, então surge a necessidade de instalar o novo repositório:
Extra Packages for Enterprise Linux (EPEL).Caso esteja em um sistema CentOS Instale antes:
- epel-release
Pacotes Necessários para ambas as distribuições:
- openvpn
- easy-rsa
Antes de iniciarmos de fato o deploy, é interessante lembrar que o servidor, geralmente todos os servidores devem ficar com IP FIXO definidos, mesmo que você tenha um servidor DHCP servindo IPs na rede atrelado ao MAC da interface, vamos supor que seu servidor DHCP crashe e então todos seus servidores iriam down. então é importante fazer as coisas de forma correta.
— Edit
Estou editando esse paper merda q escrevi uns meses atrás, precisei dele agora e vi vários erros, não configurar a interface com IP fixo foi um deles, então, resumidamente, irei colocar a configuração padrão de interface com IP fixo para sistemas baseados em debian, sistemas baseados em redhat é completamente diferente mas quase igual.
Então segue a configuração de ip estático na interface.
O arquivo de configuração de interfaces nos debian based é /etc/network/interfaces, segue abaixo:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.9
netmask 255.255.255.0
gateway 192.168.1.2
broadcast 192.168.1.255
dns-nameservers 8.8.8.8 8.8.4.4
Agora que os pacotes estão instalados, vamos iniciar as configurações, note que quando tiver comandos para as duas distribuições, você deve seguir obviamente a da respectiva, se você esquecer disso, você vai descobrir depois de qualquer forma quando não der certo. Then Follow my leads:
SERVER SIDE
Copiando o arquivo de configuração para o repositório padrão do Openvpn:
CENTOS:
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn
DEBIAN:
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn
gunzip -d server.conf.gz
Sobre a configuração do arquivo é relativamente simples, eu não recomendo você remover os comentários logo de cara pois está realmente bem documentado e explica de forma razoável o que cada opção faz, recomendo realizar uma leitura do arquivo antes até porquê não pretendo explicar o que cada opção faz, os comentários já fazem isso.
Os comentários são marcados com “ ; “, para ativar uma opção basicamente você precisa usar as setas do teclado e o backspace, ou o del se preferir.
Vamos Editar o arquivo de configuração, utilize seu editor de texto preferido:
vim server.conf
Altere:
; local a b c d
Para:
local ipv4_do_seu_server(FQDN)
Lembre-se que, se por acaso a conexão vier atráves de um NAT, é importante colocar o bind no IPv4 local, caso seu servidor tenha acesso direto, use o IPv4 dele externo caso for fixo, caso ele seja um endereço servido por DHCP( Que altera dinamicante), utilize um servidor de DNS atribuindo um FQDN.
Verifique se a opção abaixo está habilitada com 2048 bits.
dh dh2048.pem
A linha abaixo é referente à definir que todo tráfego vá passar pela VPN, ele define a rota padrão do cliente para o peer do túnel, e então tudo sai pela VPN, é importante também se não me engano habilitar o roteamento de pacotes caso use essa opção. Descomente a linha abaixo se quiser ir por esse caminho:
push "redirect-gateway def1 bypass-dhcp"
A linha abaixo(já falei isso umas 803 vezes) é necessária pois o servidor da google não vai conseguir resolver os nomes internos da rede da VPN e provavelmente nenhum outro servidor além dos servidores internos da rede serão capazes, então, caso você queria acessar os servidores da rede da VPN a partir dos nomes ao invés do IP, essa linha precisa ser descomentada:
push "dhcp-option DNS "
push "dhcp-option DOMAIN "
Descomente as linhas abaixo para diminuir os privilégios do serviço:
user nobody
group nobody
Vamos habilitar o TLS, decomente a linha abaixo:
tls-auth ta.key 0 # This file is secret
Repare que nos comentários ele informa um comando sobre como gerar essa key, é simplesmente copy and paste e você gerou a ta.key, uma outra observação é que esse arquivo tem que estar tanto no servidor como no cliente, eu falei “esse” porque é o mesmo arquivo, sim, ele precisa estar nos dois hosts.
Verifique se a linha abaixo está descomentada, caso esteja comentada, descomente:
cipher AES-256-CBC # AES
Relacionado com manter um registro dos endereços dos hosts conectados, descomente:
ifconfig-pool-persist ipp.txt
A linha abaixo é referente à rotas, no caso, o cliente vai pegar uma rota pra rede interna da VPN, ao invés de ter uma rota referente apenas ao host(peer) da VPN, então, todo pacote pra rede da VPN vai ir pelo peer da VPN, descomente caso seja necessário:
push "route 10.0.0.0 255.255.255.0"
No caso acima, a rede ali é a rede local do servidor, vai adicionar uma rota no cliente para aquela rede. Logo você precisa explicitamente alterar para o prefixo da rede da VPN, caso você não entendeu, você precisa alterar o 10.0.0.0 255.255.255.0 para o endereço de rede e máscara da sua rede respectivamente.
Para ativar a questão de vários clientes com o mesmo certificado, descomente:
duplicate-cn
Os logs, the sysadmin best friend, Descomente:
log openvpn.log
log-append openvpn.log
status openvpn-status.log
Lembre-se de configurar o logrotate para rotacionar esses logs, caso você esqueça e esteja usando um Raspberry que tem 8Gb de armazenamento, você provavelmente pode encontrar seu servidor crashado por ter ocupado todo o espaço em disco. Isso não é válido apenas para raspberrys, já vi servidores com muito disco crasharem por causa de arquivos de log na casa dos gigabytes, encheu a /var/ e crashou o serviço.
Certo, se eu não esqueci de nada, a configuração básica server-side está realizada, claro que, vamos supor que você gere as chaves com um nome diferente da configuração que está definido no server.conf, você precisa alterar caso configure de forma diferente, caso tenha colocado em um diretório diferente do diretório qual está o arquivo .conf, será necessário configurar o path para os certificados/chaves(keys).
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
Ou vamos supor que você queira alterar o range da rede ou o prefixo de rede dela:
server 10.8.0.0 255.255.255.0
Gerando as Chaves
OKAY, levando em consideração que você leu o arquivo de configuração e que eu não tenha esquecido de nada, podemos avançar pra próxima etapa que é a qual onde se vai gerar as chaves, felizmente já temos um utilitário insano de facilitador pra realizar todos os processos de geração de chaves.
Bom, aqui vai funcionar da seguinte forma, vamos copiar o diretório daquele pacote que você instalou ou deveria ter instalado no inicio desse paper, o nome é easy-rsa. O Destino dessa cópia é o diretório default do openvpn qual você já deve imaginar que fica em:
/etc/openvpn
O mais insano disso é que não importa a sua distribuição, vai estar no mesmo lugar, obrigado FHS. ( mas nem sempre, ainda faltam com respeito com a FHS ).
Primeiramente vamos tentar organizar criando um diretório novo para armazenar as chaves, vamos chamar de Keys e colocar dentro do diretório default do openvpn.
mkdir -p /etc/openvpn/easy-rsa/keys
Agora vamos mover os utilitários do easy-rsa para cá e começar a parte relacionada a criptoanarquia geração de chaves..
CENTOS
cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa
DEBIAN
cp -rf /usr/share/easy-rsa/* /etc/openvpn/easy-rsa
Agora que temos tudo pronto, vamos iniciar, mas antes, tem um leve truque que podemos fazer para não ter que ficar digitando os nomes na hora de gerar o certificado, tem um arquivo chamado vars dentro do diretório dos utilitários da easy-rsa que copiamos pra dentro do diretório padrão do openvpn. Lá temos a definição de variáveis, por isso o nome vars, onde podemos definir ela com o contexto qual estamos trabalhando e assim você pode simplesmente hitar a tecla “ENTER”|”NEWLINE” etc.

Editando:
vim /etc/openvpn/easy-rsa/vars
Bom, você não vai encontrar exatamente como na imagem acima porém, você vai precisar editar os prefixos:
KEY_COUNTRY=
KEY_PROVINCE=
KEY_CITY=
KEY_ORG=
KEY_EMAIL=
KEY_OU=
KEY_NAME=
KEY_CN=
Acredito que os campos são auto explicativos, só vou fazer uma observação para os campos KEY_NAME E KEY_CN. O primeiro campo da minha observação é referente ao nome da chave que vai ser gerado, aqui é aonde você define o prefixo da key, logo, se você colocar algo diferente de “server”, você vai ter que alterar o arquivo de configuração do servidor pois ele não vai encontrar a chave pois você definiu um nome diferente E, principalmente na hora de gerar o certificado, na realidade aquilo ali vai ser só o default do campo, caso você simplesmente dê enter. Sobre o segundo campo, na minha imagem eu defini “SRV_VPN”, mas você deve ignorar, eu tinha setado esse hosts no /etc/hosts e atrelado a um IP, nesse campo você precisa colocar um FQDN, canonical name. Etc.
Posteriormente ter configurado o VARS, temos outros detalhes antes de gerar as chaves em si,
cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
O comando acima vai renomear o openssl, para evitar problemas de versão, incompatibilidade, no sentido do script estar desatualizado e chamar o programa errado.
Agora estamos prontos, vamos iniciar carregando as variáveis pra memória:
cd /etc/openvpn/easy-rsa && source ./vars
Eu achei que isso ai resolveria a maioria dos problemas mas eu estava enganado, estava implementando uma VPN seguindo meu próprio paper, porque essa é a ideia desse fucking blog quando encontrei um erro grotesco justamente nesse ponto de imcompatibilidade, então caso você encontre um erro na hora de dar o ./build-ca e ele for parecido com esse abaixo:
error on line 198 of /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
140224783447712:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 198
Vocẽ irá precisar adicionar a linha abaixo no arquivo VARS, na ultima linha mesmo, segue:
export KEY_ALTNAMES="something"
É literalmente “something”, eu também achei estranho mas resolveu.
Não é necessário executar o comando abaixo agora. O Comando abaixo vai limpar as Keys já existentes no /etc/openvpn/Keys:
./clean-all
Repare que você está referenciando relativamente, isso significa que você tem que estar dentro do diretório /etc/openvpn/easy-rsa/.
Criando a Autoridade de Certificação:
./build-ca
Gerando a Chave do servidor, se atente pro nome “server”, esse é o prefiro da chave que vai ser gerado, server.key, tem que ser o mesmo nome que está no conf do servidor.
./build-key-server server
Vamos gerar agora um arquivo de troca de DH(DIFFIE & HELLMAN):
./build-dh
O comando acima pode levar alguns minutos levando em consideração seu desempenho de processamento.
Bom, como nós habilitamos o TLS antes, vamos gerar a dele também:
openvpn --genkey --secret ta.key
Lembrando que esse ta.key tem que ser o mesmo que o cliente vai receber.
OK, vamos COPIAR(COPY|COPIE|KOPIE|KOPIA) tudo pra dentro do raiz do openvpn pois é lá que o daemon busca os arquivos(caso você não tenha definido o path nas declações de onde estão as chaves):
cd /etc/openvpn/easy-rsa/ && cp dh2048.pem ca.crt server.crt server.key ta.key /etc/openvpn
Iniciando o Serviço Server-Side
Iniciando o Serviço do servidor.
systemctl start openvpn@nome_do_arquivo
systemctl status openvpn@server
Se der tudo certo(aka verde), você pode habilitar o serviço para iniciar automaticamente:
systemctl enable openvpn@server
DEBUG SERVER SIDE
O Nome que vem depois do arroba tem que ser explicitamente o nome que você definiu no conf do servidor, caso dê erros para iniciar o serviço, você pode verificar os arquivos de log:
openvpn.log
openvpn-status.log
Ou utilizar o systemd:
systemctl status openvpn@ -l
Ou até mesmo o journal.
journalctl -u openvpn@server
Bom, de qualquer forma, tenha um bom debug, caso o erro tenha sido a algo relacionado a esse paper que eu deixei passar, por favor reporte para eu atualizar a documentação.
CLIENT – SIDE
Vamos gerar então a key do cliente e preparar tudo.
Basicamente, algo que é mais pessoal a mim, eu prefiro gerar tudo no servidor, ai coloco os ceriticados/chaves tudo em um diretório e então puxo pro cliente através do protocolo scp.
Um detalhe, esse paper vai utilizar apenas um certificado para todos os clientes, sei que isso é errado, mas é um ambiente especifico, caso você queria fazer da forma correta, utilize nomes descritivos na hora de gerar cada chave. Vamos continuar:
cd /etc/openvpn/easy-rsa && ./build-key client
O comando acima vai gerar um cliente.key, essa é a nossa chave.
Bom, algo que realmente me complicou foi entender qual chave/certificado era pra ser utilizado o mesmo no cliente e qual não, bom, vou te contar como vai rolar:
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key
/etc/openvpn/easy-rsa/keys/ta.key
Acima segue tudo o que você vai precisar no cliente, note que o que está em vermelho é o que foi criado explicitamente para o cliente, o que não está é devido ao fato que você vai utilizar tanto no servidor como no cliente, no diretório de configuração do Openvpn, então, vamos criar um diretório chamado “client” obviamente e colocar as chaves que o cliente vai utilizar:
mkdir /etc/openvpn/cliente cd /etc/openvpn/easy-rsa/Keys && cp ca.crt ta.key cliente.crt cliente.key /etc/openvpn/client
Agora, não vai funcionar por magia negra, falta o arquivo de configuração do cliente. Lets rollll
Configurando o arquivo do cliente:
Aqui é o seguinte, você tem duas opções, mas antes, nós não definimos se o cliente é Linux ou Windows, mas isso independe, ambos os sistemas você terá que instalar o openvpn, a diferença é que no sistema WINDOWS você instalaria o OpenVPN e joga esse arquivo de configuração lá com a extensão .ovpn, no Linux você precisa utilizar a extensão .conf e usar o systemctl para ativar o daemon, mas, eu vou explicar mais a fundo depois.
Esse é o arquivo de configuração:
client
dev tun
proto udp
remote your_server_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
cipher AES-256-CBC
tls-auth /path/to/ta.key 1
ca /path/to/ca.crt
cert /path/to/client.crt
key /path/to/client.key
ns-cert-type server
O modelo do arquivo de configuração pode ser encontrado no mesmo lugar aonde você encontrou aquele arquivo de configuração do servidor:
CENTOS:
cp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/client.conf /etc/openvpn
DEBIAN:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/cliente
Bom, agora que temos as chaves/certificados e o arquivo de configuração tudo no /etc/openvpn/client, vamos pegar esses arquivos:
scp root@:/etc/openvpn/client/* /etc/openvpn/
INICIANDO O SERVIÇO Client side
:
Em clientes Linux:
systemctl start openvpn@<name>
Depois que funcionar você talvez queira deixar o serviço habilitado onboot, então dê o comando abaixo:
systemctl enable openvpn@onomedoarquivo
Bom, é simples e é basicamente isso. Have a nice Debug Sir.
Utils:
http://wiki.brascloud.com.br:8090/display/PA/Como+instalar+e+configurar+um+servidor+OpenVPN+no+CentOS+7
https://askubuntu.com/questions/612840/adding-route-on-client-using-openvpn
Eu não tenho editores e equipe e tempo, então eu literalmente não reviso meus posts atrás de erros, só quando vou implementar denovo e vejo que errei em algo.
ENjoy
