Configurando um servidor de openvpn parte 1
OpenVPN é um solução completa de VPN. A mesma utiliza SSL para encriptar o tráfego, possui versões para os mais diversos sistemas, tais como: Linux, Todos os BSDs e derivados (isto inclui o Mac OS X e Solaris), Windows 2000/XP/2K3/Vista/7 e sua licença é GPL.
Uma de suas principais vantagens é que você pode trabalhar com qualquer porta tcp/udp, além de poder utilizá-la através de nat. Sua configuração é simples e intuitiva e não necessita de aplicação de patch no kernel.
Este artigo é baseado em debian, mas caso queira, os procedimentos de configuração se aplicam tanto para linux quanto para os bsd, levando em conta claro parâmentos como interface, usuário, grupo e arquivos de log.
Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:
IP Externo da matriz: 189.47.25.20 Rede interna da Matriz: 192.168.0.0/24 Rede interna da filial: 192.168.1.0/24 Interface da vpn: tun0
A instalação do openvpn é bem simples, quem está acostumado com debian bastar utilizar o apt:
server:~# apt-get install -y openvpn
Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”.
Copie o diretório /usr/share/doc/openvpn/examples/easy-rsa para o seu /root/:
server:~# cp -a /usr/share/doc/openvpn/examples/easy-rsa /root/
Edite o arquivo /root/easy-rsa/vars e altere as variáveis a seu gosto:
export KEY_SIZE=2048 export KEY_COUNTRY=BR export KEY_PROVINCE=SP export KEY_CITY="Sao Paulo" export KEY_ORG="Personal OpenVPN Server" export KEY_ORGNAME="POS" export KEY_EMAIL="but3k4@gmail.com"
Carregue as variáveis no ambiente:
server:~# cd easy-ca server:~/easy-rsa# . ./vars NOTE: when you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys
Obs: é . ./ mesmo.
Rode o comando clean-all:
server:~/easy-rsa# ./clean-all
Gerando os certificados e chaves:
Certificado de autoridade (CA). Você irá verificar que os valores estão pré-estabelecidos, faltando apenas o Organizational Unit Name e Common Name:
server:~/easy-rsa# ./build-ca Generating a 2048 bit RSA private key .................................................+++ ...............................................+++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [BR]: State or Province Name (full name) [SP]: Locality Name (eg, city) [Sao Paulo]: Organization Name (eg, company) [Personal OpenVPN Server]: Organizational Unit Name (eg, section) []:POS Common Name (eg, your name or your server's hostname) []:server Email Address [but3k4@gmail.com]: server:~/easy-rsa#
Chaves e certificados do servidor
server:~/easy-rsa# ./build-key-server server Generating a 2048 bit RSA private key ............................................................................+++ ..............+++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [BR]: State or Province Name (full name) [SP]: Locality Name (eg, city) [Sao Paulo]: Organization Name (eg, company) [Personal OpenVPN Server]: Organizational Unit Name (eg, section) []:POS Common Name (eg, your name or your server's hostname) []:server Email Address [but3k4@gmail.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /root/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName : PRINTABLE:'BR' stateOrProvinceName : PRINTABLE:'SP' localityName : PRINTABLE:'Sao Paulo' organizationName : PRINTABLE:'Personal OpenVPN Server' organizationalUnitName: PRINTABLE:'POS' commonName : PRINTABLE:'server' emailAddress : IA5STRING:'but3k4@gmail.com' Certificate is to be certified until Aug 9 14:41:55 2018 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated server:~/easy-rsa#
Parâmetros Diffie Hellman
Os parâmetros Diffie Hellman são utilizados para a troca encriptada de informações
server:~/easy-rsa# ./build-dh Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ....... e espere pois isso pode demorar ........ server:~/easy-rsa#
Chave compartilhada
Criando uma chave compartilhada para servir de tls:
server:~/easy-rsa# openvpn --genkey --secret keys/shared.key server:~/easy-rsa#
Criando o /etc/openvpn/openvpn.conf:
# /etc/openvpn/openvpn.conf matriz configuration file # diretorio onde esta os arquivos de configuracao / certificados cd /etc/openvpn # porta usada para os clientes conectarem no servidor port 1194 # protocolo usado na conexao proto udp # device usado pelo openvpn dev tun # Habilita conexoes tls # Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn tls-server # arquivo de chave compartilhada usado pelo tls-server # O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls tls-auth keys/shared.key 0 # Certificado de autoridade # Tem que ser o mesmo em todos os hosts # que conectarem a sua vpn ca certs/ca.crt # Certificado e chave privada do servidor # Cada maquina tem que ter seu certificado e chave cert certs/server.crt key keys/server.key # Parametros Diffie-Hellman dh keys/dh2048.pem # Rede usada pelo tunel openvpn server 10.8.0.0 255.255.255.0 # define o arquivo onde sera guardados os ips que os clientes # obtiverem na conexao, assim os mesmos sempre irao pegar os # mesmos ips ifconfig-pool-persist ipp.txt # define o diretorio onde irao ficar as configuracoes individuais para cada # cliente, assim você podera habilitar as duas redes se comunicarem. client-config-dir ccd # Define a rota para a rede da matriz poder enxergar a rede da filial route 192.168.1.0 255.255.255.0 # Define a rota para a rede da filial poder enxergar a rede da matriz push "route-delay 2 600" push "route 192.168.0.0 255.255.255.0" # Aceita os clientes se comunicarem entre si sem a necessidade de um outro tunnel client-to-client # Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz # esta no ar, usado para manter a conexao ativa ping-timer-rem keepalive 10 120 # Tipo de criptografia usada cipher DES-EDE3-CBC # habilita compressão no link VPN comp-lzo # Numero maximo de clientes (filiais) max-clients 10 # usuário e grupo sob o qual o openvpn ira rodar user nobody group nogroup # Permite um restart sem fechar a conexão e re-ler as chaves persist-key persist-tun # Log de status das conexoes status /var/log/openvpn/status.log # define um arquivo de log, pois o default é o /var/log/syslog log /var/log/openvpn/openvpn.log log-append /var/log/openvpn/openvpn.log # Nivel de log # 0 silencioso, exceto para erros fatais # 4 razoavel para uso geral # 5 e 6 podem ajudar a debugar problemas de conexoes # 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba verb 3 # desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia # acima de 20, ele dropa. mute 20
Por hoje acho que está bom, na parte 2 do artigo irei mostrar como configurar o client e fazer os ajustes finais para você ter um servidor openvpn que atenda matriz, filial e clientes remotos pelo Brasil a fora.
Claudio muito bom seu artigo, mas coomo ficaria no caso de uma matriz de 2 filiais, 3 redes distintas.
Elmerson
28 Jul 10 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>
Elmerson, a lógica é igual, crie outro certificado igual fez para a filial1 só que agora com o nome de filial2, depois disto, adicione a rota da filial2, supondo que a rede é 192.168.0.2:
echo “iroute 192.168.2.0 255.255.255.0” > /etc/openvpn/ccd/filial2
Restarte o openvpn e tudo vai estar funcionando.
but3k4
28 Jul 10 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>
Claudio, boa noite, fiz um lab com seu artigo e funciona muito bem a vpn consegui ate resolve nomes pois inicial as estações so respondiam por ip como no meu lab exite um dc coloquei win para registrar as maquinas e funcionou legal.
Bom agora criei um novo problema no meu lab tenho 2 internet um velox e outra o virtua da net, você poderia me indicar como fazer redundancia de link tenho uma maquina com 3 placas de rede 2 conectadas ao serviço banda larga e a outra na rede interna. Desde já agradeço a sua atenção.
Elmerson
23 Sep 10 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>
Olá Elmerson,
Assim possível irei publicar um artigo sobre esta sua dúvida, pois já recebi emails de várias outras pessoas que tem a mesma dificuldade. Recomendo você dar uma lida em iptables mark e tentar utilizar o iproute2 para criar tabelas e assim balancear os links.
Abraços.
but3k4
30 Sep 10 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>
Claudio… só consegui montar com duas ou mais filiais colocando uma PORTA diferente para cada filial. não dá para todas se conectarem apenas no 1194? abraços
Igor
16 Feb 11 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>
Sim dá, segue os mesmos passos para criar uma outra filial mudando apenas os certificados que irá funcionar.
but3k4
16 Feb 11 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>
Amigo criei os route redefilial 255.255.255.0 e a filial acessa a matriz mais não o inverso, a maquina servidor só pinga no ip da vnp não no local, sabes o que pode ser?
bruno
26 Aug 11 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>
Peço que reviste todo o artigo, pois você deve ter esquecido de algum passo. Ajudaria bastante se você me mostrasse o resultado do comando route -n tanto no seu servidor quanto no client.
but3k4
1 Sep 11 at edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>