VPN sobre FreeBSD usando IPSEC e cifrando com RACOON:

Autor: Iucki
Data: 08/10/2002.


O que neste artigo vos proponho é algo que a simples vista parece algo bastante complicado e que deve levar muito tempo e requerer umas configurações mas complicadas do que realmente é.

Que é VPN? Uma vpn é uma rede privada virtual, e em que consiste?, consiste em unir duas redes locais como as que podemos ter no colégio, em casa ou no escritório entre si. As vantagens que isto tem são inumeráveis já que estamos fazendo de duas redes fisicamente separadas (ambas as conectadas a internet) uma estrutura de rede estável. Podemos ter um servo em cada uma de nossos escritórios e compartir arquivos entre equipes ou imprimir em impresoras de rede como se de uma só rede se tratasse,etc..

Que precisámos para montar uma VPN?, precisámos duas redes, duas maquinas que dêem acesso a internet a cada uma dessas duas redes e um pouco de tempo para seguir com cuidado este artigo, o resultado está garantido.

A estrutura basicamente é a seguinte:

---REDE1---
    |
IPPRIVADA1
{MAKINA1}
IPPUBLICA1
    |
ENLACEINTERNET
    |
INTERNET
    |
ENLACE2INTERNET
     |
IPPUBLICA2
{MAKINA2}
IPPRIVADA2
     |
 ---REDE2---

Exemplo:

--192.168.0.0/24--
     |
192.168.0.1
{MAKINA1}
213.172.100.101
     |
213.172.100.100
     |
 INTERNET
     |
80.32.152.28
     |
80.32.152.29
{MAKINA2}
192.168.1.1
     |
--192.168.1.0/24--

A configuração que vamos ver é para nossa MAKINA1, a configuração da MÁKINA2 será = mas mudando os valores das IPS e das redes

Passo Número 1: Adicionar opções a nosso kernel:

# ee /usr/src/sys/i386/conf/KERNEL

Adicionamos:

options 	IPFIREWALL
options		IPFIREWALL_VERBOSE
options		IPDIVERT

pseudo-device	gif	4
options		IPSEC
options		IPSEC_ESP
options		IPSEC_DEBUG

compilamos nosso Kernel:

# cd /usr/src/sys/i386/conf

# config -r KERNEL
# cd ../../compile/KERNEL
# make depend && make && make install

Passo Número 2: Configuração da rede

# ee /etc/rc.conf
gateway_enable="YES"
defaultrouter="enlace1" #escrevemos nossa IP de  enlace. Exemplo: defaultrouter="213.172.100.100"
ifconfig_fxp0="inet publica1  netmask mascaraPublica1" #publica1 é uma IP. Exemplo:ifconfig_fxp0="inet 213.172.100.101 netmask 255.255.255.240"
ifconfig_fxp1="inet privada1  netmask 255.255.255.0" #privada1 é uma IP. Exemplo:ifconfig_fxp1="inet 192.168.0.1	netmask 255.255.255.0"
router_flags="-q"
router="/sbin/routed"
router_enable="YES"
firewall_enable="YES"
firewall_script="/etc/rc.firewall"
firewall_logging="YES"
firewall_type="/etc/firewall.rules"
natd_enable="YES"
natd_interface="fxp0"	#É o dispositivo conectado a  internet.
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
gif_interfaces="gif0"
gifconfig_gif0="publica1  publica2" # Exemplo: gifconfig_gif0="213.172.100.101  80.32.152.29""
network_interfaces="fxp1 fxp0 o0 gif0" #aqui poneis os que tengais mas o0 e gif0
ifconfig_gif0="privada1 privada2 netmask 255.255.255.255" #exemplo: ifconfig_gif0="192.168.0.2 192.168.1.2 netmask 255.255.255.255"
static_routes="vpn"
route_vpn="-net rede2/24 privada2" #exemplo:route_vpn="-net 192.168.1.0 192.168.1.2"

vemos que é necessário ter dois dispositivos de rede conectados,um a Internet e o outro a uma rede privada. Adicionei ao kernel as opções necessárias para ativar o firewall e o natd já que para poder mover-nos entre as duas redes precisámos que nossos dois servos sejam as portas de enlace das mákinas de suas redes respectivamente. Também podemos ver que gif0 é o pseudo-dispositivo que utilizámos para enviar informação através da vpn, ou seja, o dispositivo pelo que viaja a informação a traves da VPN.

Passo Número 3: Firewall

É necessário dar acesso a ambas as redes desde ambas as redes.

# ee /etc/firewall.rules
-f flush
add divert natd all from any to any via fxp1
add allow all from rede1/24 to rede2/24 #exemplo: add allow all from 192.168.0.0/24 to 192.168.1.0/24
add allow all from rede2/24 to rede1/24 #exemplo: add allow all from 192.168.1.0/24 to 192.168.0.0/24
#....restantes réguas....
add allow icmp from any to any out icmptypes 8
add allow icmp from any to any out icmptypes 0
add deny icmp from any to any in icmptypes 8
add deny icmp from any to any out icmptypes 0
#....mais réguas...
add pass all from any to any
add allow all from any to any

Passo Número4: Estabelecimento do tunel ipsec

# ee /etc/ipsec.conf
flush;
spdflush;
spdadd rede1/24 rede2/24 any -P out ipsec esp/tunnel/publica1-publica2/require; #exemplo:spdadd 192.168.0.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/213.172.100.101-80.32.152.29/require;
spdadd rede2/24 rede1/24 any -P in ipsec esp/tunnel/publica2-publica1/require;  #exemplo:spdadd 192.168.1.0/24 192.168.0.0/24 any -P in ipsec esp/tunnel/80.32.152.29-213.172.100.101/require;

Passo Número 5:Cifrado do tunel com Racoon

Racoon é o que vamos usar para cifrar toda a informação que viaja por nosso tunel.

# cd /usr/ports/security/racoon && make install clean

Configuração de racoon, arquivo: /usr/local/etc/racoon/racoon.conf, teneis um exemplo a seguir em usr //local/etc/racoon/racoon.conf.dist. Eu o racoon.conf que uso é o seguinte:

path include "/usr/local/etc/racoon" ;
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
path certificate "/usr/local/etc/cert" ;
log debug;
log notify;

remote anonymous
{
        exchange_mode main, aggressive;
        doi ipsec_doi;
        situation identity_only;
        nonce_size 16;
        lifetime time 1 hour;   # sec,min,hour
        initial_contact on;
        support_mip6 on;
        proposal_check obey;    # obey, strict or claim

        proposal {
                encryption_algorithm 3dês;
                hash_algorithm sha1;
                authentication_method pre_shared_key ;
                dh_group 2 ;
        }
}


sainfo anonymous
{
        pfs_group 2;
        lifetime time 1 hour;
        encryption_algorithm 3dês ;
        authentication_algorithm hmac_sha1;
        compression_algorithm deflate ;
}

Editamos o arquivo no que vão as claves que utiliza o algoritmo 3dês para cifrar nossos dados:

# ee psk.txt
publica2 clave_bastante_longa #exemplo:80.32.152.29	eldemonio.org
publica1 clave_bastante_longa              #exemplo:213.172.100.101	eldemonio.org

Saímos e guardámos, é importante que em vosso arquivo de claves metais as claves para a rede à que quereis conectar e as claves necessárias para que se conectem a vossa rede.Também é necessário que para que racoon possa ler este arquivo cambieis as permissões deste mesmo a 400 :

# chmod 400 /usr/local/etc/racoon/psk.txt

em Nosso servo2 as claves em psk .txt serão:

publica1 clave_bastante_longa              #exemplo:213.172.100.101	eldemonio.org
publica2 clave_bastante_longa #exemplo:80.32.152.29	eldemonio.org

Script de arranque para racoon:

# ee /usr/local/etc/rc.d/racoon.sh
#!/bin/sh
if %[ -x /usr/local/sbin/racoon ]; then
    echo -n "racoon "
    /usr/local/sbin/racoon -f /usr/local/etc/racoon/racoon.conf
fi

Saímos e guardámos:

# chmod 755 /usr/local/etc/rc.d/racoon.sh

(Já só fica reiniciar esta mákina). Agora há que fazer o mesmo na outra mákina e reiniciar ambas as.

Montar VPN entre mais de dois pontos

Se em lugar de unir 2 redes entre si o que quereis é unir 3 redes, ou uma mákina com 2 redes distintas teríeis que fazer estas modificações: Imaginemos que nossa REDE1 a queremos unir agora também a uma REDE3, de modo que o esquema seria:

---REDE1---
    |
IPPRIVADA1
{MAKINA1}
IPPUBLICA1
    |
ENLACEINTERNET
    |
INTERNET _ _ _ _ _ _ _ _ _ _ _ _ _ 
    |                             |
ENLACE2INTERNET            ENLACE3INTERNET 
     |				  |
IPPUBLICA2                    IPPUBLICA3    (62.36.241.32)
{MAKINA2}		       {MAKINA3}       {MAKINA2}	
IPPRIVADA2		      IPPRIVADA3     (192.168.2.1)
     |				  |
 ---REDE2---		      ---REDE3---

Partindo da configuracíon que já fizemos para unir as redes 1 e 2 vamos ir vendo que mudanças teria que fazer para adicionar novos túneis.

# ee /etc/rc.conf
gateway_enable="YES"
defaultrouter="enlace1" #escrevemos nossa IP de  enlace. Exemplo: defaultrouter="213.172.100.100"
ifconfig_fxp0="inet publica1  netmask mascaraPublica1" #publica1 é uma IP. Exemplo:ifconfig_fxp0="inet 213.172.100.101 netmask 255.255.255.240"
ifconfig_fxp1="inet privada1  netmask 255.255.255.0" #privada1 é uma IP. Exemplo:ifconfig_fxp1="inet 192.168.0.1	netmask 255.255.255.0"
router_flags="-q"
router="/sbin/routed"
router_enable="YES"
firewall_enable="YES"
firewall_script="/etc/rc.firewall"
firewall_logging="YES"
firewall_type="/etc/firewall.rules"
natd_enable="YES"
natd_interface="fxp0"	#É o dispositivo conectado a  internet.
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
gif_interfaces="gif0 gif1"
gifconfig_gif0="publica1  publica2" # Exemplo: gifconfig_gif0="213.172.100.101  80.32.152.29"
gifconfig_gif1="publica1  publica3" # Exemplo: gifconfig_gif1="213.172.100.101  62.36.241.32"
network_interfaces="fxp1 fxp0 o0 gif0 gif1" #aqui poneis os que tengais mas o0 e gif0
ifconfig_gif0="privada1 privada2 netmask 255.255.255.255" #exemplo: ifconfig_gif0="192.168.0.2 192.168.1.2 netmask 255.255.255.255"
ifconfig_gif1="privada1 privada3 netmask 255.255.255.255" #exemplo: ifconfig_gif1="192.168.0.3 192.168.2.2 netmask 255.255.255.255"
static_routes="vpn vpn2"
route_vpn="-net rede2/24 privada2" #exemplo:route_vpn="-net 192.168.1.0 192.168.1.2"
route_vpn2="-net rede3/24 privada3" #exemplo:route_vpn2="-net 192.168.2.0 192.168.2.2"
# ee /etc/firewall.rules
-f flush
add divert natd all from any to any via fxp1
add allow all from rede1/24 to rede2/24 #exemplo: add allow all from 192.168.0.0/24 to 192.168.1.0/24
add allow all from rede2/24 to rede1/24 #exemplo: add allow all from 192.168.1.0/24 to 192.168.0.0/24
add allow all from rede1/24 to rede3/24 #exemplo: add allow all from 192.168.0.0/24 to 192.168.2.0/24
add allow all from rede3/24 to rede1/24 #exemplo: add allow all from 192.168.2.0/24 to 192.168.0.0/24
#....restantes réguas....
add allow icmp from any to any out icmptypes 8
add allow icmp from any to any out icmptypes 0
add deny icmp from any to any in icmptypes 8
add deny icmp from any to any out icmptypes 0
#....mais réguas...
add pass all from any to any
add allow all from any to any
# ee /etc/ipsec.conf
flush;
spdflush;
spdadd rede1/24 rede2/24 any -P out ipsec esp/tunnel/publica1-publica2/require; #exemplo:spdadd 192.168.0.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/213.172.100.101-80.32.152.29/require;
spdadd rede2/24 rede1/24 any -P in ipsec esp/tunnel/publica2-publica1/require;  #exemplo:spdadd 192.168.1.0/24 192.168.0.0/24 any -P in ipsec esp/tunnel/80.32.152.29-213.172.100.101/require;
spdadd rede1/24 rede3/24 any -P out ipsec esp/tunnel/publica1-publica3/require; #exemplo:spdadd 192.168.0.0/24 192.168.2.0/24 any -P out ipsec esp/tunnel/213.172.100.101-62.36.241.32/require;
spdadd rede3/24 rede1/24 any -P in ipsec esp/tunnel/publica3-publica1/require;  #exemplo:spdadd 192.168.2.0/24 192.168.0.0/24 any -P in ipsec esp/tunnel/62.36.241.32-213.172.100.101/require;
publica3 clave_bastante_longa		#exemplo:62.36.241.32		eldemonio.org
publica2 clave_bastante_longa		#exemplo:80.32.152.29		eldemonio.org
publica1 clave_bastante_longa		#exemplo:213.172.100.101	eldemonio.org

Por cada novo tunel que abrais debereís usar uma nova ipvirtual de vossa subred, se quiséssemos criar um novo por exemplo para unir nossa rede com a rede 192.168.3.0/24 cuja IP-Publica é 213.172.58.25 diríamos:

gifconfig_gif2="213.172.100.101  213.172.58.25"
ifconfig_gif2="192.168.0.3 192.168.3.2 netmask 255.255.255.255"

Curiosidades

Esta configuração foi provada numa mákina que tem estabelecidos distintos túneis, 2 tuneles com outros servos FreeBSD que funcionam perfeitamente, um tunel com um router zyxell zywall 100, um tunel com um router DrayTeck Vigor2600 e um último tunel com uma mákina windows XP que tem carregado o seguinte cliente de vpn sentinel que se pode descarregar gratuítamente desta url:

http://www.ssh.com/products/sentinel/eval/

Os routers funcionam bem ainda que ainda com algumas anomalias que segundo vá solucionando vos irei comentando, é importante que se montais VPN com algun router dentro da configuração deste especifiqueis que o sistema de segurança sobre IPSEC é High (ESP) 3DÊS.E que o algoritmo de autentifiacion é SHA1. Também tendreis que especificar o "Key Group" em algum e neste campo poríamos dh2. Todos estes valores os especificámos previamente em usr //local/etc/racoon/racoon.conf. Já sabeis todos que para qualquer dúvida ou sugestão podeis escrever-me a minha direção de correio eletrônico [email protected] ,espero que vos tenha sido de utilidade, com o tempo irei adicionando coisas e o aprofundarei todo um pouco mais.

Por certo, este artigo é propriedade de eldemonio.org ,me gostaria que se alguém o sobe a sua web por favor nos avise, para assim poder informar-lhe de mudanças e melhoras nele.


Hosted by www.Geocities.ws

1