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:

- 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.

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:

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

No meu servidor OpenBSD tenho os seguintes IPs:

IP OpenBSD: 187.10.223.67
Lan OpenBSD: 10.10.1.0/24

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:

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

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

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]

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

mv /etc/ipsec.conf /etc/ipsec.conf.default

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

# /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"

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:

touch /etc/isakmpd/isakmpd.policy

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:

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

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

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

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

netstat -nr

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

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

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

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

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

isakmpd_flags="-K"              # enabled isamkpd
ipsec=YES                       # enabled ipsec

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

tcpdump -i fxp0 -netttvvv src or dst 201.56.120.125

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

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# 

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

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/

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.

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

Ajustando as permissões de arquivos / diretórios

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

Criando o diretorio de log

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

server:/etc/openvpn# mkdir /var/log/openvpn

Startando o openvpn do lado matriz

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

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

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/

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

# /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

Compactando os arquivos para a filial:

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

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:

filial1:~# apt-get install -y openvpn

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

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

Criando o diretorio /var/log/openvpn:

filial1:/etc/openvpn# mkdir /var/log/openvpn

Startando o openvpn do lado filial:

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

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:

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

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

server:~# apt-get install -y openvpn

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

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

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

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"

Carregue as variáveis no ambiente:

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

Obs: é . ./ mesmo.

Rode o comando clean-all:

server:~/easy-rsa# ./clean-all

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:

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#

Chaves e certificados do servidor

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#

Parâmetros Diffie Hellman

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

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#

Chave compartilhada

Criando uma chave compartilhada para servir de tls:

server:~/easy-rsa# openvpn --genkey --secret keys/shared.key
server:~/easy-rsa#

Criando o /etc/openvpn/openvpn.conf:

# /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

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 , , ,