Instalação da OpenVPN

De Wiki do Ouro Minas Palace Hotel
Revisão de 10h50min de 26 de janeiro de 2019 por 2532252>Jefferson
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Introdução

Este procedimento é baseado na instalação do pacote openvpn-2.2.2 em uma CPU usando Linux e com pelo menos duas placas de rede, uma da rede local e outra ligada à Internet.

Pacotes a serem instalados

Acesse a CPU como root e com o comando abaixo instale os pacotes necessários para a instalação e configuração da VPN

#yum install openvpn-2.2.2* bridge-utils mutt

Configuração do Servidor

Dentro do diretório /etc/openvpn crie o link simbólico com o comando abaixo:

#ln -s /usr/share/doc/openvpn-2.2.2/easy-rsa/2.0 easy-rsa

Criação e edição dos arquivos do diretório bin

Ainda dentro do diretório /etc/openvpn crie agora dois diretórios que devem ser chamados de bin e de chaves_clientes com o seguinte comando:

#mkdir bin chaves_clientes

Copie para o novo diretório bin os arquivos de start e de stop do pacote bridge-utils com os comandos:

#cp -f /usr/share/doc/openvpn-*/sample-scripts/bridge-start bin/
#cp -f /usr/share/doc/openvpn-*/sample-scripts/bridge-stop bin/

Edite, por exemplo com o vi, o arquivo /etc/openvpn/bin/bridge-start

O arquivo original tem a seguinte estrutura originalmente:

#!/bin/sh
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.8.4"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.8.255"
for t in $tap; do
    openvpn --mktun --dev $t
done
brctl addbr $br
brctl addif $br $eth 
for t in $tap; do
    brctl addif $br $t
done 
for t in $tap; do
    ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

e nele as 3 linhas abaixo devem ser alteradas a fim de serem compatibilizadas com a nossa rede.

eth_ip="IP_DO_SERVIDOR_QUE_ESTAMOS_USANDO"
eth_netmask="MASCARA_DA_REDE"
eth_broadcast="ENDERECO_DE_REDE_DA_NOSSA_REDE"

salve o arquivo.


O arquivo /etc/openvpn/bin/mkclient-key

Crie agora o arquivo mkclient-key idêntico ao abaixo:

#!/bin/bash
#
[ $# -ne 1 ] && echo "Uso: $0 nome-cliente" && exit 255
CLIENTE=$1
echo -n "Informe o endereco do servidor: "
read SERVER
OVPNDIR=/etc/openvpn
EASY_RSA=${OVPNDIR}/easy-rsa
cd ${EASY_RSA}
source ./vars
./pkitool $CLIENTE
[ ! -d ${OVPNDIR}/chaves_clientes ] && mkdir ${OVPNDIR}/chaves_clientes
[ -d ${OVPNDIR}/chaves_clientes/${CLIENTE} ] && rm -rf ${OVPNDIR}/chaves_clientes/${CLIENTE}
mkdir ${OVPNDIR}/chaves_clientes/${CLIENTE}
cp keys/ca.crt keys/${CLIENTE}.crt keys/${CLIENTE}.key ${OVPNDIR}/chaves_clientes/${CLIENTE}
cat ${OVPNDIR}/chaves_clientes/cliente.ovpn | \
       sed -e "s/__CLIENT__/${CLIENTE}/g" \
           -e "s/__SERVER__/${SERVER}/g"   >  ${OVPNDIR}/chaves_clientes/${CLIENTE}/${CLIENTE}.ovpn
cd ${OVPNDIR}/chaves_clientes
zip -r ${CLIENTE}.zip ${CLIENTE}
echo -n "Informe o endereco de e-mail para encaminhar a chave: "
read MAIL
echo "Segue a chave para acesso a VPN, qualquer duvida entre em contato com o departamento de suporte" | mutt -a ${CLIENTE}.zip -s "Chave VPN para: ${CLIENTE}" -b $MAIL


O arquivo /etc/openvpn/bin/mkserver-key

Crie agora o arquivo mkserver-key idêntico ao abaixo:


#!/bin/bash
#
SERVER=server
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server $SERVER

O arquivo /etc/openvpn/bin/rmclient-key

Crie agora o arquivo rmclient-key idêntico ao abaixo:

CLIENTE=$1
[ -z $CLIENTE ] && {
                   echo "Uso: rmclient-key nome-da-chave-gerada"
                   exit 255
                  }
[ ! -f /etc/openvpn/easy-rsa/keys/${CLIENTE}.key ] && {
                   echo "Chave para $CLIENTE nao foi localizada"
                   echo "nenhuma acao foi tomada.... saindo...."
                   exit 255
                 }
cd /etc/openvpn/easy-rsa
source vars
./revoke-full ${CLIENTE}
[ ! -d /etc/openvpn/chaves_clientes/revogadas ] && mkdir /etc/openvpn/chaves_clientes/revogadas
[ -f /etc/openvpn/chaves_clientes/${CLIENTE}.zip ] && mv -f  /etc/openvpn/chaves_clientes/${CLIENTE}.zip /etc/openvpn/chaves_clientes/revogadas
[ -d /etc/openvpn/chaves_clientes/${CLIENTE} ]     && mv -f /etc/openvpn/chaves_clientes/${CLIENTE}      /etc/openvpn/chaves_clientes/revogadas


Terminada a edição e após ter salvo o arquivo, deve-se aplicar a ele a permissão de poder ser executado com o comando abaixo, bem como em alguns arquivos sob o diretório /etc/openvpn/easy-rsa/:

#chmod +x /etc/openvpn/bin/*
#chmod +x /etc/openvpn/easy-rsa/clean-all
#chmod +x /etc/openvpn/easy-rsa/build-dh
#chmod +x /etc/openvpn/easy-rsa/pkitool
#chmod +x /etc/openvpn/easy-rsa/whichopensslcnf
#chmod +x /etc/openvpn/easy-rsa/revoke-full


Criação e edição do arquivo do diretório /etc/openvpn/chaves_clientes

Inicialmente, ainda como root, vá para o diretório /etc/openvpn/chaves_clientes

O arquivo /etc/openvpn/chaves_clientes/cliente.ovpn

crie com seu editor de preferência o arquivo denominado cliente.ovpn que tem a estrutura abaixo, mas trocando o XXXX por um valor entre 1024 e 65535, equivalente a uma porta UDP que não esteja sendo utilizada na maquina Linux que esta sendo usada para instalar a VPN. Lembre-se que esta porta tera de ser aberta no Firewall:

client
dev tap
proto udp
remote __SERVER__ XXXX
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca ca.crt
cert __CLIENT__.crt
key __CLIENT__.key


A definição das variáveis da VPN

Devemos editar o arquivos /etc/openvpn/easy-rsa/vars, que originalmente é o abaixo:


# easy-rsa parameter settings
# NOTE: If you installed from an RPM,
# don't edit this file in place in
# /usr/share/openvpn/easy-rsa --
# instead, you should copy the whole
# easy-rsa directory to another location
# (such as /etc/openvpn) so that your
# edits will not be wiped out by a future
# OpenVPN package upgrade.
# This variable should point to
# the top level of the easy-rsa
# tree.
export EASY_RSA="`pwd`"
#
# This variable should point to
# the requested executables
#
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
# Edit this variable to point to
# your soon-to-be-created key
# directory.
#
# WARNING: clean-all will do
# a rm -rf on this directory
# so make sure you define
# it correctly!
export KEY_DIR="$EASY_RSA/keys"
# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
# PKCS11 fixes
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=1024
# In how many days should the root CA key expire?
export CA_EXPIRE=3650
# In how many days should certificates expire?
export KEY_EXPIRE=3650
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_EMAIL=mail@host.domain
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Obs.: Leia atentamente os comentários e mude o que desejar, mas é fundamental as mudanças abaixo nas ultimas linhas iniciadas por EXPORT. O ficaria da seguinte forma (que nada mais não passa de um exemplo):

# easy-rsa parameter settings
# NOTE: If you installed from an RPM,
# don't edit this file in place in
# /usr/share/openvpn/easy-rsa --
# instead, you should copy the whole
# easy-rsa directory to another location
# (such as /etc/openvpn) so that your
# edits will not be wiped out by a future
# OpenVPN package upgrade.
# This variable should point to
# the top level of the easy-rsa
# tree.
export EASY_RSA="`pwd`"
#
# This variable should point to
# the requested executables
#
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
# Edit this variable to point to
# your soon-to-be-created key
# directory.
#
# WARNING: clean-all will do
# a rm -rf on this directory
# so make sure you define
# it correctly!
export KEY_DIR="$EASY_RSA/keys"
# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
# PKCS11 fixes
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=1024
# In how many days should the root CA key expire?
export CA_EXPIRE=3650
# In how many days should certificates expire?
export KEY_EXPIRE=3650
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="BR"
export KEY_PROVINCE="MG"
export KEY_CITY="BeloHorizonte"
export KEY_ORG="Maquine"
export KEY_EMAIL="alarmes@ourominas.com.br"
export PKCS11_PIN=1234


A criação do arquivo /etc/openvpn/server.conf

Crie agora o arquivo server.conf idêntico ao abaixo, onde XXXX tem de ser substituído pela porta definida na seção 3.3.1, bem como as linhas server-bridge, push_route e as push_dhcp-option.


port XXXX
proto udp
dev tap0
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
server-bridge IP_DA_CPU_QUE_INSTALAMOS_O_OPENVPN MASCARA IP_INICIAL_DA_REDE_QUE_SERA_FORNECIDO_AOS_CLIENTES_DA_VPN IP_FINAL_DA_REDE_QUE_SERA_FORNECIDO_AOS_CLIENTES_DA_VPN
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "route END_DE_REDE_DA_REDE_LOCAL MASCARA DEFAULT_ROUTER"
push "route END_DE_REDE_DE_OUTRA_REDE MASCARA ROUTER_DESTA_REDE"
push "route END_DE_REDE_DE_OUTRA_REDE MASCARA ROUTER_DESTA_REDE"
push "dhcp-option DNS IP_DO_SERVIDOR_PRIMARIO_DE_DNS_DA_REDE_LOCAL"
push "dhcp-option DNS IP_DO_SERVIDOR_SECUNDARIO_DE_DNS_DA_REDE_LOCAL"
push "dhcp-option DNS IP_DO_SERVIDOR_TERCEARIO_DE_DNS_DA_REDE_LOCAL"
push "dhcp-option WINS IP_DO_SERVIDOR_WIN_DA_REDE_LOCAL"
push "explicit-exit-notify 3"
keepalive 10 120
comp-lzo
max-clients 100
persist-key
persist-tun
verb 3
status /etc/openvpn/openvpn_stat.log
log-append /var/log/openvpn.log

ATENÇÃO, não esqueça de colocar o arquivo /var/log/openvpn.log dentro do script /etc/logrotage.d/syslog !!!!

A geração do Certificado do Servidor

Finalizada esta configuração já será possível gerar o Certificado do servidor, que usará as informações do arquivo /etc/openvpn/easy-rsa/vars, utilizando o comando abaixo:

#/etc/openvpn/bin/mkserver-key


O start do inicio do processo da inicialização do serviço OPENVPN

Temos de considerar aqui que o Servidor tem instalado também o Firewall SHOREWALL e vamos ainda pressupor que na inicialização do Servidor Linux os serviços do Shorewall e do serviço OPENVPN não estão sendo automaticamente inicializados. Como teremos de inicializar o comando bridge-start antes do serviço openvpn e do shorewall, teremos de usar o arquivo /etc/rc.d/rc.local, onde temos de inserir os tres comandos abaixo, mantendo a ordem abaixo. Não há nenhuma preocupação se tivermos de incluir entre eles algum outro comando. São eles:

#/etc/openvpn/bin/brigge-start
#service openvpn start
#service shorewall start

ATENÇÃO, não esqueça de colocar o arquivo /var/log/openvpn.log dentro do script /etc/logrotage.d/syslog !!!! e de reconfigurar o firewall para reconhecer a nova interface br0 e ter a porta XXXX do protocolo UDP liberada.