Instalação da OpenVPN
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
Criação do Link Simbólico e dos diretórios
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.