Claudio Borges

Technical blog about Linux, BSD, Mac OS X, Games and etc.

Archive for the ‘VPN’ tag

VPN Ipsec entre OpenBSD e Juniper Netscreen

with 2 comments

Há alguns dias precisei configurar uma VPN Ipsec entre um Juniper Netscreen e um OpenBSD. Como o protocolo é Ipsec, o OpenBSD tem tudo nativo :). Nele você pode configurar uma VPN Ipsec utilizando 2 caminhos:

[text]
– ipsec: A configuração é definida em um único arquivo (/etc/ipsec.conf). Configuração bastante simples.
– isakmpd: Além do arquivo de configuração (/etc/isakmpd/isakmpd.conf), você precisa configurar o arquivo de policy (/etc/isakmpd/isakmpd.policy). Configuração um pouco complexa de entender no inicio.
[/text]

Não vou entrar em detalhes sobre o ipsec e isakmpd, caso precise leia a documentação do mesmo, nada como um man arquivo não resolva, ou então clique nos respectivos links :).

Deixando a teoria de lado, vamos a pratica. As informações do Netscreen são praticamente iguais as utilizadas nas VPNs Cisco e no CheckPoint. Então esta documentação serve para os 3 produtos. O que pode mudar é o group, hash, encryption algorithm e é claro, a shared-key:

[text]
IP Netscreen: 201.56.120.125
Lan Netscreen: 192.168.1.0/24
Shared Key: fGrkApZlrNf@uR0@zlr#!4ka

Fase 1:

Hashing Algorithm: MD5
Diffie-Hellman Group: Group-2
Transform (IPSec Protocol): ESP
Perfect Forward Secrecy: PFS
Encryption Algorithm: 3DES

Fase 2:

Diffie-Hellman Group: Group-0
Encryption Algorithm: 3DES
Hashing Algorithm: MD5
Perfect Forward Secrecy: noPfs
[/text]

No meu servidor OpenBSD tenho os seguintes IPs:

[text]
IP OpenBSD: 187.10.223.67
Lan OpenBSD: 10.10.1.0/24
[/text]

Consultando a documentação do ipsec.conf (man ipsec.conf), listei as opções que recebi do Netscreen e criei uma lista compatível que será usada no arquivo /etc/ipsec.conf:

[text]
Fase 1 = main mode
Hashing Algorithm: hmac-md5
Diffie-Hellman Group: modp1024
Transform (IPSec Protocol): esp
Encryption Algorithm: 3des

Fase 2 = quick mode
Diffie-Hellman Group: none
Encryption Algorithm: 3des
Hashing Algorithm: hmac-md5
[/text]

Baseado nas informações anteriores, gerei o esqueleto da configuração para um melhor entendimento:

[text]
ike [Transform (IPSec Protocol)] from src to dst \
main auth [Hashing Algorithm] enc [Encryption Algorithm] group [Diffie-Hellman Group] \
quick auth [Hashing Algorithm] enc [Encryption Algorithm] group [Diffie-Hellman Group] \
psk [shared-key]
[/text]

Depois de entender a lógica da configuração, vamos criar o arquivo final. Renomeie o /etc/ipsec.conf para /etc/ipsec.conf.default:

[bash]
mv /etc/ipsec.conf /etc/ipsec.conf.default
[/bash]

Crie o /etc/ipsec.conf com o seguinte conteúdo:

[text]
# /etc/ipsec.conf
#
ext_if = "fxp0"
openbsd_lan = "10.10.1.0/24"
netscreen_lan = "192.168.1.0/24"
netscreen_gw = "201.56.120.125"

ike esp from $openbsd_lan to $netscreen_lan peer $netscreen_gw \
main auth hmac-md5 enc 3des group modp1024 \
quick auth hmac-md5 enc 3des group none \
psk "fGrkApZlrNf@uR0@zlr#!4ka"
[/text]

Antes de iniciar a VPN, é preciso criar o arquivo de policy do isakmpd. Este procedimento torna-se necessário para o isakmpd não ficar gerando log dizendo que o arquivo de policy não foi encontrado:

[bash]
touch /etc/isakmpd/isakmpd.policy
[/bash]

Repara que o arquivo acima foi criado sem nenhum conteúdo.

Adicione a variável netscreen_gw = “201.56.120.125” no seu /etc/pf.conf, depois adicione as linhas abaixo para permitir o tráfego entre o OpenBSD e o GW Netscreen:

[text]
pass in on $ext_if proto udp from $netscreen_gw to $ext_if port { 500, 4500 }
pass out on $ext_if proto udp from $ext_if to $netscreen_gw port { 500, 4500 }
pass in on $ext_if proto esp from $netscreen_gw to $ext_if
pass out on $ext_if proto esp from $ext_if to $netscreen_gw
[/text]

Dê um reload nas suas regras e start a VPN:

[bash]
pfctl -f /etc/pf.conf
isakmpd -K
ipsecctl -f /etc/ipsec.conf
[/bash]

Caso não tenha recebido nenhuma mensagem de erro, verifique se o túnel subiu:

[bash]
netstat -nr
[/bash]

Nas últimas linhas você verá as seguintes informações:

[text]
Encap:
Source Port Destination Port Proto SA(Address/Proto/Type/Direction)
192.168.1.0/24 0 10.10.1.0/24 0 0 201.56.120.125/esp/use/in
10.10.1.0/24 0 192.168.1.0/24 0 0 201.56.120.125/esp/require/out
[/text]

Utilizamos o ipsecctl para verificar as regras de policy do ipsec:

[text]
FLOWS:
flow esp in from 192.168.1.0/24 to 10.10.1.0/24 peer 201.56.120.125 srcid 187.10.223.67/32 dstid 201.56.120.125/32 type use
flow esp out from 10.10.1.0/24 to 192.168.1.0/24 peer 201.56.120.125 srcid 187.10.223.67/32 dstid 201.56.120.125/32 type require

SAD:
esp tunnel from 187.10.223.67 to 201.56.120.125 spi 0x097a93d3 auth hmac-md5 enc 3des-cbc
esp tunnel from 201.56.120.125 to 187.10.223.67 spi 0x6f5c0fef auth hmac-md5 enc 3des-cbc
[/text]

Adicione as seguintes linhas no /etc/rc.conf.local para que a VPN suba se o servidor reiniciar:

[text]
isakmpd_flags="-K" # enabled isamkpd
ipsec=YES # enabled ipsec
[/text]

Para visualizar o tráfego utilize o tcpdump na interface externa filtrando tudo que entra e sai para o IP do Netscreen:

[bash]
tcpdump -i fxp0 -netttvvv src or dst 201.56.120.125
[/bash]

Chegamos ao final, VPN pronta, tunel no ar e clientes felizes :).

Written by but3k4

April 17th, 2010 at 12:13 pm

Posted in OpenBSD

Tagged with , , ,

Configurando um servidor de openvpn parte 2

with 2 comments

Dando continuidade a parte 1 do artigo, vamos configurar o lado do cliente.

Chaves e certificados para a filial

[bash]
server:~/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]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:"Sao Paulo"
Organization Name (eg, company) [Personal OpenVPN Client]:
Organizational Unit Name (eg, section) []: POC
Common Name (eg, your name or your server’s hostname) []:filial1
Email Address [but3k4@gmail.com]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/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:’SP’
localityName : T61STRING:’"Sao Paulo"’
organizationName : PRINTABLE:’Personal OpenVPN Client’
organizationalUnitName: PRINTABLE:’POC’
commonName : PRINTABLE:’filial1′
emailAddress : IA5STRING:’but3k4@gmail.com’
Certificate is to be certified until Aug 9 14:59:05 2018 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
server:~/easy-rsa#
[/bash]

Com os certificados criados, vamos copiá-los para o /etc/openvpn:

[bash]
server:~/easy-rsa# mkdir /etc/openvpn/{certs,ccd,keys}
server:~/easy-rsa# cp keys/*.crt /etc/openvpn/certs/
server:~/easy-rsa# cp keys/*.key keys/dh2048.pem /etc/openvpn/keys/
[/bash]

Criando 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 nao vai saber que as maquinas de ambos os lados querem se comunicar e com isso a comunicação fica restrita apenas aos servidores.

[bash]
server:~/easy-rsa# echo "iroute 192.168.1.0 255.255.255.0" > /etc/openvpn/ccd/filial1
[/bash]

Ajustando as permissões de arquivos / diretórios

[bash]
server:~/easy-rsa# cd /etc/openvpn/
server:/etc/openvpn# chown -R nobody:nogroup keys certs ccd
server:/etc/openvpn# chmod 0400 keys/* certs/* ccd/*
[/bash]

Criando o diretorio de log

Precisamos criar o diretório de log, pois nossa configuração salva estas informações em arquivos específicos

[bash]
server:/etc/openvpn# mkdir /var/log/openvpn
[/bash]

Startando o openvpn do lado matriz

[bash]
server:/etc/openvpn# /etc/init.d/openvpn start
Starting virtual private network daemon: openvpn(OK).
server:/etc/openvpn#
[/bash]

Com o lado do servidor ok, vamos criar os arquivos para a filial:

[bash]
server:/etc/openvpn# mkdir -p filial1/{certs,keys}
server:/etc/openvpn# cp certs/{ca.crt,filial1.crt} filial1/certs/
server:/etc/openvpn# cp keys/{filial1.key,shared.key} filial1/keys/
[/bash]

Criando o arquivo /etc/openvpn/filial1/openvpn.conf:

[text]
# /etc/openvpn/openvpn.conf filial configuration file

# diretorio onde esta os arquivos de configuracao / certificados
cd /etc/openvpn

# Especifica que este certificado eh de um cliente
client

# Define o ip do servidor para o cliente conectar
remote 189.47.25.20

# porta usada para os clientes conectarem no servidor
port 1194

# protocolo usado na conexao
proto udp

# 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 20
[/text]

Compactando os arquivos para a filial:

[bash]
server:/etc/openvpn# tar -czpf filial1.tar.gz filial1
[/bash]

Envie o arquivo filial1.tar.gz para o /tmp/ da filial.

Agora do lado da filial, é necessário instalar o openvpn e descompactar os arquivos:

[bash]
filial1:~# apt-get install -y openvpn
[/bash]

Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”. Agora descompacte o arquivo filial1.tar.gz que está no /tmp/:

[bash]
filial1:~# cd /tmp/
filial1:~# tar xzf filial1.tar.gz
filial1:~# mv filial1/* /etc/openvpn/
filial1:~# rm -rf /tmp/filial1*
[/bash]

Criando o diretorio /var/log/openvpn:

[bash]
filial1:/etc/openvpn# mkdir /var/log/openvpn
[/bash]

Startando o openvpn do lado filial:

[bash]
filial1:/etc/openvpn# /etc/init.d/openvpn start
Starting virtual private network daemon: openvpn(OK).
filial1:/etc/openvpn#
[/bash]

Pronto, seu openvpn esta instalado e matriz/filial estao se comunicando. Não esqueça de liberar no fw da matriz a porta 1194 udp de sua interface externa e tudo na interface da vpn que é tun0.

Caso necessite configurar um notebook para acessar o servidor, basta seguir os passos da criação das configurações para a filial, alterando é claro o nome de filial para notebook ou qualquer outro nome.

Abraços.

Written by but3k4

January 29th, 2010 at 10:45 pm

Posted in Linux

Tagged with ,

Configurando um servidor de openvpn parte 1

with 8 comments

OpenVPN é um solução completa de VPN. A mesma utiliza SSL para encriptar o tráfego, possui versões para os mais diversos sistemas, tais como: Linux, Todos os BSDs e derivados (isto inclui o Mac OS X e Solaris), Windows 2000/XP/2K3/Vista/7 e sua licença é GPL.

Uma de suas principais vantagens é que você pode trabalhar com qualquer porta tcp/udp, além de poder utilizá-la através de nat. Sua configuração é simples e intuitiva e não necessita de aplicação de patch no kernel.

Este artigo é baseado em debian, mas caso queira, os procedimentos de configuração se aplicam tanto para linux quanto para os bsd, levando em conta claro parâmentos como interface, usuário, grupo e arquivos de log.

Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:

[text]
IP Externo da matriz: 189.47.25.20
Rede interna da Matriz: 192.168.0.0/24
Rede interna da filial: 192.168.1.0/24
Interface da vpn: tun0
[/text]

A instalação do openvpn é bem simples, quem está acostumado com debian bastar utilizar o apt:

[bash]
server:~# apt-get install -y openvpn
[/bash]

Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”.

Copie o diretório /usr/share/doc/openvpn/examples/easy-rsa para o seu /root/:

[bash]
server:~# cp -a /usr/share/doc/openvpn/examples/easy-rsa /root/
[/bash]

Edite o arquivo /root/easy-rsa/vars e altere as variáveis a seu gosto:

[text]
export KEY_SIZE=2048

export KEY_COUNTRY=BR
export KEY_PROVINCE=SP
export KEY_CITY="Sao Paulo"
export KEY_ORG="Personal OpenVPN Server"
export KEY_ORGNAME="POS"
export KEY_EMAIL="but3k4@gmail.com"
[/text]

Carregue as variáveis no ambiente:

[bash]
server:~# cd easy-ca
server:~/easy-rsa# . ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys
[/bash]

Obs: é . ./ mesmo.

Rode o comando clean-all:

[bash]
server:~/easy-rsa# ./clean-all
[/bash]

Gerando 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:

[bash]
server:~/easy-rsa# ./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]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server’s hostname) []:server
Email Address [but3k4@gmail.com]:
server:~/easy-rsa#
[/bash]

Chaves e certificados do servidor

[bash]
server:~/easy-rsa# ./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]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server’s hostname) []:server
Email Address [but3k4@gmail.com]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/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:’SP’
localityName : PRINTABLE:’Sao Paulo’
organizationName : PRINTABLE:’Personal OpenVPN Server’
organizationalUnitName: PRINTABLE:’POS’
commonName : PRINTABLE:’server’
emailAddress : IA5STRING:’but3k4@gmail.com’
Certificate is to be certified until Aug 9 14:41:55 2018 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
server:~/easy-rsa#
[/bash]

Parâmetros Diffie Hellman

Os parâmetros Diffie Hellman são utilizados para a troca encriptada de informações

[bash]
server:~/easy-rsa# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time

……. e espere pois isso pode demorar ……..

server:~/easy-rsa#
[/bash]

Chave compartilhada

Criando uma chave compartilhada para servir de tls:

[bash]
server:~/easy-rsa# openvpn –genkey –secret keys/shared.key
server:~/easy-rsa#
[/bash]

Criando o /etc/openvpn/openvpn.conf:

[text]
# /etc/openvpn/openvpn.conf matriz configuration file

# diretorio onde esta os arquivos de configuracao / certificados
cd /etc/openvpn

# porta usada para os clientes conectarem no servidor
port 1194

# protocolo usado na conexao
proto udp

# 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.8.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.1.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.0.0 255.255.255.0"

# 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
[/text]

Por hoje acho que está bom, na parte 2 do artigo irei mostrar como configurar o client e fazer os ajustes finais para você ter um servidor openvpn que atenda matriz, filial e clientes remotos pelo Brasil a fora.

Written by but3k4

January 10th, 2010 at 8:22 pm

Posted in Linux

Tagged with , , ,