Servidor OpenVPN para Multiplas Conexões
Autor: Ensina Linux by Fábio Vieira | Publicado: 2012-09-18T12:07:00-03:00

VPN no Linux Ubuntu/Debian com OpenVPN - Multiusuários

Esse é um exemplo totalmente prático para implementação de uma segurança a mais paraqualquer tipo de rede, usando o OpenVPN como uma solução simples, segura e um benefícioa mais para interligação de redes distantes, sendo estas, localizadas na internet.

Quando iniciei meu primeiro projeto de VPN (uns 2 anos atrás), me deparei com algumasferramentas disponíveis para atender tal serviço. Como as coisas sempre aparecem e tem queser executadas de última hora, resolvi sem muito planejamento e estudo utilizar a ferramentaOpenVPN.

Esse artigo tem como objetivo mostrar de forma rápida e simples a configuração de uma VPNbaseada em Linux utilizando o OpenVPN como ferramenta, sendo que este é um softwareestável, simples de configurar, além de ser um projeto que está sempre em desenvolvimento.

Utilizaremos como ferramentas os aplicativos OpenVPN, para gerenciamento da rede virtual, tanto para os Servidores e Cliente, o OpenSSL para gerar os certificados necessários para a nossa segurança e para aqueles que têm um link de internet com IP dinâmico.

Vamos criar uma pasta para realizar o download do aplicativo LZO (biblioteca de compressão de dados).

# mkdir apps

# cd apps


Vamos realizar o download do LZO:

# wget http://www.winlinuxtecnologia.com/downloads/lzo-2.06.tar.gz


Vamos agora descompactar e instalar o LZO:

# tar -zxvf lzo-2.06.tar.gz

# cd lzo-2.06

# ./configure

# make

# make install


Bom instalado o LZO em seu Linux, agora vamos a instalação e configuração do OpenVPN com OpenSSL:

# apt-get install openvpn openssl


Copiar para o diretório /etc/openvpn os scripts do openvpn para facilitar nossas vidas, no Debianencontramos estes scripts no diretório /usr/share/doc/openvpn/examples/easy-rsa/2.0/ copiamos todo oconteúdo deste diretório para /etc/openvpn/easy-rsa/.

# mkdir /etc/openvpn/easy-rsa

# cp -rp /usr/share/doc/openvpn/examples/easy-rsa/2.0/. /etc/openvpn/easy-rsa/


Editamos o arquivo vars, no final deste arquivo alteramos os seguintes campos:

# vi /etc/openvpn/easy-rsa/vars

Para sua empresa podemos utilizar:
export KEY_COUNTRY="SEUPAIS"export KEY_PROVINCE="SEUESTADO"export KEY_CITY="SUACIDADE"export KEY_ORG="Sua Empresa"export KEY_EMAIL="email@dominio.com.br"


Obs.: Por padrão, os certificados criados, são configurados para expirar em 3650 dias, caso queira diminuireste período para algum cliente, antes de gerar as chaves editamos no arquivo vars e alteramos oparâmetro "export KEY_EXPIRE=3650" e no local de 3650 colocamos o valor que acharmos necessário, após essa alteração precisamos executar "source vars" para que sejam carregadas as variáveis editadas no arquivo vars.

Após editarmos o arquivo vars, precisamos carregar as variáveis editas, no diretório /etc/openvpn/easy-rsa/ executamos na linha de comando:

# source vars


Criamos o diretório keys dentro de /etc/openvpn/easy-rsa, onde será criada todos os certificados:

# mkdir /etc/openvpn/easy-rsa/keys


Caso este diretório já exista e você queira apagar todas as informações contidas nele, você pode executar na linha de comando:

# /etc/openvpn/easy-rsa/./clean-all

ATENÇÃO: Este script clean-all só deve ser executado uma vez, a não ser que você queira limpar todas as chaves e certificados criados do servidor e usuários da sua VPN para configurar tudo novamente.

Vamos agora gerar o certificado raiz, no diretório /etc/openvpn/easy-rsa encontramos o script build-ca,executamos:

# /etc/openvpn/easy-rsa/./build-ca


Ele pedirá as seguintes informações:

Generating a 1024 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 certificaterequest.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 blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [SEUPAIS]:State or Province Name (full name) [SEUESTADO]:Locality Name (eg, city) [SUACIDADE]:Organization Name (eg, company) [SUAEMPRESA]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) []:Email Address [email@dominio.com.br]:


Podemos observar que ele sugere em alguns campos as variáveis que editamos no arquivo vars, caso isso não aconteça e porque você esqueceu de executar o comando source vars ou não editou o arquivo vars adicionando suas informações.

Podemos observar que no diretório /etc/openvpn/easy-rsa/keys encontramos os arquivos:&nbsp;
ca.crtca.keyindex.txtserial


Agora geramos o certificado do servidor, muita atenção agora, precisamos executar o script buildkey-server mais um nome qualquer como referência do servidor, este nome será informado quando o scriptperguntar:
# /etc/openvpn/easy-rsa/./build-key-server nomeescolhido

Country Name (2 letter code) [SEUPAIS]:State or Province Name (full name) [SEUESTADO]:Locality Name (eg, city) [SUACIDADE]:Organization Name (eg, company) [SUAEMPRESA]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) [nomeescolhido]: nomeescolhido


Depois você terá a opção de digitar uma senha que será solicitada toda vez que o usuário conectar à VPN, eu deixei em branco:
A challenge password []:


Finalizando o script será perguntado se você quer inscrever este certificado, você pressionará "y" para as duas solicitações:
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y


Da mesma forma que geramos o certificado do servidor agora precisamos gerar o certificado para osusuários da VPN, também precisamos definir um common name para os certificados dos usuários. Para os certificados dos usuários usamos o script build-key:
# /etc/openvpn/easy-rsa/./build-key usuariodavpn

Country Name (2 letter code) [SEUPAIS]:State or Province Name (full name) [SEUESTADO]:Locality Name (eg, city) [SUACIDADE]:Organization Name (eg, company) [SUAEMPRESA]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) []: usuariodavpn&nbsp;
Neste script também serão solicitados os campos:
A challenge password []:Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y


Eu deixei o campo de senha zerado.
Obs.: Toda vez que você precisar gerar um novo certificado é preciso executar o comando source vars no diretório /etc/openvpn/easy-rsa mesmo não tendo alterado as opções do arquivo vars.

ATENÇÃO: Não execute o comando clean-all caso não queira criar todos os certificados novamente.

Para reforçar a segurança e permitir a troca de chaves entre o servidor e os clientes no momento daconexão, executamos o script build-dh sem utilizar parâmetros com o script.

# /etc/openvpn/easy-rsa/./build-dh


Criamos uma assinatura secreta como chave para o servidor executando o comando:&nbsp;
# openvpn --genkey --secret chave.key


Com este comando geramos a chave chave.key no diretório corrente e não no padrão /etc/openvpn/easyrsa/ keys.
Após criada a chave podemos copiá-la para o diretório /etc/openvpn/easy-rsa/keys para manter um padrão de diretórios utilizados.
Por padrão, os scripts executados acima, geram as chaves e certificados necessários para o servidor e o cliente no diretório /etc/openvpn/easy-rsa/keys.


Criamos o arquivo de configuração do servidor no diretório /etc/openvpn/ com o nome padrão server.conf (você pode utilizar o nome que quiser, assim facilita a administração) com os seguintes parâmetros:
# vim /etc/openvpn/server.conf

# ----------------------------------------------------------------------
# PROTOCOLO DE CONEXAO
# ----------------------------------------------------------------------

proto tcp

# ----------------------------------------------------------------------
# PORTA DA VPN
# ----------------------------------------------------------------------

port 1194

# ----------------------------------------------------------------------
# DRIVER DA INTERFACE
# ----------------------------------------------------------------------

dev tun&nbsp;
# ----------------------------------------------------------------------
# ATRIBUI ENDERECOS DE IP DHCP PARA USUARIOS DA VPN
# ----------------------------------------------------------------------
server 192.168.100.0 255.255.255.0

# ----------------------------------------------------------------------
# ADICIONANDO RODAS AOS USUARIO PARA REDE LOCAL
# ----------------------------------------------------------------------
push "route 192.168.0.0 255.255.255.0"push "dhcp-option DNS 192.168.0.1"push "dhcp-option WINS 192.168.0.1"

# ----------------------------------------------------------------------
# CONFIGURACOES ADICIONAIS PARA USUARIO
# ----------------------------------------------------------------------
push "ping 10"push "ping-restart 60"

# ----------------------------------------------------------------------
# ROTAS DO SERVIDOR
# ----------------------------------------------------------------------

route 192.168.100.0 255.255.255.0

# ----------------------------------------------------------------------
# COMPACTACAO LIB LZO
# ----------------------------------------------------------------------

comp-lzokeepalive 10 120float max-clients 10persist-keypersist-tunlog-append /var/log/openvpn.logverb 6&nbsp;
# ----------------------------------------------------------------------
# SERVIDOR TLS
# ----------------------------------------------------------------------

tls-server&nbsp;
# ----------------------------------------------------------------------
# CHAVES NECESSARIAS PARA CONEXAO VPN
# ----------------------------------------------------------------------

dh /etc/openvpn/easy-rsa/keys/dh1024.pemca /etc/openvpn/easy-rsa/keys/ca.crtcert /etc/openvpn/easy-rsa/keys/nomeescolhido.crtkey /etc/openvpn/easy-rsa/keys/nomeescolhido.key

# ----------------------------------------------------------------------
# CHAVE SECRETA PARA ACESSO AO SERVIDOR
# ----------------------------------------------------------------------
tls-auth /etc/openvpn/easy-rsa/keys/chave.keystatus /var/log/openvpn.stats 


Reiniciamos o serviço OpenVPN:
# /etc/init.d/openvpn restart


Dicas de Firewall Iptables:
iptables -t filter -A INPUT -p udp --dport 1194 -j ACCEPTiptables -t filter -A FORWARD -p udp -s 192.168.0.0/24 --dport 1194 -j ACCEPTiptables -t filter -A FORWARD -p udp -d 192.168.0.0/24 --sport 1194 -j ACCEPTiptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 10.0.0.0/24 -j ACCEPTiptables -t nat -A POSTROUTING -d 192.168.0.0/24 -s 10.0.0.0/24 -j ACCEPTiptables -t nat -I POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE


Fique a vontade para restringir os acessos da maneira que convier. As regras apresentadas acima permitirão aos usuários da VPN acesso livre aos sistemas de sua empresa.

Para observar se a porta utilizada no arquivo acima está ativa podemos digitar na linha de comando:&nbsp;
# netstat -nat | grep 1194


O resultado provavelmente será:

tcp 0 0 0.0.0.0:1194 0.0.0.0:*


Se você digitar na linha de comando ifconfig provavelmente terá informações do dispositivo virtualconfigurado no arquivos acima.
# ifconfig

Terá algo do tipo:

tun0Link encap:NAo EspecificadoEndereço de HW 00-00-00-00-00-00-00-00-00-00-00-00-00-00inet end.: 192.168.100.1 P-a-P:102.168.100.2 Masc:255.255.255.255UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metrica:1RX packets:19802 errors:0 dropped:0 overruns:0 frame:0TX packets:19433 errors:0 dropped:0 overruns:0 carrier:0colisÃμes:0 txqueuelen:100RX bytes:4724842 (4.5 MiB) TX bytes:7234934 (6.8 MiB)


Configurando um cliente Windows
Como cliente Windows utilizei o Windows XP, mas já configurei o cliente no Windows 7 e funcionaperfeitamente. Realizar o download do cliente Windows no link:

http://www.winlinuxtecnologia.com/downloads/openvpn-2.1_rc22-install.exe


Instalamos mantendo as opções padrões do sistema, famoso Next, Next, continuar assim mesmo, next e Finish.


No diretório C:\Program Files\OpenVPN\config

Neste diretório criamos um novo diretório keys e copiamos para este diretório criado (keys) as seguintes chaves criadas no Servidor na pasta /etc/openvpn/easy-rsa/keys: dh1024.pem, ca.crt, usuariodavpn.crt, usuariodavpn.key, chave.key.

No diretório C:\Program Files\OpenVPN\config criamos um arquivo chamado cliente.ovpn (a extensão *.ovpn é obrigatória para o cliente Windows), neste arquivo configuramos os parâmetros:

clientdev tunproto tcpremote ensinalinux.sytes.netport 1194pullcomp-lzokeepalive 10 120floattls-clientpersist-tunpersist-keydh keys/dh1024.pemca keys/ca.crtcert keys/usuariodavpn.crtkey keys/usuariodavpn.keytls-auth keys/chave.keyroute-method exeroute-delay 2

OBS.: "ensinalinux.sytes.net" foi usado neste tutorial devido o Servidor VPN não estar em uma rede com IP Fixo (Dedicado), então criamos um No-IP (www.no-ip.com), e realizamos a instalação do mesmo no Servidor. Não entraremos em detalhes neste tutorial de como instalar o No-IP.


Salve o arquivo client.ovpn e fechamos o arquivo criado.
Clicamos em Iniciar &gt; Programas &gt; OpenVPN &gt; e clicamos em OpenVPN GUI, este abrirá próximo ao seu relógio, clique com o botão direito do mouse e em conectar.

Acredito que sua rede privada virtual já esteja funcionando, como dica não utilize a faixa de IP de suaempresa para sua VPN em alguns casos pode dificultar na criação das rotas e para o cliente Windows XP ou Windows 7 o usuário da VPN precisa ser administrador local para criar as rotas de acesso.

Pronto seu Servidor VPN para os usuários externos está criado e configurado corretamente.






Abraços,
Fábio Vieira
System and Network Admin Linux and Windows

E-mail: 
ensinalinux@gmail.com
Website: www.winlinuxtecnologia.com
Tel.: (41) 9893-8701