Pular para o conteúdo principal

Servidor OpenVPN para Multiplas Conexões

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

Esse é um exemplo totalmente prático para implementação de uma segurança a mais para
qualquer tipo de rede, usando o OpenVPN como uma solução simples, segura e um benefício
a 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 algumas
ferramentas disponíveis para atender tal serviço. Como as coisas sempre aparecem e tem que
ser executadas de última hora, resolvi sem muito planejamento e estudo utilizar a ferramenta
OpenVPN.


Esse artigo tem como objetivo mostrar de forma rápida e simples a configuração de uma VPN
baseada em Linux utilizando o OpenVPN como ferramenta, sendo que este é um software
está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 Debian
encontramos estes scripts no diretório /usr/share/doc/openvpn/examples/easy-rsa/2.0/ copiamos todo o
conteú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 diminuir
este período para algum cliente, antes de gerar as chaves editamos no arquivo vars e alteramos o
parâ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 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) [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:
 

ca.crt
ca.key
index.txt
serial



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 script
perguntar:


# /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 os
usuá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
 

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 da
conexã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:
 

# 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
 

# ----------------------------------------------------------------------
# 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-lzo
keepalive 10 120
float max-clients 10
persist-key
persist-tun
log-append /var/log/openvpn.log
verb 6
 

# ----------------------------------------------------------------------
# SERVIDOR TLS
# ----------------------------------------------------------------------

tls-server
 

# ----------------------------------------------------------------------
# CHAVES NECESSARIAS PARA CONEXAO VPN
# ----------------------------------------------------------------------

dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/nomeescolhido.crt
key /etc/openvpn/easy-rsa/keys/nomeescolhido.key


# ----------------------------------------------------------------------
# CHAVE SECRETA PARA ACESSO AO SERVIDOR
# ----------------------------------------------------------------------
tls-auth /etc/openvpn/easy-rsa/keys/chave.key
status /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 ACCEPT
iptables -t filter -A FORWARD -p udp -s 192.168.0.0/24 --dport 1194 -j ACCEPT
iptables -t filter -A FORWARD -p udp -d 192.168.0.0/24 --sport 1194 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 10.0.0.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.0.0/24 -s 10.0.0.0/24 -j ACCEPT
iptables -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:
 

# 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 virtual
configurado no arquivos acima.


# ifconfig


Terá algo do tipo:

tun0
Link encap:NAo Especificado
Endereço de HW 00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet end.: 192.168.100.1 P-a-P:102.168.100.2 Masc:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metrica:1
RX packets:19802 errors:0 dropped:0 overruns:0 frame:0
TX packets:19433 errors:0 dropped:0 overruns:0 carrier:0
colisÃμes:0 txqueuelen:100
RX 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 funciona
perfeitamente. 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:

client
dev tun
proto tcp
remote ensinalinux.sytes.net
port 1194
pull
comp-lzo
keepalive 10 120
float
tls-client
persist-tun
persist-key
dh keys/dh1024.pem
ca keys/ca.crt
cert keys/usuariodavpn.crt
key keys/usuariodavpn.key
tls-auth keys/chave.key
route-method exe
route-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 > Programas > OpenVPN > 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 sua
empresa 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

Comentários

Postagens mais visitadas deste blog

Trabalhando com Raid via Software no Debian / Ubuntu

Redundant Array of Independent Drives , também denominado Redundant Array of Inexpensive Drives , mais conhecido como simplesmente RAID ou ainda em português: Conjunto Redundante de Discos Independentes ou também Conjunto Redundante de Discos Econômicos ou ainda Arranjo Redundante de Discos Independentes, é um meio de se criar um sub-sistema de armazenamento composto por vários discos individuais, com a finalidade de ganhar segurança e desempenho. Popularmente, RAID seriam dois ou mais discos (por exemplo, HD ou disco rígido) trabalhando simultaneamente para um mesmo fim, por exemplo, citando o exemplo de RAID -1 logo abaixo, serviria como um espelhamento simples, rápido e confiável entre dois discos, para fazer o backup de um disco em outro. Apesar do RAID oferecer segurança e confiabilidade na adição de redundância e evitar falhas dos discos, o RAID não protege contra falhas de energia ou erros de operação. Falhas de energia, código errado de núcleo ou erros o

Códigos de Status do Squid

Boa tarde galera, Muitos trabalham com servidores proxy usando squid e várias vezes temos que analisar os logs de acesso para tentar entender o que está acontecendo. Todos que já viram um log do squid conseguem identificar o site acessado, o usuário ou mesmo se o acesso foi bem sucedido ou não, contudo há alguns códigos que chamam a atenção. Veja um trecho de um log do squid a seguir: 1199263171.923    285 192.168.254.12 TCP_DENIED/403 1503 GET http://www.menshealth.com/media/images/cma/dec04_lust5_200x200.jpg jose NONE/- text/html 1199263176.363    302 192.168.254.15 TCP_MISS/000 0 GET http://www.google.com.br/carlos DIRECT/74.125.47.147 - 1199263176.379      0 192.168.254.15 TCP_DENIED/407 2033 GET http://www.folha.uol.com.br/folha/common.css - NONE/- text/html 1199263176.439     58 192.168.254.15 TCP_IMS_HIT/200 32356 GET http://www.folha.uol.com.br/folha/common.css carlos NONE/- text/css Nesses logs podemos identificar que o usuário “jose” teve seu acesso negado ao site menshealth.