anúncios

segunda-feira, 12 de janeiro de 2015

Configurando VPN com OpenVPN no Linux

Para quem precisa configurar um servidor VPN para conectar empresa matriz e filial ou do escritório e casa, então você está no lugar certo, nesse post vou apresentar um breve resumo descrevendo sobre a VPN e o software OpenVPN que será utilizado para fazer a configuração na distribuição Linux CentOS 6.6, porém pode ser válido também para RHEL 6.6.

O OpenVPN é um software livre e open-source para criar redes privadas virtuais do tipo ponto-a-ponto ou server-to-multiclient através de túneis criptografados entre computadores. O OpenVPN é capaz de estabelecer conexões diretas entre computadores mesmo que estes estejam atrás de NAT e Firewall sem necessidade de reconfiguração da sua rede. OpenVPN foi escrito por James Yonan e publicado sob licença GNU General Pulic Licence (GPL). O OpenVPN permite autenticação ponto-a-ponto através de chaves secretas compartilhadas, certificados digitais ou autenticação com usuário e senha. Quando utilizado em modo multiclient-server ele permite que cada cliente utilize a autenticação pública com certificados digitais, fazendo isto através de assinaturas digitais e certificados de autoridade. OpenVPN utiliza extensivamente a criptografia OpenSSL. Usa também os protocolos SSLv3/TLSv1. Esta disponível para Solaris, Linux, OpenBSD, FreeBSD, NetBSD, Mac OS X, e Windows 2000/XP/Vista. OpenVPN contém muitos recursos de controle e segurança. Ele não é um cliente VPN baseado em web, não é compatível com IPsec ou qualquer outro tipo de pacote VPN.


Considerações:
Linux (CentOS) como servidor
Linux (Ubuntu) como cliente
Windows 7 Professional como cliente
Chega de papo, vamos a prática.
Segue os passos:
1)Instalar o repositório EPEL para o CentOS 6.X, conforme sua arquitetura.
#rpm -i http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 32bits
#rpm -i http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm64bits
2)Instalar o pacote openvpn.
#yum install openvpn
3)Agora vamos verificar o binário que foi instalado o openvpn.
#which openvpn
/usr/sbin/openvpn

4)Criar as chaves de criptografia utilizando os scripts do próprio OpenVPN.
Fazer download dos scripts do OpenVPN direto no diretório /etc/openvpn via wget. #wget https://github.com/OpenVPN/easy-rsa/releases/download/2.2.2/EasyRSA-2.2.2.tgz
5)Extrair o pacote
#tar -xzvf EasyRSA-2.2.2.tgz
6)Criar o diretório keys
#mkdir keys && chmod +x *
7)Acessar o diretório EasyRSA
#cd EasyRSA
8)Executar como segue:
#source vars
# ./clean-all
9)Confirmar 2 arquivos serial e index.txt no diretório keys
ls -la keys
10)Criar autoridade do certificado
# ./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) [US]:BR
State or Province Name (full name) [CA]:SC
Locality Name (eg, city) [SanFrancisco]:Joinville
Organization Name (eg, company) [Fort-Funston]:SAITAM
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:SAITAM
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:
Name [EasyRSA]:SAITAM
Email Address [me@myhost.mydomain]:

11)Confirmar a existência dos arquivos gerados no diretório keys
ls -la keys
12)Criar a chave privada e depois as chaves clientes
# ./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) [US]:BR
State or Province Name (full name) [CA]:SC
Locality Name (eg, city) [SanFrancisco]:Joinville
Organization Name (eg, company) [Fort-Funston]:SAITAM
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:SAITAM
Common Name (eg, your name or your server's hostname) [server]:
Name [EasyRSA]:SAITAM
Email Address [me@myhost.mydomain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/EasyRSA-2.2.2/openssl-1.0.0.cnf Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'BR'
stateOrProvinceName :PRINTABLE:'SC'
localityName :PRINTABLE:'Joinville'
organizationName :PRINTABLE:'SAITAM'
organizationalUnitName:PRINTABLE:'SAITAM'
commonName :PRINTABLE:'server'
name :PRINTABLE:'SAITAM'
emailAddress :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Jan 8 17:12:29 2025 GMT (3650 days) Sign the certificate? [y/n]: y
13)Criar a chave do cliente01 # ./build-key cliente01
Generating a 2048 bit RSA private key
.................+++ ..................................................................................................+++
writing new private key to 'cliente01.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) [US]:BR
State or Province Name (full name) [CA]:SC
Locality Name (eg, city) [SanFrancisco]:Joinville
Organization Name (eg, company) [Fort-Funston]:SAITAM
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:SAITAM
Common Name (eg, your name or your server's hostname) [cliente01]:
Name [EasyRSA]:SAITAM
Email Address [me@myhost.mydomain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/EasyRSA-2.2.2/openssl-1.0.0.cnf
Check that the request matches the signature Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'BR'
stateOrProvinceName :PRINTABLE:'SC'
localityName :PRINTABLE:'Joinville'
organizationName :PRINTABLE:'SAITAM'
organizationalUnitName:PRINTABLE:'SAITAM'
commonName :PRINTABLE:'cliente01'
name :PRINTABLE:'SAITAM'
emailAddress :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Jan 8 17:17:09 2025 GMT (3650 days) Sign the certificate? [y/n]: y

14)Criar a chave DH (Diffie-Hellman)
# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time
.................................................................+..........+..............................+.....+............................................................................................................................................+...........................................................................................................+..............+...+.........+................................................................................+........................................................++*++*

15)Criar o diretório keys no /etc/openvpn/keys
#mkdir -p /etc/openvpn/keys
16)Copiar as chaves geradas anteriormente para o diretório criado
#cp -R /etc/openvpn/EasyRSA-2.2.2/keys/* /etc/openvpn/keys/
17)Criar o arquivo de configuração do servidor
#vim server.conf #Porta VPN
port 1194
#Prototolo VPN
proto udp
#Interface VPN
dev tun0
#chaves e certificados
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
#Rede clientes VPN (deve ser diferente da LAN)
server 172.16.10.0 255.255.255.0
#ifconfig-pool-persist ipp.txt
#Rota de acesso a LAN (10.0.0.0/24 para os clientes VPN)
push "route 10.0.0.0 255.255.255.0"
route 172.16.10.0 255.255.255.0 # roteamento do cliente VPN
client-to-client
#Permitir que múltiplos clientes se conectem na mesma chave/certificado #duplicate-on
#Monitoriamento da conexão: primeiro ping, segundo restart da vpn em segundos
keepalive 10 120
#compressão de dados
comp-lzo
user nobody
group nobody
#Mantém a chave carregada quando a VPN é reiniciada
#persist-key
#Mantém a interface tun carregada quando a VPN é reiniciada
#persist-tun
#Informações de status de conexao
status /var/log/openvpn/openvpn-status.log
#Arquivo de log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
verb 3
18)Criar o diretório de log do openvpn
# mkdir -p /var/log/openvpn

19)Iniciar o servidor do openvpn
#chkconfig openvpn on
## service openvpn start
Iniciando o openvpn: [ OK ]


Se não apresentou nenhum erro ao iniciar o serviço do OpenVPN, execute #ifconfig para verificar a interface tun foi iniciada.
#ifconfig
eth0 Link encap:Ethernet Endereço de HW 08:00:27:2B:F5:19
inet end.: 10.0.0.103 Bcast:255.255.255.255 Masc:255.255.255.0
endereço inet6: fe80::a00:27ff:fe2b:f519/64 Escopo:Link
UP BROADCASTRUNNING MULTICAST MTU:1500 Métrica:1
RX packets:25249 errors:0 dropped:0 overruns:0 frame:0
TX packets:19705 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:1000
RX bytes:11346462 (10.8 MiB) TX bytes:2651997 (2.5 MiB) IRQ:10 Endereço de E/S:0xd020

lo Link encap:Loopback Local
inet end.: 127.0.0.1 Masc:255.0.0.0
endereço inet6: ::1/128 Escopo:Máquina
UP LOOPBACKRUNNING MTU:65536 Métrica:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:0
RX bytes:480 (480.0 b) TX bytes:480 (480.0 b)

tun0 Link encap:Não Especificado Endereço de HW 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet end.: 172.16.10.1 P-a-P:172.16.10.2 Masc:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Métrica:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)


É necessário habilitar IP forwarding no arquivo /etc/sysctl.conf e trocar 0 por 1 na linha net.ipv4.ip_forward = 1 .
Efetuar o atualização do arquivo com o comando #sysctl -p. Adicionar no script firewall #!/bin/bash
#Encaminhar os pacotes recebidos da interface local para IP do cliente
iptables -t nat -A POSTROUTING -d 10.0.0.0/24 -s 172.16.10.0/24 -j ACCEPT
#Encaminhar os pacotes do IP cliente para interface local
iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -o eth0 -j MASQUERADE


20)Configurar o cliente VPN no Windows
Premissas:
* Fazer o download do OpenVPN e instalar ( https://openvpn.net/index.php/open-source/downloads.html )
* Copiar as chaves e certificados gerados no servidor para o cliente deixando o arquivo cliente.ovpn e arquivos de chaves e certificados no mesmo diretório, que estão no diretório do servidor /etc/openvpn/keys, devem copiar: ca.crt, cliente01.crt, cliente01.key para C:\Program Files\OpenVPN\config no computador cliente Windows 7.
* Criar um arquivo cliente.ovpn no diretório C:\Program Files\OpenVPN\config junto com as chaves e certificados.
cliente.ovpn
client
tls-client
dev tun
proto udp
remote 10.0.0.103 #IP fixo do servidor VPN
remote-random
resolv-retry infinitive
nobind
persist-key
persist-tun
#SSL
ca ca.crt
cert cliente01.crt
key cliente01.key
comp-lzo
pull
tun-mtu 1500
Executar o Gui VPN como Administrador e conectar na VPN do servidor.
Digite no cmd (prompt) do Windows o comando ipconfig para mostrar o IP do cliente VPN atribuído.

21)Configurar o cliente VPN no Linux (Ubuntu)
No terminal execute:
$sudo apt-get update
$sudo apt-get install openvpn
É necessário fazer o procedimento da geração das chaves e certificados da mesma forma que foi feito para o cliente01 para o cliente02, copiar os arquivos ca.crt, cliente02.crt, cliente02.key do servidor para o /etc/openvpn.
Criar o arquivo cliente02.conf client
tls-client
dev tun
proto udp
remote 10.0.0.103 #IP fixo do servidor VPN
remote-random
resolv-retry infinitive
nobind
persist-key
persist-tun
#SSL
ca /etc/openvpn/ca.crt
cert /etc/openvpn/clinte02.crt
key /etc/openvpn/cliente02.key
comp-lzo


Reiniciar o serviço do OpenVPN.
#/etc/init.d/openvpn restart
Verificar se a interface tun0 foi iniciada com comando #ifconfig

Log do Servidor
root@Saitam# tail -f /var/log/openvpn/openvpn.log
Mon Jan 12 16:01:56 2015 10.0.0.102:55858 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Jan 12 16:01:56 2015 10.0.0.102:55858 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Jan 12 16:01:56 2015 10.0.0.102:55858 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 2048 bit RSA
Mon Jan 12 16:01:56 2015 10.0.0.102:55858 [cliente01] Peer Connection Initiated with [AF_INET]10.0.0.102:55858
Mon Jan 12 16:01:56 2015 cliente01/10.0.0.102:55858 MULTI_sva: pool returned IPv4=172.16.10.6, IPv6=(Not enabled)
Mon Jan 12 16:01:56 2015 cliente01/10.0.0.102:55858 MULTI: Learn: 172.16.10.6 -> cliente01/10.0.0.102:55858
Mon Jan 12 16:01:56 2015 cliente01/10.0.0.102:55858 MULTI: primary virtual IP for cliente01/10.0.0.102:55858: 172.16.10.6
Mon Jan 12 16:01:59 2015 cliente01/10.0.0.102:55858 PUSH: Received control message: 'PUSH_REQUEST'
Mon Jan 12 16:01:59 2015 cliente01/10.0.0.102:55858 send_push_reply(): safe_cap=940
Mon Jan 12 16:01:59 2015 cliente01/10.0.0.102:55858 SENT CONTROL [cliente01]: 'PUSH_REPLY,route 10.0.0.0 255.255.255.0,route 172.16.10.0 255.255.255.0,topology net30,ping 10,ping-restart 120,ifconfig 172.16.10.6 172.16.10.5' (status=1)
^C


root@Saitam# tail -f /var/log/openvpn/openvpn-status.log
OpenVPN CLIENT LIST
Updated,Mon Jan 12 16:04:42 2015
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
cliente01,10.0.0.102:55858,9251,7357,Mon Jan 12 16:01:56 2015
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
172.16.10.6,cliente01,10.0.0.102:55858,Mon Jan 12 16:03:31 2015
GLOBAL STATS
Max bcast/mcast queue length,0 END


Referências
[1] Documentação OpenVPN. https://openvpn.net/index.php/open-source/documentation/howto.html
Feito!