Instalando e Configurando o OpenVPN no Debian Wheezy
Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:
- IP Externo da matriz: 200.200.200.1 IP Externo da filial: 200.200.200.2
- Rede interna da Matriz: 192.168.10.0/24
- Rede interna da filial: 192.168.11.0/24
- Rede da vpn 10.254.0.0/24
- Interface da vpn: tun0
- Liberar o roteamento caso precise acessar outra maquina fora as pontas da vpn echo 1 > /proc/sys/net/ipv4/ip_forward
- Não esquecer de mascarar as redes se necessário. iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE
Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialwheezy_en para que não falte nenhum pacote ou configuração.
Matriz
Vamos instalar o openvpn na Matriz primeiramente.
Vamos fazer um update dos repositórios e um upgrade do sistema e depois instalar o nosso openvpn.
aptitude update && aptitude dist-upgrade -y && aptitude install openvpn -yVamos copiar alguns arquivo que precisamos para o /etc/openvpn
cp -Rfa /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsaAgora vamos editar o arquivo /etc/openvpn/easy-rsa/vars que contem as variáveis globais que vamos utilizar para todas as chaves.
vim /etc/openvpn/easy-rsa/vars [...] export KEY_SIZE=2048 # 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="PR" export KEY_CITY="Curitiba" export KEY_ORG="Douglas" export KEY_EMAIL="douglas.q.santos@gmail.com"Agora temos que carregar as variáveis no ambiente
cd /etc/openvpn/easy-rsa . ./vars ./clean-allAgora vamos gerar os certificados e chaves
Certificado de autoridade (CA). Você irá verificar que os valores estão pré-estabelecidos, faltando apenas o Organizational Unit Name e Common Name
./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) [BR]: ENTER State or Province Name (full name) [PR]: ENTER Locality Name (eg, city) [Curitiba]: ENTER Organization Name (eg, company) [CONFIANCEIT]: ENTER Organizational Unit Name (eg, section) []:douglas Common Name (eg, your name or your server's hostname) [douglas]:server Name []:server Email Address [douglas.q.santos@gmail.com]: ENTER
Vamos agora gerar as chaves e os certificados do servidor
./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) [BR]: ENTER State or Province Name (full name) [PR]: ENTER Locality Name (eg, city) [Curitiba]: ENTER Organization Name (eg, company) [Douglas]: ENTER Organizational Unit Name (eg, section) []:Douglas Common Name (eg, your name or your server's hostname) [server]: ENTER Name []:server Email Address [douglas.q.santos@gmail.com]: ENTER Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: ENTER An optional company name []:Douglas Using configuration from /etc/openvpn/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'BR' stateOrProvinceName :PRINTABLE:'PR' localityName :PRINTABLE:'Curitiba' organizationName :PRINTABLE:'Douglas' organizationalUnitName:PRINTABLE:'Douglas' commonName :PRINTABLE:'server' name :PRINTABLE:'server' emailAddress :IA5STRING:'douglas.q.santos@gmail.com' Certificate is to be certified until Dec 6 11:56:33 2021 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base UpdatedParâmetros Diffie Hellman são utilizados para a troca encriptada de informações
./build-dh Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ...+.................+................................................................................................................................... .+..................+.................................................................................................................................... ...........................................................+.............................................+...................................+........... ......................+.....................................................+..........+................................................................ ...........................................+............................................................................................................... ...................+....................................................................................................................................... ................................................................................................................+...............+......................... .............+................+....+..................................+........................................................................+....... ...........................+.................................................................+.........................................+................ .........................................................................................................................................+................ .....................+...................+............................................................................................................... .............................................................................+...+....................................................................... ..........................................................................+.....................................+............+.......................... ............................................................................................+...........................++*++*
Agora vamos criar uma chave compartilhada.
Criando uma chave compartilhada para servir de tls.
openvpn --genkey --secret keys/shared.key
Arquivo de configuração da matriz arquivo /etc/openvpn/server.conf
vim /etc/openvpn/server.conf # porta usada para os clientes conectarem no servidor port 1194 # protocolo usado na conexao proto tcp #Melhorar aplicações remotas mssfix 1400 # device usado pelo openvpn dev tun # Habilita conexoes tls # Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn tls-server # arquivo de chave compartilhada usado pelo tls-server # O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls tls-auth keys/shared.key 0 # Certificado de autoridade # Tem que ser o mesmo em todos os hosts # que conectarem a sua vpn ca certs/ca.crt # Certificado e chave privada do servidor # Cada maquina tem que ter seu certificado e chave cert certs/server.crt key keys/server.key # Parametros Diffie-Hellman dh keys/dh2048.pem # Rede usada pelo tunel openvpn server 10.254.0.0 255.255.255.0 # define o arquivo onde sera guardados os ips que os clientes # obtiverem na conexao, assim os mesmos sempre irao pegar os # mesmos ips ifconfig-pool-persist ipp.txt # define o diretorio onde irao ficar as configuracoes individuais para cada # cliente, assim você podera habilitar as duas redes se comunicarem. client-config-dir ccd # Define a rota para a rede da matriz poder enxergar a rede da filial route 192.168.11.0 255.255.255.0 # Define a rota para a rede da filial poder enxergar a rede da matriz push "route-delay 2 600" push "route 192.168.10.0 255.255.255.0" # Redireciona todo o trafego pela vpn utilizando a vpn como default gw do cliente #push "redirect-gateway def1" # Podemos definir quais servidor dns e qual servidor wins o cliente vai ter que utilizar #push "dhcp-option DNS 192.168.10.248" #push "dhcp-option DNS 192.168.10.249" #push "dhcp-option WINS 192.168.10.248" # Aceita os clientes se comunicarem entre si sem a necessidade de um outro tunnel client-to-client # Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz # esta no ar, usado para manter a conexao ativa ping-timer-rem keepalive 10 120 # Tipo de criptografia usada cipher DES-EDE3-CBC # habilita compressão no link VPN comp-lzo # Numero maximo de clientes (filiais) max-clients 10 # usuário e grupo sob o qual o openvpn ira rodar user nobody group nogroup # Permite um restart sem fechar a conexão e re-ler as chaves persist-key persist-tun # Log de status das conexoes status /var/log/openvpn/status.log # define um arquivo de log, pois o default é o /var/log/syslog log /var/log/openvpn/openvpn.log log-append /var/log/openvpn/openvpn.log # Nivel de log # 0 silencioso, exceto para erros fatais # 4 razoavel para uso geral # 5 e 6 podem ajudar a debugar problemas de conexoes # 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba verb 3 # desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia # acima de 20, ele dropa. mute 20
Agora vamos configurar as chaves e certificados para a nossa filial
cd /etc/openvpn/easy-rsa ./build-key filial1 Generating a 2048 bit RSA private key .........................................................................................+++ .............................................................................................+++ writing new private key to 'filial1.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) [BR]: ENTER State or Province Name (full name) [PR]: ENTER Locality Name (eg, city) [Curitiba]: ENTER Organization Name (eg, company) [Douglas]: ENTER Organizational Unit Name (eg, section) []:Douglas Common Name (eg, your name or your server's hostname) [filial1]: ENTER Name []:filial1 Email Address [douglas.q.santos@gmail.com]: ENTER Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: ENTER An optional company name []:filial1 Using configuration from /etc/openvpn/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'BR' stateOrProvinceName :PRINTABLE:'PR' localityName :PRINTABLE:'Curitiba' organizationName :PRINTABLE:'Douglas' organizationalUnitName:PRINTABLE:'Douglas' commonName :PRINTABLE:'filial1' name :PRINTABLE:'filial1' emailAddress :IA5STRING:'douglas.q.santos@gmail.com' Certificate is to be certified until Dec 6 12:08:46 2021 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Vamos criar alguns diretórios que são necessários e copiar alguns arquivos.
mkdir /etc/openvpn/{certs,ccd,keys} cp /etc/openvpn/easy-rsa/keys/*.crt /etc/openvpn/certs/ cp /etc/openvpn/easy-rsa/keys/*.key /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn/keys/
Agora vamos criar o arquivo de rotas
O arquivo /etc/openvpn/ccd/filial1 é responsável por definir rotas individuais para os clientes, ou seja, sem ele, o servidor não vai saber que as maquinas de ambos os lados querem se comunicar e com isso a comunicação fica restrita apenas aos servidores.
echo "iroute 192.168.11.0 255.255.255.0" > /etc/openvpn/ccd/filial1
Agora vamos ajustar as permissões de arquivos e diretórios
cd /etc/openvpn chown -R nobody:nogroup keys certs ccd chmod 0400 keys/* certs/* ccd/*Criando o diretório de log
Precisamos criar o diretório de log, pois nossa configuração salva estas informações em arquivos específicos.
mkdir /var/log/openvpnVamos iniciar o nosso servidor openvpn
/etc/init.d/openvpn restart Stopping virtual private network daemon:. Starting virtual private network daemon: server.Agora vamos analisar os logs.
tail -f /var/log/openvpn/openvpn.log Fri Dec 6 09:14:26 2011 /sbin/route add -net 10.254.0.0 netmask 255.255.255.0 gw 10.254.0.2 Fri Dec 6 09:14:26 2011 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ] Fri Dec 6 09:14:26 2011 GID set to nogroup Fri Dec 6 09:14:26 2011 UID set to nobody Fri Dec 6 09:14:26 2011 TCPv4 link local (bound): [undef] Fri Dec 6 09:14:26 2011 TCPv4 link remote: [undef] Fri Dec 6 09:14:26 2011 MULTI: multi_init called, r=256 v=256 Fri Dec 6 09:14:26 2011 IFCONFIG POOL: base=10.254.0.4 size=62 Fri Dec 6 09:14:26 2011 IFCONFIG POOL LIST Fri Dec 6 09:14:26 2011 Initialization Sequence Completed
O Lado servidor já está ok.
Agora vamos configurar o lado da filial1, ainda no servidor, pois vamos mover as configurações para a filial via scp ou rsync.
cd /etc/openvpn mkdir -p filial1/{certs,keys} cp certs/{ca.crt,filial1.crt} filial1/certs/ cp keys/{filial1.key,shared.key} filial1/keys/
Agora vamos criar o arquivo de configuração da filial /etc/openvpn/filial1/filial1.conf
vim /etc/openvpn/filial1/filial1.conf # Especifica que este certificado eh de um cliente client # Define o ip do servidor para o cliente conectar remote 200.200.200.1 # porta usada para os clientes conectarem no servidor port 1194 # protocolo usado na conexao proto tcp #Melhorar aplicações remotas mssfix 1400 # device usado pelo openvpn dev tun # Diz que o certificado foi assinado pelo servidor ns-cert-type server # Habilita conexoes tls # Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn tls-client # arquivo de chave compartilhada usado pelo tls-server # O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls tls-auth keys/shared.key 1 # Certificado de autoridade # Tem que ser o mesmo em todos os hosts # que conectarem a sua vpn ca certs/ca.crt # Certificado e chave privada do servidor # Cada maquina tem que ter seu certificado e chave cert certs/filial1.crt key keys/filial1.key # Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz # esta no ar, usado para manter a conexao ativa ping-timer-rem keepalive 10 120 # Tipo de criptografia usada cipher DES-EDE3-CBC # habilita compressão no link VPN comp-lzo # Ativa a opcao de se conectar, caso o cliente nao esteja na internet, ou # o mesmo tenha perdido a conexao. resolv-retry infinite # Nao especifica uma porta local para o cliente ouvir. nobind # usuário e grupo sob o qual o openvpn ira rodar user nobody group nogroup # Permite um restart sem fechar a conexão e re-ler as chaves persist-key persist-tun # Log de status das conexoes status /var/log/openvpn/openvpn-status.log # define um arquivo de log, pois o default é o /var/log/syslog log /var/log/openvpn/openvpn.log log-append /var/log/openvpn/openvpn.log # Nivel de log # 0 silencioso, exceto para erros fatais # 4 razoavel para uso geral # 5 e 6 podem ajudar a debugar problemas de conexoes # 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba verb 3 # desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia # acima de 20, ele dropa. mute 20Agora vamos empacotar a nossa configuração da filial e enviar para ela as configurações
tar -czvf filial1.tar.gz filial1/ filial1/ filial1/filial1.conf filial1/keys/ filial1/keys/filial1.key filial1/keys/shared.key filial1/certs/ filial1/certs/ca.crt filial1/certs/filial1.crtAgora vamos enviar essa configuração para a nossa filial
scp filial1.tar.gz 200.200.200.2:/tmp
Filial
Agora na filial
aptitude update && aptitude dist-upgrade -y && aptitude install openvpn -y cd /tmp tar -xzvf filial1.tar.gz mv filial1/* /etc/openvpn/ rm -rf /tmp/filial1*Agora vamos criar o diretório que vai armazenas os logs
mkdir /var/log/openvpnAgora vamos reiniciar a nossa openvpn
/etc/init.d/openvpn restart Stopping virtual private network daemon:. Starting virtual private network daemon: filial1.Agora vamos analisar os logs.
tail -f /var/log/openvpn/openvpn.log Fri Dec 6 09:25:19 2011 OPTIONS IMPORT: route-related options modified Fri Dec 6 09:25:19 2011 ROUTE default_gateway=10.0.0.254 Fri Dec 6 09:25:19 2011 TUN/TAP device tun0 opened Fri Dec 6 09:25:19 2011 TUN/TAP TX queue length set to 100 Fri Dec 6 09:25:19 2011 /sbin/ifconfig tun0 10.254.0.6 pointopoint 10.254.0.5 mtu 1500 Fri Dec 6 09:25:22 2011 /sbin/route add -net 192.168.10.0 netmask 255.255.255.0 gw 10.254.0.5 Fri Dec 6 09:25:22 2011 /sbin/route add -net 10.254.0.0 netmask 255.255.255.0 gw 10.254.0.5 Fri Dec 6 09:25:22 2011 GID set to nogroup Fri Dec 6 09:25:22 2011 UID set to nobody Fri Dec 6 09:25:22 2011 Initialization Sequence CompletedVamos efetuar testes
Da filial vamos tentar pingar o ip interno da matriz 192.168.10.1
ping 192.168.10.1 -c 3 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 64 bytes from 192.168.10.1: icmp_req=1 ttl=64 time=1.42 ms 64 bytes from 192.168.10.1: icmp_req=2 ttl=64 time=1.01 ms 64 bytes from 192.168.10.1: icmp_req=3 ttl=64 time=1.05 ms --- 192.168.10.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 1.015/1.166/1.428/0.187 msTabela de rotas da nossa filial
route -n Tabela de Roteamento IP do Kernel Destino Roteador MáscaraGen. Opções Métrica Ref Uso Iface 10.254.0.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 10.254.0.0 10.254.0.5 255.255.255.0 UG 0 0 0 tun0 192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.10.0 10.254.0.5 255.255.255.0 UG 0 0 0 tun0 10.0.0.0 0.0.0.0 255.255.254.0 U 0 0 0 eth0 0.0.0.0 10.0.0.254 0.0.0.0 UG 0 0 0 eth0Agora na matriz vamos tentar pingar a rede interna da filial 192.168.11.1
ping 192.168.11.1 -c 3 PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data. 64 bytes from 192.168.11.1: icmp_req=1 ttl=64 time=0.454 ms 64 bytes from 192.168.11.1: icmp_req=2 ttl=64 time=0.853 ms 64 bytes from 192.168.11.1: icmp_req=3 ttl=64 time=0.804 ms --- 192.168.11.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 0.454/0.703/0.853/0.180 ms
Tabela de rotas da nossa matriz
route -n Tabela de Roteamento IP do Kernel Destino Roteador MáscaraGen. Opções Métrica Ref Uso Iface 10.254.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 10.254.0.0 10.254.0.2 255.255.255.0 UG 0 0 0 tun0 192.168.11.0 10.254.0.2 255.255.255.0 UG 0 0 0 tun0 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 10.0.0.0 0.0.0.0 255.255.254.0 U 0 0 0 eth0 0.0.0.0 10.0.0.254 0.0.0.0 UG 0 0 0 eth0
NÃO ESQUEÇA DE LIBERAR ROTAMENTO NOS SERVIDORES SE VOCÊ PRECISAR ACESSAR OUTRA MAQUINA FORA AS DUAS PONTAS DA VPN.
echo 1 > /proc/sys/net/ipv4/ip_forward
E CASO ACHE NECESSÁRIO MASCARE AS REDES
iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADEPronto, seu openvpn esta instalado e matriz/filial estao se comunicando. Não esqueça de liberar no fw da matriz a porta 1194 tcp de sua interface externa e tudo na interface da vpn que é tun0.
Caso necessite configurar mais uma filial, basta seguir os passos da criação das configurações para a filial, alterando é claro o nome de filial1 para filial2 e mais os passos abaixo.
Também não esqueça de inserir mais uma entrada como abaixo no arquivo server.conf.
route 192.168.11.0 255.255.255.0 -> filial1 route 192.168.12.0 255.255.255.0 -> filial2E precisamos tambem criar mais uma entrada no diretório ccd com a rota para a nova filial
echo "iroute 192.168.12.0 255.255.255.0" > /etc/openvpn/ccd/filial2Caso precise passar mais rotas para as filiais faça como abaixo.
push "route 192.168.10.0 255.255.255.0" push "route 192.168.9.0 255.255.255.0"
Caso uma filial precise acessar a outra podemos fazer da seguinte forma.
- Filial 3 192.168.3.0/24
- Filial 4 192.168.3.0/24
A filial 3 precisa chegar na 4, então vamos inserir a seguinte linha no arquivo de configuração da VPN da filial 3
vim /etc/openvpn/filial3.conf [...] route 192.168.4.0 255.255.255.0
E agora no arquivo de configuração da filial4 precisamos fazer o mesmo procedimento
vim /etc/openvpn/filial4.conf [...] route 192.168.3.0 255.255.255.0
Com isso as filiais já tem rotas uma para a outra por causa do parâmetro client-to-client na configuração do servidor.
Aqui não podemos de incluir as outras configuração padrões no servidor principal de openvpn, caso precise acessar os servidores das filiais não podemos esquecer de habilitar o repasse de pacotes com o seguinte comando
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
Também precisamos mascarar a rede da vpn que em nosso caso é 10.254.0.0/24 nas filiais com o seguinte comando.
iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE