Parametros da rede IP para as redes de Casa e do
Escritório
|
Casa |
Escritório |
|
Sub-rede local (Endereço Privado)
|
10.0.1.0/24 | 10.0.0.0/24 |
Endereço do túnel (Endereço Privado) |
10.1.0.2 | 10.1.0.1 |
Gateway OpenVPN (Endereço Público) |
Cliente DHCP, sendo variável |
1.2.3.4 |
|
Se o seu sistema não tem a biblioteca OpenSSL, você deve fazer o download e instala-la. Se você quer obter os beneficios de compresão no Link VPN, ou quer instalar o OpenVPN com um pacote RPM, você deve instalar a biblioteca LZO. Se você está usando o Linux com o Kernel versão 2.2 ou anterior, você deve instalar o Driver TUN/TAP. Usuários do kernel 2.4.7 ou superior já devem achar o driver junto com seu kernel. Usuários do kernel 2.4.0 até 2.4.6 devem ler aviso no final do arquivo INSTALL. (em inglês) Agora faça o download do ultimo release do
OpenVPN: Instalação do tarballDescompacte a distribuição: gzip -dc openvpn-1.5.0.tar.gz | tar xvf Compile o OpenVPN: cd openvpn-1.5.0 Se você não deseja as funcionalidades da biblioteca LZO, adicione o parametro --disable-lzo ao comando ./configure. Outras opções podem ser ativadas, como o suporte a pthread (./configure --enable-pthread) para diminuir a latencia usando trocas de chaves SSL/TLS dinamicas. O comando ./configure --help irá exibir todas as opções de configuração. Instalação via RPM
|
Configurações a serem feitas uma
unica vez
Se você está usando o kernel 2.4.7 ou superior, as chances
são muito boas que seu kernel já tenha o driver TUN/TAP.
Você pode confirmar isso com o comando
|
| Esta seção assumen que você está usando o kernel 2.4 com um firewall baseado em iptables. Aqui está um exemplo de configuração do firewall que serve NAT para as maquinas na rede interna para o acesso a internet, stateful outgoing connection tracking, e suporte a OpenVPN: |
sample-config-files/firewall.sh |
#!/bin/bash
# Um exemplo de firewall amigavel ao OpenVPN.
# eth0 está conectada à internet.
# eth1 está conectada à rede interna.
# Troque a sub-rede para correponder a sua sub-rede interna.
# Casa irá usar 10.0.1.0/24 e o escritório irá usar 10.0.0.0/24.
PRIVATE=10.0.0.0/24
# Endereço loopback
LOOP=127.0.0.1
# Limpa todas as regras anteriores do iptables
# e bloqueia todo o tráfego temporariamente.
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -F
# Seta as politicas padrão
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
# Impede que pacotes destinados ao endereço loopback sejam recebidos pelas interfaces
iptables -A INPUT -i eth0 -s $LOOP -j DROP
iptables -A FORWARD -i eth0 -s $LOOP -j DROP
iptables -A INPUT -i eth0 -d $LOOP -j DROP
iptables -A FORWARD -i eth0 -d $LOOP -j DROP
# Qualquer coisa vinda da internet deve ter um endereço IP válido
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
# Bloqueia tráfego NetBios de saída (se você tiver maquinas windows
# na rede interna). Isso não impede qualquer tipo de tráfego NetBios
# pelo túnel VPN, mas irá impedir que as maquinas windows
# da rede interna se comuniquem via NetBios pela internet
iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP
# Checa o endereço de origem dos pacotes que irão para a internet
iptables -A FORWARD -s ! $PRIVATE -i eth1 -j DROP
# Permite comunicação via loopback
iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT
# Permite que a maquina responda PINGs (pode ser desativado)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Permite serviços como www e ssh (pode ser desativado)
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
# Permite que pacotes do OpenVPN entrem.
# Duplique a linha a seguir para cada
# cada tunel OpenVPN, trocando a opção --dport
# para a porta usada no tunel.
#
# No OpenVPN o número da porta é
# controlado pela opção --port n.
# Se você colocar essa opção no arquivo de
# configuração, você pode remover o '--'
#
# Se você está usando stateful firewall,
# pode comentar essa linha.
iptables -A INPUT -p udp --dport 5000 -j ACCEPT
# Permite que pacotes vindo de uma interface
# TUN/TAP entrem na rede.
# Quando o OpenVPN é iniciado em modo seguro,
# ele irá autenticar os pacotes antes de
# permitir a sua entrada na interface TUN/TAP.
# interface. Portanto, não é necessario adicionar
# qualquer filtro aqui, a menos que você queira
# restringir o tráfego que pode passar pelo seu túnel.
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT
# Permite pacotes originados da rede local.
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
# Mentar o estado as conexões da maquina local e da rede interna
iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Faz o NAT para a rede local
iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE
|
OpenVPN oferece algumas opções adicionais na configuração do firewall:
|
| O OpenVPN tem 2 tipos de
operação segura, uma baseada em SSL/TLS, usando
certificados e chaves RSA, e outro usando uma chave estática
pré-compartilhada.
Enquanto que as chaves SSL/TLS + RSA são seguramente a
opção mais segura,
as chaves estaticas tem a vantagem de serem muito mais simples. Se
você deseja usar chaves RSA, leia a seguir. Se você deseja
usar chaves estáticas pré-compartilhadas, pule para a
seção Gerando a chave
estática Pré-Compartilhada.
Nós iremos gerar os certificados e chaves RSA usando o comando openssl incluso na biblioteca OpenSSL. Os certificados RSA são chaves publicas que contém vários campos de segurança, como os campos Common Name ou Email Address. O OpenVPN tem a habilidade de fazer alguns testes para melhorar a segurança. Para mais informações, veja a opção --tls-verify na man page do Openvpn. (em inglês) Em nosso exemplo iremos seguir a convenção do apache de usar a extenção .crt para os arquivos de certificados e a extenção .key para os arquivos de chaves privadas. Os arquivos de chaves privadas devem sempre serem mantidas seguras, já os arquivos de chaves privadas, podem ser livremente publicadas e distribuidas. Selecione uma maquina, como a maquina do escritorio, para ser a maquina do gerenciamento de chaves. Primeiro edite o arquivo /usr/share/ssl/openssl.cnf (ele pode estar em um lugar diferente, então use o comando locate openssl.cnf para encontra-lo). Você deve fazer algumas modificações nesse arquivo:
Depois que o arquivo openssl.cnf foi editado, crie o par certificado/chave da sua entidade certificadora: |
openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 3650
|
Isto irá gerar o par certificado/chave-privada da sua entidade certificadora com validade de 10 anos. |
Agora crie o par certificado/chave-privada tanto para Casa quanto para o Escritório:
openssl req -nodes -new -keyout escritorio.key -out escritorio.csr
openssl ca -out escritorio.crt -in escritorio.csr
openssl req -nodes -new -keyout casa.key -out casa.csr
openssl ca -out casa.crt -in casa.csr
|
Agora copie casa.crt, casa.key, e my-ca.crt para a maquina de casa sobre um canal seguro, embora apenas os arquivos .key são realmente considerados não-publicos. Agora crie os parametros Diffie Hellman na maquina
do escritório com o comando openssl dhparam -out dh1024.pem 1024 Aumente o numero de bits de 1024 para 2048 se você também o aumentou no arquivo openssl.cnf. Para os paranoicos, considere omitir a opção -nodes nos comandos openssl acima. Isso irá fazer com que cada chave privada seja criptografada com uma senha, fazendo com que suas chaves fiquem seguras se alguem acessar seu servidor e roube suas chaves. O problema dessa opção, é que você irá ter que digitar uma senha toda vez que você rodar o OpenVPN. Para mais informações, veja a opção --askpass na man page do openvpn. (em inglês) Se você achar o gerenciamento manual de chaves RSA, note que o OpenVPN irá trabalhar com qualquer certificado X509 ou serviço incluindo as Autoridades Certificadoras comerciais como Thawte ou Verisign. Veja também o projeto OpenCA como um exemplo do que está sendo feito no mundo do Código Aberto para mudar essa realidade. O OpenVPN também tem um pequeno conjunto de scripts que podem ser usadados para simplificar O gerenciamento de chaves e certificados RSA (em inglês). |
|
Você deve ter percebido que o modelo de seguraça do OpenVPN em modo SSL/TLS é orientado para os usuarios que irão gerar seu proprio certificado raiz e virar seu próprio CA. No modo SSL/TLS, o OpenVPN autentica a outra ponta checando se o certificado fornecido pela outra ponta é assinado pelo certificado da Autoridade Certificadora, que é expecificado com a opção --ca. Como no modelo de seguraça SSL da web, a segurança do OpenVPN em modo SSL/TLS está baseada na dificuldade de se forjar um certificado raiz.
Esse tipo de autenticação funciona muito bem se você gerou seu próprio certificado raiz, mas é um problema se você usa o certificado raiz de uma Autoridade Certificadora comercial como a Thawte. Se você por exemplo, colocou o certificado raiz da Thawte na opção --ca, qualquer certificado assinado pela Thawte será capaz de se autenticar com a sua ponta OpenVPN -- uma coisa que você certamente não quer. Felizmente existe uma solução para este problema na opção --tls-verify. Essa opção irá permitir a execução de um comando para checar o conteudo do certificado, para selecionar qual certificado é permitido ou não. Veja o script verify-cn do diretorio sample-scripts para um exemplo de como fazer isso. Também consulte a man page na opção --tls-verify. |
|
Em nosso exemplo, nós iremos usar os arquivos de configuração do OpenVPN. O OpenVPN permite que as suas opções de configuração sejam passadas tanto pela linha de comando ou em um ou mais arquivos de configuração. As opções em arquivos de configurção podem omitir o "--" que é necessario para as opções em linha de comando. |
Crie os seguintes arquivos de configuração:
sample-config-files/tls-office.conf |
#
# Exemplo de arquivo de configuração do OpenVPN para o
# escritório usando modo SSL/TLS e certificados/chaves RSA.
#
# '#' ou ';' podem ser usados para delimitar comentarios.
# Usa um device dinamico tun.
# Para Linux Kernel 2.2 ou não linux,
# você deve usar um device numérico
# explicito como "tun1".
# OpenVPN também suporta device ethernet
# "tap" virtual.
dev tun
# 10.1.0.1 é o endereço local final da VPN (escritório).
# 10.1.0.2 é o endereço remoto final da VPN (casa).
ifconfig 10.1.0.1 10.1.0.2
# Esse script irá setar as rotas
# assim que a VPN for ativada.
up ./office.up
# Em uma troca de chaves SSL/TLS, Escritório irá
# assumir a parte do servidor, e a Casa
# irá assumir a parte do cliente.
tls-server
# Parametros Diffie-Hellman (apenas no tls-server)
dh dh1024.pem
# Certificado da Entidade Certificadora
ca my-ca.crt
# Nossa chave publica
cert office.crt
# Nossa chave privada
key office.key
# O OpenVPN usa por padrão a porta 5000 UDP.
# Cada tunel OpenVPN deve usar
# um numero de porta diferente.
# lport ou rport podem ser usados
# para configurar diferentes portas
# para local e remoto.
; port 5000
# Muda o UID e GID para
# "nobody" depois do inicio
# para uma segurança extra.
; user nobody
; group nobody
# Se você compilou o OpenVPN com
# a compactação LZO, descomente a
# linha a seguir.
; comp-lzo
# Envia um ping UDP para a outra ponta
# a cada 15 segundos para manter
# firewalls stateful connection
# ativos. Descomente isso se você usa
# um firewall stateful
; ping 15
# Descomente essa seção para uma detecção mais confiavel de quando
# um sistema perde sua conecxão. Por exemplo para modems, ou notebooks
# que viajam para outros lugares.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key
# Nivel de log.
# 0 -- silencioso, exeto para erros fatais.
# 1 -- quase silencioso, mas mostra erros de rede não fatais.
# 3 -- médio, ideal para uso diário.
# 9 -- barulhento, ideal para procura de erros.
verb 3
sample-config-files/office.up |
#!/bin/bash
route add -net 10.0.1.0 netmask 255.255.255.0 gw $5
sample-config-files/tls-home.conf |
#
# Exemplo de arquivo de configuração do OpenVPN para a
# casa usando modo SSL/TLS e certificados/chaves RSA.
#
# '#' ou ';' podem ser usados para delimitar comentarios.
# Usa um device dinamico tun.
# Para Linux Kernel 2.2 ou não linux,
# você deve usar um device numérico
# explicito como "tun1".
# OpenVPN também suporta device ethernet
# "tap" virtual.
dev tun
# A outra ponta OpenVPN é o gateway do escritório.
remote 1.2.3.4
# 10.1.0.2 é o endereço local final da VPN (casa).
# 10.1.0.1 é o endereço remoto final da VPN (escritório).
ifconfig 10.1.0.2 10.1.0.1
# Esse script irá setar as rotas
# assim que a VPN for ativada.
up ./home.up
# Em uma troca de chaves SSL/TLS, Escritório irá
# assumir a parte do servidor e a Casa
# irá assumir a parte do cliente.
tls-client
# Certificado da Entidade Certificadora
ca my-ca.crt
# Nossa chave publica
cert home.crt
# Nossa chave privada
key home.key
# OpenVPN usa por padrão a porta 5000 UDP.
# Cada tunel OpenVPN deve usar
# um numero de porta diferente.
# lport ou rport podem ser usados
# para configurar diferentes portas
# para local e remoto.
; port 5000
# Muda o UID e GID para
# "nobody" depois do inicio
# para uma segurança extra.
; user nobody
; group nobody
# Se você compilou o OpenVPN com
# a compactação LZO, descomente a
# linha a seguir.
; comp-lzo
# Envia um ping UDP para a outra ponta
# a cada 15 segundos para manter
# firewalls stateful connection
# ativos. Descomente isso se você usa
# um firewall stateful.
; ping 15
# Descomente essa seção para uma detecção mais confiavel de quando
# um sistema perde sua conecxão. Por exemplo para modems, ou notebooks
# que viajam para outros lugares.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key
# Nivel de log.
# 0 -- silencioso, exeto para erros fatais.
# 1 -- quase silencioso, mas mostra erros de rede não fatais.
# 3 -- médio, ideal para uso diário.
# 9 -- barulhento, ideal para procura de erros.
verb 3
sample-config-files/home.up |
#!/bin/bash
route add -net 10.0.0.0 netmask 255.255.255.0 gw $5
|
Em contraste com o gerenciamento de chaves RSA, o
uso de uma chave pré-compartilhada estática tem o
beneficio da simplicidade. Um dos problemas do uso de chave
estática, é que por a chave nunca mudar, tudo o que
passou pela VPN desde que ela foi ativa pode ser descriptografado sem
maiores problemas, criando um furo de segurança muito grande. Gere a chave estática com o seguinte comando: openvpn --genkey --secret static.key A chave estática é formatada em ascii e se parece como isso: -----BEGIN OpenVPN Static key V1----- Uma chave estática do OpenVPN contem
entropia o suficiente tanto para uma chave com uma cifra de 512 bits e
uma chave de 512 bits HMAC para autenticação. Copie static.key para a outra ponta por um canal seguro como scp ou copiar e colar via ssh. |
|
Em nosso exemplo, nós iremos usar os arquivos de configuração do OpenVPN. O OpenVPN permite que as suas opções de configuração sejam passadas tanto pela linha de comando ou em um ou mais arquivos de configuração. As opções em arquivos de configurção podem omitir o "--" que é necessario para as opções em linha de comando. |
Crie os seguintes arquivos de configuração:
sample-config-files/static-office.conf |
#
# Exemplo de arquivo de configuração do OpenVPN para o
# escritório usando modo SSL/TLS e certificados/chaves RSA.
#
# '#' ou ';' podem ser usados para delimitar comentarios.
# Usa um device dinamico tun.
# Para Linux Kernel 2.2 ou não linux,
# você deve usar um device numérico
# explicito como "tun1".
# OpenVPN também suporta device ethernet
# "tap" virtual.
dev tun
# 10.1.0.1 é o endereço local final da VPN (escritório).
# 10.1.0.2 é o endereço remoto final da VPN (casa).
ifconfig 10.1.0.1 10.1.0.2
# Esse script irá setar as rotas
# assim que a VPN for ativada.
up ./office.up
# Nossa chave estática pré-compartilhada
secret static.key
# O OpenVPN usa por padrão a porta 5000 UDP.
# Cada tunel OpenVPN deve usar
# um numero de porta diferente.
# lport ou rport podem ser usados
# para configurar diferentes portas
# para local e remoto.
; port 5000
# Muda o UID e GID para
# "nobody" depois do inicio
# para uma segurança extra.
; user nobody
; group nobody
# Se você compilou o OpenVPN com
# a compactação LZO, descomente a
# linha a seguir.
; comp-lzo
# Envia um ping UDP para a outra ponta
# a cada 15 segundos para manter
# firewalls stateful connection
# ativos. Descomente isso se você usa
# um firewall stateful
; ping 15
# Descomente essa seção para uma detecção mais confiavel de quando
# um sistema perde sua conecxão. Por exemplo para modems, ou notebooks
# que viajam para outros lugares.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key
# Nivel de log.
# 0 -- silencioso, exeto para erros fatais.
# 1 -- quase silencioso, mas mostra erros de rede não fatais.
# 3 -- médio, ideal para uso diário.
# 9 -- barulhento, ideal para procura de erros.
verb 3
sample-config-files/office.up |
#!/bin/bash
route add -net 10.0.1.0 netmask 255.255.255.0 gw $5
sample-config-files/static-home.conf |
#
# Exemplo de arquivo de configuração do OpenVPN para a
# casa usando modo SSL/TLS e certificados/chaves RSA.
#
# '#' ou ';' podem ser usados para delimitar comentarios.
# Usa um device dinamico tun.
# Para Linux Kernel 2.2 ou não linux,
# você deve usar um device numérico
# explicito como "tun1".
# OpenVPN também suporta device ethernet
# "tap" virtual.
dev tun
# A outra ponta OpenVPN é o gateway do escritório.
remote 1.2.3.4
# 10.1.0.2 é o endereço local final da VPN (casa).
# 10.1.0.1 é o endereço remoto final da VPN (escritório).
ifconfig 10.1.0.2 10.1.0.1
# Esse script irá setar as rotas
# assim que a VPN for ativada.
up ./home.up
# Nossa chave estática pré-compartilhada
secret static.key
# O OpenVPN usa por padrão a porta 5000 UDP.
# Cada tunel OpenVPN deve usar
# um numero de porta diferente.
# lport ou rport podem ser usados
# para configurar diferentes portas
# para local e remoto.
; port 5000
# Muda o UID e GID para
# "nobody" depois do inicio
# para uma segurança extra.
; user nobody
; group nobody
# Se você compilou o OpenVPN com
# a compactação LZO, descomente a
# linha a seguir.
; comp-lzo
# Envia um ping UDP para a outra ponta
# a cada 15 segundos para manter
# firewalls stateful connection
# ativos. Descomente isso se você usa
# um firewall stateful
; ping 15
# Descomente essa seção para uma detecção mais confiavel de quando
# um sistema perde sua conecxão. Por exemplo para modems, ou notebooks
# que viajam para outros lugares.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key
# Nivel de log.
# 0 -- silencioso, exeto para erros fatais.
# 1 -- quase silencioso, mas mostra erros de rede não fatais.
# 3 -- médio, ideal para uso diário.
# 9 -- barulhento, ideal para procura de erros.
verb 3
sample-config-files/home.up |
#!/bin/bash
route add -net 10.0.0.0 netmask 255.255.255.0 gw $5
|
No gateway de Casa, inicie a VPN com o comando: openvpn --config tls-home.conf No escritorio, inicie a VPN com o comando: openvpn --config tls-office.conf |
|
No gateway de Casa, inicie a VPN com o comando: openvpn --config static-home.conf No Escritorio, inicie a VPN com o comando: openvpn --config static-office.conf |
|
No gateway de Casa, teste a VPN pingando o Escritorio via VPN: ping 10.1.0.1 No escritorio, teste a VPN pingado o gateway de casa via VPN: ping 10.1.0.2 Se esses testes falarem silenciosamente, talvez você queira re-editar os arquivos de configura e aumentar o nivel de log para 8, que irá produzir informações muito mais detalhadas. Também consulte o FAQ para mais informações na resolução de problemas. Se esses testes tiverem sucesso, agora tente pingar pelo tunel, usando as maquinas dentro das redes internas, para testar o roteamento. Basicamente qualquer maquina na sub-rede 10.0.1.0/24 deve ser capaz de se comunicar com qualquer maquina na sub-rede 10.0.0.0/24, e vice e versa. Se isso funcionar, parabéns! Se não, você pode querer checar os arquivos da mail list do OpenVPN e ver se alguem mais tem um problema similar ao seu. Se você não achar uma solução para seu problema aqui, considere posta-lo na lista openvpn-users list. |
|
Em nosso exemplo acima, o gateway de casa tem um endereço IP dinamico que pode mudar sem qualquer aviso. Se você usa o dhcpcd como seu cliente dhcp, é facil contruir um script que pode ser executado qualquer hora que o endereço IP mudar. O script ficaria em algum lugar como /etc/dhcpc/dhcpcd-eth0.exe. Basicamente, você deve adicionar uma linha neste script que iria mandar um sinal SIGUSR1 ou SIGHUP para o daemon OpenVPN. Seria algo como: killall -HUP openvpn Quando o OpenVPN recebe este sinal, ele irá fechar e re-abrir a conecxão de rede com a outra ponta, usando o novo endereço IP designado pelo servidor DHCP. Você também deve usar a
opção --float se você está
conectando a uma ponta que está sucetivel a mudanças de
IP pelo servidor DHCP. Também é possivel trabalhar com trocas de IP com o sinal SIGUSR1 que é como o sinal SIGHUP exeto que ele oferece um controle melhor dos sub-sistemas do OpenVPN que ele reseta. O sinal SIGUSR1 também pode ser gerado internamente baseado nas opções --ping e --ping-restart. A opção --persist-tun permite um reset sem fechar e abrir o device TUN (que permite que conexões via vpn não se percam, mesmo durante uma troca de IP). A opção --persist-remote-ip permite a preservação do endereço IP remoto, mesmo durante uma troca de IP. Isso permite que ambas as pontas da VPN sejam clientes DHCP. A opção --persist-key não re-lê as chaves durante o restart (o que permite ao daemon OpenVPN ser reiniciado mesmo se seus privilégios forem diminuidos com --user ou --group). Para mais informações sobre como usar o OpenVPN em um endereço dinamico, veja o FAQ. OpenVPN também pode ser uando em casos onde ambas as pontas da VPN são dinamicas. |
|
Primeiro crie um diretório para armazenar as chaves e arquivos de coniguração do OpenVPN, como /etc/openvpn. Decida se você vai usar o OpenVPN no modo TLS ou chave estática, e copie os arquivos .conf, .up, .key, .pem, e .crt apropriados para o diretório /etc/openvpn. Proteja seus arquivos .key: chmod go-rwx /etc/openvpn/*.key Se você está usando Linux com iptables, edite o arquivo de configuração do firewall, firewall.sh, fazendo as alterações apropriadas para seu sistema e o copie para o diretório /etc/openvpn. |
Crie um script de inicialização que se pareça com isso:
sample-config-files/openvpn-startup.sh |
#!/bin/bash
# Um exemplo de script de inicialição
# do OpenVPN para Linux.
# Diretorio de configurações do OpenVPN
dir=/etc/openvpn
# Carrega o firewall
$dir/firewall.sh
# Carrega o modulo TUN/TAP
modprobe tun
# ativa o roteamento de pacotes
echo 1 > /proc/sys/net/ipv4/ip_forward
# Chama o openvpn para cada tunel VPN
# em modo daemon. Você também pode remover
# a opção "--daemon" da linha de comando
# e adicionar a opção "daemon" ao arquivo
# de configuração.
#
# Cada tunel deve rodar em uma porta UDP
# separada. Use a opção "port" para controlar
# isso. Como todas as opções do OpenVPN, você
# pode especificar "--port 8000" na linha de
# comando, ou "port 8000" no arquivo de configuração.
openvpn --cd $dir --daemon --config vpn1.conf
openvpn --cd $dir --daemon --config vpn2.conf
openvpn --cd $dir --daemon --config vpn2.conf
E crie um script de desligamento como esse:
sample-config-files/openvpn-shutdown.sh |
#!/bin/bash
# para com todos os processos do OpenVPN
killall -TERM openvpn
|
Finalmente, adicione chamadas para openvpn-startup.sh e openvpn-shutdown.sh para os scripts de inicio e desligamento de seu sistema, ou no diretório /etc/init.d. |
|
Aqui está um examplo de um script do /etc/init.d que irá automaticamente iniciar um processo do OpenVPN para cada arquivo .conf que for encontrado no diretório /etc/openvpn. Esse script é instalado por padrão
quando você instala o OpenVPN via um pacote RPM. (N.T: Devido a
problemas com quebra de linha, é recomendavel que você
copie esse script da distribuição do OpenVPN) |
sample-scripts/openvpn.init |
#!/bin/sh
#
# openvpn Este shell script cuida do inicio e finalização
# do openvpn no RedHat ou em outro sistema baseado
# no chkconfig.
#
# chkconfig: 345 80 30
#
# description: OpenVPN é um programa robusto e flexivel para tunelamento que
# usa toda as funcionalidades de encriptação, autenticação e certificação
# que a biblioteca OpenSSL fornece, para tunelar seguramente redes IP atraves
# de uma simples porta UDP.
#
# Contribuido para o projeto OpenVPN por
# Douglas Keller <doug@voidstar.dyndns.org>
# 2002.05.15
# Para instalar:
# copie este arquivo para /etc/rc.d/init.d/openvpn
# shell> chkconfig --add openvpn
# shell> mkdir /etc/openvpn
# crie .conf ou .sh files em /etc/openvpn (veja abaixo)
# Para desinstalar:
# execute: chkconfig --del openvpn
# Notas do autor:
#
# Eu criei um init script em /etc/init.d e alterei o openvpn.spec para automaticamente
# registrar o script. Uma vez que o RPM está instalado você pode iniciar e parar
# o OpenVPN com "service openvpn start" e "service openvpn stop".
#
# Esse init script faz o seguinte:
#
# - Inicia um processo OpenVPN para cada arquivo .conf que ele encontra em /etc/openvpn
#
# - Se /etc/openvpn/xxx.sh existe para um arquivo xxx.conf então ele o executa
# antes de iniciar o OpenVPN (util para fazer openvpn --mktun...).
#
# - Alem de start/stop você também pode:
#
# service openvpn reload - SIGHUP
# service openvpn reopen - SIGUSR1
# service openvpn status - SIGUSR2
# Modificações 2003.05.02
# * Alterado '==' para '=' para compatibilidade com sh (Bishop Clark).
# * Se condrestart|reload|reopen|status, checa se já não está iniciado (James Yonan).
# * Adicionado lock, piddir, e work variaveis (James Yonan).
# * Se o start é tentado 2 vezes, sem a intervenção de um stop, ou
# se start é tentado quando o start anterior não foi bem sucessedido
# ele mata qualquer outro processo antes de começar uma nova operação (James Yonan).
# * Faz um trabalho melhor de detecção de erros no start, retornando sucesso ou falha (James Yonan).
# Localização do binário do OpenVPN
openvpn="/usr/sbin/openvpn"
# Arquivo de trava
lock="/var/lock/subsys/openvpn"
# Diretorio de PID
piddir="/var/run/openvpn"
# Diretório de trabalho
work=/etc/openvpn
# Código da biblioteca de função.
. /etc/rc.d/init.d/functions
# Código da configuração de rede.
. /etc/sysconfig/network
# Checa se a rede está ativa.
[ ${NETWORKING} = "no" ] && exit 0
[ -f $openvpn ] || exit 0
# Ve como nós fomos chamados.
case "$1" in
start)
echo -n $"Starting openvpn: "
/sbin/modprobe tun >/dev/null 2>&1
# A partir de uma perspectiva segura, eu acho que faz
# sentido remover isso, e forçar os usuarios que precisam disso
# a ativar explicitamente em seus scripts --up ou nas configurações
# de firewall.
#echo 1 > /proc/sys/net/ipv4/ip_forward
if [ ! -d $piddir ]; then
mkdir $piddir
fi
if [ -f $lock ]; then
# nós não fomos desligados corretamente
for pidf in /bin/ls $piddir/*.pid 2>/dev/null; do
if [ -s $pidf ]; then
kill at $pidf >/dev/null 2>&1
fi
rm -f $pidf
done
rm -f $lock
sleep 2
fi
rm -f $piddir/*.pid
cd $work
# Inicia cada .conf em $work e executa .sh se existe
errors=0
successes=0
for c in /bin/ls *.conf 2>/dev/null; do
bn=${c%%.conf}
if [ -f "$bn.sh" ]; then
. $bn.sh
fi
rm -f $piddir/$bn.pid
$openvpn --daemon --writepid $piddir/$bn.pid --config $c --cd $work
if [ $? = 0 ]; then
successes=1
else
errors=1
fi
done
if [ $errors = 1 ]; then
failure; echo
else
success; echo
fi
if [ $successes = 1 ]; then
touch $lock
fi
;;
stop)
echo -n $"Shutting down openvpn: "
for pidf in /bin/ls $piddir/*.pid 2>/dev/null; do
if [ -s $pidf ]; then
kill at $pidf >/dev/null 2>&1
fi
rm -f $pidf
done
success; echo
rm -f $lock
;;
restart)
$0 stop
sleep 2
$0 start
;;
reload)
if [ -f $lock ]; then
for pidf in /bin/ls $piddir/*.pid 2>/dev/null; do
if [ -s $pidf ]; then
kill -HUP at $pidf >/dev/null 2>&1
fi
done
else
echo "openvpn: service not started"
exit 1
fi
;;
reopen)
if [ -f $lock ]; then
for pidf in /bin/ls $piddir/*.pid 2>/dev/null; do
if [ -s $pidf ]; then
kill -USR1 at $pidf >/dev/null 2>&1
fi
done
else
echo "openvpn: service not started"
exit 1
fi
;;
condrestart)
if [ -f $lock ]; then
$0 stop
# avoid race
sleep 2
$0 start
fi
;;
status)
if [ -f $lock ]; then
for pidf in /bin/ls $piddir/*.pid 2>/dev/null; do
if [ -s $pidf ]; then
kill -USR2 at $pidf >/dev/null 2>&1
fi
done
echo "Status written to /var/log/messages"
else
echo "openvpn: service not started"
exit 1
fi
;;
*)
echo "Usage: openvpn
{start|stop|restart|condrestart|reload|reopen|status}"
exit 1
esac
exit 0
|
O serviço xinetd pode ser usado para iniciar automaticamente o daemon do OpenVPN, assim que ele receber um datagrama UDP de uma ponta remota. Essa configuração do xinetd irá fazer com que o xinetd escute a porta 5000 UDP esperando pelo primeiro datagrama de uma nova conexão OpenVPN (usando uma chave pré-compartilhada), quando então ele irá chamar o daemon do OpenVPN que irá conduzir a conexão. Note que o uso da chave --inactive irá fazer com que o daemon OpenVPN se desligue após 10 minutos de tempo inativo. Depois que o daemon OpenVPN se desligue por qualquer motivo, o serviço xinted irá escutar novamente a porta esperando pelo primeiro datagrama de uma nova conexão. Também note que o xinetd irá iniciar o daemon OpenVPN com privilégios de root, mas o OpenVPN irá (após ler os arquivos de chaves protegidos) descartar esses privilégios usando o usuario nobody. O arquivo com a chave pode ser gerado com o seguinte comando: openvpn --genkey --secret key Note que cada túnel OpenVPN precisa rodar em um número de porta diferente, e precisa do seu próprio arquivo de configuração xinetd. Isso é necessario pois o OpenVPN precisa de informações especificas de cada nova conexão VPN em pontencial, incluindo chaves, interfaces TUN/TAP, endereços IP e informação de roteamento. Nesse momento no desenvolvimento do OpenVPN, ele ainda não é capaz de trabalhar com algum tipo de perfil de conexão que permitiria um simples arquivo de configução com varios clientes em pontencial. Como o OpenVPN é implementado via UDP, ele não pode levar vantagem da estrutura disponivel para criar um novo processo a cada nova conexão, como os disponiveis para servidores TCP, que escutam em uma porta fixa e depois trocam para outra porta dinamicamente. Entretanto essa funcionalidade será implantada quando houver interesse e suporte o suficiente da comunidade de desenvolvedores e de usuários. |
sample-config-files/xinetd-server-config |
# Um arquivo de configuração do xinetd para o OpenVPN.
#
# Esse arquivo deve ser renomeado para openvpn ou algo igualmente
# descritivo e copiar ele para o diretório /etc/xinetd.d.
# xinetd deve ser informado desse arquivo sendo reiniciado
# ou enviando a ele um sinal SIGHUP.
#
# Para cada cliente em potencial, você deve criar uma cópia desse
# arquivo de configuração em uma porta diferente. Também note que
# cada arquivo de chave e endereços IP devem ser únicos para cada
# cliente. Essa configuração assume que o executavel e as chaves do
# OpenVPN estão em /root/openvpn. Mude isso para a sua realidade.
service openvpn_1
{
type = UNLISTED
port = 5000
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /root/openvpn/openvpn
server_args = --inetd --dev tun --ifconfig 10.4.0.2 10.4.0.1
--secret /root/openvpn/key --inactive 600 --user nobody
}
sample-config-files/xinetd-client-config |
# Esse arquivo de configuração
# é a parte cliente do
# xinetd-server-config
dev tun
ifconfig 10.4.0.1 10.4.0.2
remote my-server
port 5000
user nobody
secret /root/openvpn/key
inactive 600