Como instalar e configurar uma vpn no slackware usando o Freeswan

Resolvi fazer este tutorial, pois enfrentei vários problemas quando fui configurar o freeswan, consultei vários sites, e a maioria dos artigos não explicavam de uma forma clara, e o restante eram sempre voltados para red hat e seus derivados, e como não iria trocar de distribuição só por causa disso, fiz este tutorial baseado no slackware 9.1.

Segue abaixo todos os passos para a configuração de uma vpn entre duas empresas, que chamaremos de matriz e filial. Esta configuração tem o objetivo de fazer as duas redes internas de ambos os lados de falarem e ficarem disponíveis no ambiente de rede dos $windows. :)

Em nossa instalação, precisaremos ter um kernel compilado, e que o seu source esteja no /usr/src, caso você não o tenha, então precisará ser feita a compilação, eu particularmente pego o pacote do www.kernel.org, mais se você preferir usar o que o patrick compilou; só não sei se vai ocorrer algum problema, pois a nossa instalação é baseada no source do www.kernel.org. Se você não sabe como compilar um kernel, sugiro procurar uma documentação relativa ao assunto, e aos que já estão familiarizados:

cd /usr/src

wget -c http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.24.tar.bz2
tar xvjf linux-2.4.24.tar.bz2

ln -s linux-2.4.24 linux
cd linux
make menuconfig

O comando acima é usado para entrar no modo de configuração do kernel, habilite as opções que você vai usar, salve-as e não se preocupe com o freeswan, pois ele será instalado logo mais. Vamos agora fazer a compilação:

make dep clean bzImage modules modules_install

Assim você faz tudo em uma única linha :)

Não se esqueça de copiar a imagem do kernel para o /boot e adicionar no lilo.

cp System.map /boot/System.map-2.4.24
cd /boot/
ln -sf System.map-2.4.24 System.map
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.24

Depois é só adicionar a imagem do kernel no seu /etc/lilo.conf, logo abaixo está o exemplo da entrada que eu adicionei no final do meu /etc/lilo.conf, se você quiser seguir este exemplo, apenas substitua o hda2 pelo número da sua partição :)

# Slackware bootable partition config begins
image = /boot/vmlinuz-2.4.24
root = /dev/hda2
label = slack-ipsec
read-only
# Slackware bootable partition config ends

Pronto, agora que o seu kernel está compilado, é hora de instalarmos o freeswan, vamos baixar o pacote e descompactá-lo:

wget http://download.freeswan.ca/super-freeswan/super-freeswan-1.99.8.tar.gz
tar xvzf super-freeswan-1.99.8.tar.gz
cd super-freeswan-1.99.8

Digite este comando para aplicar o patch no kernel, e dê enter para as opções que aparecerem:

make oldmod

Agora digite o seguinte comando para instalar o freeswan:

make minstall

Pronto, com o freeswan instalado, vamos às configurações:

A configuração do freeswan e feita em apenas 2 arquivos, o ipsec.secrets e o ipsec.conf. O arquivo ipsec.secrets é onde está a chave criptografada, usada para fazer a autenticação dos dois lados da vpn. Na instalação é criado um ipsec.secrets, mais nos não vamos usá-lo, então vamos removê-lo e criar um novo:

rm /etc/ipsec.secrets

ipsec newhostkey --output /etc/ipsec.secrets --hostname `hostname --fqdn` 2048

Pronto, o seu ipsec.secrets foi criado com o comando acima. Logo abaixo está o meu ipsec.secrets:

: RSA {
    # RSA 2192 bits slack.linuxti.pro.br Fri Jan 23 10:13:55 2004
    # for signatures only, UNSAFE FOR ENCRYPTION 
    #pubkey=0sAQNXgnThrS2JStFsNGT77i8ydiAK0sgMgdkLcuQPJUDZchfjOtKUOz..... 
    #IN KEY 0x4200 4 1 AQNXgnThrS2JStFsNGT77i8ydiAK0sgMgdkLcuQPJUDZchf....
    # (0x4200 = auth-only host-level, 4 = IPSec, 1 = RSA)
    Modulus: 0x578274e1ad2d894ad16c3464fbee2f3276200ad2c80c81d90b72e40f2540....
    PublicExponent: 0x03
    # everything after this point is secret 
    PrivateExponent: 0x0e95be259cdcec3722e75e10d4a7b2886905572321576af981e87....
    Prime1: 0x99bc9bf49f2efae7a2f8684018e525c023730323d947eb30b4a214ebbeb86....
    Prime2: 0x91b836ecdc81fa34a95fd0fcc4cd62849d36fe91f9dc4fb3a89c17817895f70....
    Exponent1: 0x667dbd4dbf74a745175045801098c3d56cf7576d3b854775cdc16347d....
    Exponent2: 0x612579f33dabfc231b9535fdd888ec5868cf5461513d8a77c5bd6500fb0....
    Coefficient: 0x3938a86e824ee261f3ace62526d34579b7e0fb77f18e813d8a5ede1a03f....
    }
# do not change the indenting of that "}"

A parte que realmente interessa é esta aqui:

pubkey=0sAQNXgnThrS2JStFsNGT77i8ydiAK0sgMgdkLcuQPJUDZchfjOtKUOz.....

Está e a chave pública que será utilizada para fazer a autenticação da vpn, e que será acrescentada ao ipsec.conf.

Com o ipsec.secrets ok, vamos à configuração do ipsec.conf, veja abaixo o ipsec.conf original:

# /etc/ipsec.conf - FreeS/WAN IPsec configuration file

# More elaborate and more varied sample configurations can be found 
# in FreeS/WAN's doc/examples file, and in the HTML documentation.

 

# basic configuration config setup
 

 

    # THIS SETTING MUST BE CORRECT or almost nothing will work; 
    # %defaultroute is okay for most simple cases. 
    interfaces=%defaultroute 
    # Debug-logging controls: "none" for (almost) none, "all" for lots.  
    klipsdebug=none 
    plutodebug=none 
    # Use auto= parameters in conn descriptions to control startup actions. 
    plutoload=%search 
    plutostart=%search 
    # Close down old connection when new one using same ID shows up. 
    uniqueids=yes

     

# defaults for subsequent connection descriptions 
# (these defaults will soon go away) 
conn %default
    keyingtries=0 
    disablearrivalcheck=no 
    authby=rsasig 
    leftrsasigkey=%dnsondemand 
    rightrsasigkey=%dnsondemand
     

# connection description for opportunistic encryption 
# (requires KEY record in your DNS reverse map; see doc/opportunism.howto) 
conn me-to-anyone
    left=%defaultroute 
    right=%opportunistic 
    keylife=1h 
    rekey=no 
    # for initiator only OE, uncomment and uncomment this 
    # after putting your key in your forward map 
    #leftid=@myhostname.example.com 
    # uncomment this next line to enable it 
    #auto=route

     
# sample VPN connection 
conn sample
    # Left security gateway, subnet behind it, next hop toward right. 
    left=10.0.0.1 
    leftsubnet=172.16.0.0/24 
    leftnexthop=10.22.33.44 
    # Right security gateway, subnet behind it, next hop toward left. 
    right=10.12.12.1 
    rightsubnet=192.168.0.0/24 
    rightnexthop=10.101.102.103 
    # To authorize this connection, but not actually start it, at startup, 
    # uncomment this. 
    #auto=add

Comente as seguintes linhas, pois elas não serão necessárias em nossa configuração:

#conn me-to-anyone 
# left=%defaultroute 
# right=%opportunistic 
# keylife=1h 
# rekey=no 

A parte a seguir, é a que está toda a configuração da vpn:

conn sample

    # Left security gateway, subnet behind it, next hop toward right. 
    left=10.0.0.1 
    leftsubnet=172.16.0.0/24 
    leftnexthop=10.22.33.44 
    # Right security gateway, subnet behind it, next hop toward left. 
    right=10.12.12.1 
    rightsubnet=192.168.0.0/24 
    rightnexthop=10.101.102.103 
    # To authorize this connection, but not actually start it, at startup, 
    # uncomment this. 
    #auto=add

Veja a descrição de cada opção:

conn sample --> Nome da nossa vpn, no meu caso eu mudei esse nome para matriz-filial, se você quiser, pode colocar outro nome qualquer.
type=tunnel --> Acrescente esta parte, pois ela é que diz qual o tipo de vpn que vamos usar é do tipo túnel.
left=10.0.0.1 --> Aqui você tem que colocar o número ip da interface da conexão com a internet, no meu caso o ip do modem adsl.
leftsubnet=172.16.0.0/24 --> Aqui você coloca a classe de ips de sua rede interna. no meu caso 192.168.0.0/24.
leftnexthop=10.22.33.44 --> Substitua este valor pelo seu gateway, no meu caso o gateway do meu modem adsl.
leftrsasigkey= --> Acrescente esta parte e coloque aqui o valor da publickey do ipsec.secrets.
right=10.12.12.1 --> A mesma coisa que o left, só que agora é o ip do outro lado da vpn, ou seja o da filial.
rightsubnet=192.168.0.0/24 --> Substitua pela rede interna da filial. Lembrando que as redes internas têm que ser diferentes.
rightnexthop=10.101.102.103 --> Coloque aqui o gateway da filial.
rightrsasigkey= --> Coloque aqui o valor do publickey, do ipsec.secrets da outra maquina vpn, ou seja o da filial.
#auto=add --> Descomente esta linha e substitua o valor "add" por "start", que quer dizer que a vpn será iniciada automaticamente.

Agora veja o meu ipsec.conf depois de configurado:

# /etc/ipsec.conf - FreeS/WAN IPsec configuration file

# More elaborate and more varied sample configurations can be found
# in FreeS/WAN's doc/examples file, and in the HTML documentation.



# basic configuration config setup
  



    # THIS SETTING MUST BE CORRECT or almost nothing will work;
    # %defaultroute is okay for most simple cases. 
    interfaces=%defaultroute 
    # Debug-logging controls: "none" for (almost) none, "all" for lots.
    klipsdebug=none 
    plutodebug=none
    # Use auto= parameters in conn descriptions to control startup actions.
    plutoload=%search 
    plutostart=%search
    # Close down old connection when new one using same ID shows up.
    uniqueids=yes
    


# defaults for subsequent connection descriptions
# (these defaults will soon go away) 
conn %default
    keyingtries=0
    disablearrivalcheck=no
    authby=rsasig 
    leftrsasigkey=%dnsondemand
    rightrsasigkey=%dnsondemand
     

# connection description for opportunistic encryption
# (requires KEY record in your DNS reverse map; see doc/opportunism.howto)
#conn me-to-anyone
#    left=%defaultroute
#    right=%opportunistic
#    keylife=1h 
#    rekey=no 
    # for initiator only OE, uncomment and uncomment this
    # after putting your key in your forward map 
    #leftid=@myhostname.example.com  
    # uncomment this next line to enable it
    #auto=route


# sample VPN connection conn matriz-filial
    type=tunnel 
    # Left security gateway, subnet behind it, next hop toward right. 
    left=200.155.78.176 
    leftsubnet=192.168.0.0/24 
    leftnexthop=200.155.78.65
    leftrsasigkey=0sAQNXgnThrS2JStFsNGT77i8ydiAK0sgMgdkLcuQPJUDZchfjOtKUOz..... 
    # Right security gateway, subnet behind it, next hop toward left. 
    right=200.172.166.77 
    rightsubnet=192.168.1.0/24 
    rightnexthop=200.172.166.65 
    rightrsasigkey=0sAQN42m8LhQqTDYBpq4g82HuQFkVOFPL/pbOqkoEobhML6q6Ead....
    # To authorize this connection, but not actually start it, at startup, 
    # uncomment this. 
    auto=start

Agora que você configurou o ipsec.conf copie-o para o outro lado da vpn, pois o ipsec.conf de ambos os lados tem que ser iguais.

Agora que a sua freeswan está configurada, vamos aos passos finais:

Verifique se o repasse de pacotes ip_forward está ativado, mais como provavelmente você está configurando esta vpn no seu gateway, então esta opção já deve estar habilitada:

chmod +x /etc/rc.d/rc.ip_forward

No slackware 9.1 o patrick criou um rc.ip_forward, então é só dar permissão de execução, se você estiver usando o slackware 9.0, veja o arquivo /etc/rc.d/rc.inet2, mais ou menos na linha 57, e verifique se a linha IP_FORWARD está com a opção 1, se não estiver mude o valor pra 1. ex:

IPV4_FORWARD=1

Salve o arquivo e pronto, quando você reiniciar a maquina o repasse de pacotes estará ativado.

Também é necessário que o rp_filter esteja desabilitado, no slackware ele é desabilitado por padrão.

Também verifique as suas regras de iptables, pois o masquerade tem que ter uma pequena modificação:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -d \! 192.168.1.0/24 -j MASQUERADE

A regra acima faz o mascaramento da rede 192.168.0.0 que for sair pela interface eth0 para qualquer destino, menos para a rede 192.168.1.0, isso é nescessário para que não ocorram problemas. Também não esqueça de verificar a porta 500 e a 50, tanto udp quando tcp, elas tem que estar abertas para não barrar o trafégo da vpn, isso se você estiver usando firewall é claro.

Renomeie o script de inicialização, para poder seguir o padrão do slackware :)

mv /etc/rc.d/ipsec /etc/rc.d/rc.ipsec

coloque ele pra inicializar no rc.local

echo "/etc/rc.d/rc.ipsec --start" >> /etc/rc.d/rc.local

Agora que está tudo configurado, vamos restartar a maquina e dar boot pelo novo kernel, quando ela reiniciar, vai mostrar as seguintes linhas antes do login:

ipsec_setup: Starting FreeS/WAN IPsec super-freeswan-1.99.8...
ipsec_setup: Using /lib/modules/2.4.21/kernel/net/ipsec/ipsec.o 

Veja tambem dando um dmesg:

klips_info:ipsec_init: KLIPS startup, FreeS/WAN IPSec version: super-freeswan-1.99.8
klips_info:ipsec_alg_init: KLIPS alg v=0.8.1-0 (EALG_MAX=255, AALG_MAX=15)
klips_info:ipsec_alg_init: calling ipsec_alg_static_init() 

Para verificar se as interfaces do freeswan estão ativadas, digite o comando route -n, o resultado deverá ser semelhante a:

root@slack:~# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
200.155.78.64   0.0.0.0         255.255.255.192 U     0      0        0 eth0
200.155.78.64   0.0.0.0         255.255.255.192 U     0      0        0 ipsec0
192.168.1.0     200.155.78.65   255.255.255.0   UG    0      0        0 ipsec0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         200.155.78.65   0.0.0.0         UG    0      0        0 eth0 

Pronto, agora a primeira maquina da vpn está configurada, siga os mesmos passos para instalar o freeswan na outra maquina que será o outro ponto da vpn, ou seja a filial. com exceção do ipsec.conf, que deve ser o mesmo em ambas as maquinas.

Depois de ter feito isso tudo agora vamos aos testes:

De uma maquina da rede interna da matriz, dê um ping para uma maquina interna da filial o resultado deverá ser semelhante á:

root@slack:~# ping 192.168.1.10 
PING 192.168.1.10 (192.168.1.10): 56 data bytes
64 bytes from 192.168.1.10: icmp_seq=0 ttl=64 time=0.2 ms
64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.1 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.1 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=64 time=0.1 ms
64 bytes from 192.168.1.10: icmp_seq=4 ttl=64 time=0.1 ms 

Pronto a conexão da vpn entra a matriz e filial já está ativada. Agora para que as maquinas de ambos os lados fiquem visíveis no ambiente de rede do $windows, é necessário ter um servidor wins, que será responsável por este trabalho.

O servidor wins pode ser tanto um samba como um windows NT ou 2000 server, bastando apenas configurá-lo, não irei entrar em detalhes como fazer isso no Windows, até mesmo por que não sei :~, então procure uma documentação referente ao assunto. Mas se você for fazer em um servidor samba, basta apenas fazer algumas mudanças no seu /etc/samba/smb.conf, depois de tê-lo configurado para ser PDC é claro:

hosts allow = 192.168.0. 192.168.1. 127.

wins support = yes

Assim você está liberando na parte hosts allow, as duas redes, e na parte wins support você está dizendo que o seu samba irá atuar como um servidor wins.

Depois de ter feita estas alterações, crie no mesmo diretório do smb.conf, ou seja no /etc/samba, um arquivo chamado lmhosts, e acrescente os ips e nomes das máquinas maquinas de ambas as redes internas, seque abaixo um exemplo de lmhosts:

192.168.0.1    rodrigo
192.168.0.2    guilherme
192.168.0.3    joao
162.168.1.1    renato
192.168.1.2    allison
192.168.1.3    fernando 

Salve este arquivo e restarte o seu samba.

Depois de ter o servidor wins configurado, aguarde alguns minutos, e veja no ambiente de rede, que as maquinas de ambos os lados da vpn deverão estar aparecendo.

Nos nossos testes somente as maquinas da rede interna da matriz pingam as maquinas internas da filial e vice-versa. Pois a conexão vpn foi estabelecida entre essas duas redes.

Espero ter ajudado e boa sorte.

Cláudio Borges

claudio[at]linuxti.pro.br
www.linuxti.pro.br