Archive for the ‘VPN’ tag
VPN Ipsec entre OpenBSD e Juniper Netscreen
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 :).
Configurando um servidor de openvpn parte 2
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.
Configurando um servidor de openvpn parte 1
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.