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
# 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
# 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.
É 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
# 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;
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.
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"
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.