VPN ipsec roadwarrior - Racoon

In questo infobox verra' illustrato come configurare una vpn roadwarrior utilizzando l'implementazione nativa dello stack ipsec nel kernel Linux ed il demone IKE Racoon.    
Con il termine roadwarior si indica una situazione particolare di VPN, dove ad un estremo del tunnel si abbiano client con un indirizzo IP dinamico, e quindi non noto a priori.      
In particolare l'esempio riportato riguarda la configurazione di una vpn dal mio pc di casa verso un terminatore vpn basato su openswan, la cui configurazione non verra' trattata in questo infobox.      
Sono consapevole che la configurazione proposta sia comunque ampiamente migliorabile, l'intenzione e' solo quella di condividere senza voler spacciae nulla per soluzione definitiva.    
Ovviamente le chiavi e gli indirizzi IP utilizzati  sono state cambiate rispetto alla configurazione reale attualmente in uso.    

In particolare i dettagli della parametri utilizzati per la configurazione sono i seguenti:    

- Indirizzo IP locale: 192.168.1.101    
- Indirizzo IP Gateway remoto: 217.39.121.37    
- Encryption domain lcale: 172.16.108.88/32    
- Encryption domain remoto: 10.0.0.0/8    
- Metodo autenticazione: chiave RSA    
- Parametri Fase 1 IKE    
    Algoritmo cifratura: 3DES    
    Algoritmo hashing: MD5    
    Diffie Hellman Group: Group 5 (modp 1536)    
- Parametri Fase 2 IKE    
    Algoritmo cifratura: 3DES    
   Algoritmo hashing: MD5    
           
Utilizzando il supporto nativo del kernel per ipsec non e' necessario applicare  patch o compilare alcun modulo, ma e' sufficiente installare i pacchetti racoon ed ipsec-tools:    

apt-get install ipsec-tools racoon    

Il file di configurazione principale e' /etc/racoon/racoon.conf dove andranno definiti i diversi parametri della vpn e le direttive per il demone IKE:    

path certificate: la directory dove racoon dovra' cercare i certificati o le chiavi rsa utilizzate per l'autenticazione    
path pre_shared_key: specifica il file dove sono definite le preshared key utilizzate per le diverse vpn. Non utilizzando una preshared key per la vpn in oggetto ometteremo questa direttiva.    
  
path certificate "/etc/racoon";    
    
listen: specifica le porte sulle quali racoon dovra' stare in ascolto. Poiche' per la mia macchina linux si trova dietro ad un router-firewall che esegue un source nat sui pacchetti provenienti dalla mia lan e' importante specificare che racoon stia in ascolto anche sulla porta 4500 in modo che possa essere utilizzata per un eventuale nat-traversal. Le due keyword per indicare le porte su cui stare in ascolto sono isakmp ed isakmp_natt.      
Come si puo' notare dalle seguenti linee del file di configurazione oltre alle porte viene indicato anche l'indirizzo IP dove il demone dovra' stare in ascolto.    
Se non si specifica alcuna direttiva listen racoon stara' in ascolto su tutte le interfacce disponibili. Utilizzando pero' la funzionalita' di nat-traversal e' necessario specificare l'indirizzo sul quale saranno in ascolto le porte:    
  
listen {    
       isakmp 192.168.1.101 [500];    
       isakmp_natt 192.168.1.101 [4500];    
        }    
    
La direttiva remote specifica invece i parametri per la fase 1 IKE. Nel caso in oggetto e' stato indicato l'indirizzo IP pubblico del terminatore vpn al quale si desidera connettersi. Se anziche' un indirizzo si fosse specificato la keyword anonymous i parametri indicati sarebbero stati utilizzati da qualsiasi peer che non avesse match con altre direttive remote piu' specifiche.    
  
remote 217.39.121.37      
        {    
        exchange_mode main;    
        nat_traversal on;    
        my_identifier fqdn "stargazer.homelinux.org";    
        certificate_type plain_rsa "/etc/racoon/privkey.txt";    
        peers_certfile plain_rsa "/etc/racoon/peers.pub";    
        proposal      
                {    
                encryption_algorithm 3des;    
                hash_algorithm md5;    
                authentication_method rsasig;    
                dh_group 5;    
                }    
        }    
    
All'interno della direttiva remote sono state inserite. le seguenti opzioni:    

exchange_mode: definisce l'exchange mode per la fase 1 della negoziazione    
nat_traversal: abilita l'uso della funzionalita' NAT-Traversal. Essendo la mia macchina linux dietro ad un sistema che effettua un source nat dei pacchetti ho abilitato la direttiva in oggetto. In questo modo in presenza di nat i pacchetti per una data connessione possono essere incapsulati in pacchetti udp utilizzando la porta 4500.      
my_identifier: specifica il vpn identifier da inviare al terminatore remoto durante la fase uno della negoziazione. Possono essere utilizzati diversi identifier come ad esempio un indirizzo IP (ovviamente non nel mio caso avendo un ip dinamico), un fqdn od un indirizzo email. Disponendo di un fqdn registrato tramite un servizio di dns dinamico ho utilizzato quello come id.      
Se avessimo voluto utilizzare un indirizzo email sarebbe stato necessario specificare la linea my_identifier user_fqdn [email protected] .    
Naturalmente all'altro capo della vpn dovra' essere specificato il medesimo identifier per la nostra vpn.    
certificate_type: specifica il tipo di autenticazione se basata su un certificato x509 o una coppia di chiavi RSA. Nell'esempio e' stata utilizata l'autenticazione RSA, senza ricorrere ai certificati.    
La direttiva specifica inoltre il file dove e' presente la mia chiave privata (/etc/racoon/privkey.txt).    
La chiave rsa puo' essere generata con il seguente comando:    

plainrsa-gen -b 2048 > /etc/racoon/privkey.txt    

L'opzione -b specifica la lunghezza della chiave, mentre il redirect e' stato utilizzato per scrivere la chiave all'interno del file anziche' stamparlo a video.    
Ovviamente In caso l'autenticazione sia basata su una preshared key questa parte della configurazione  non dovrebbe essere necessaria.    

peers_certfile: specifica il file contenente la chiave pubblica del terminatore vpn, nel mio caso /etc/racoon/peers.pub, che e' cosi' costituito:    

: PUB 0sAQPXaEfwDo7nYwL7GLsq8EgN0UkhEGsQfGGHFs/DjTUjORFzsbDOJEFAeYu49GTjoslzNgMOq1VOAPEjZJKjrvHAx5M5XRM6N3HWmJhlQ8/FRgi6iwbyt+HrmONitb/CeKCyy7FbtF1pEYey208XZ+L9LgSmKcBl5x4BfIvJMss0yWWVd/9cq8q5I5zmckSsdGZa44oLpCyVoWylf5gCTu7zYUca6K2J2os5D7bnN1kMUAf6TwFt0b3G5KcKSXE2jb4ZCGshbgWT8O39Nfz0Wl7MNDtyoN6y+xuB5+MVOidWYzmK5RNbLM1UWP5nz3NFjJnpE9z6IWytWqJoPO/0rXiv    
    
La parte successiva alla stringa ": PUB" e' appunto la chiave RSA pubblica del terminatore vpn al quale ci si vuole connettere.    

proposal: definisce i parametri da utilizzare nella fase 1 della negoziazione, ovvero algoritmo di cifratura (encryption_algorithm), algoritmo di hashing (hash_algorithm), metodo di autenticazione (authentication_method) e l'IKE Diffie-Hellmann group (dh_group).    
Inoltre, utilizzando le chiavi rsa per l'autenticazione l'opzione authentication_method e' stata impostata come rsasig.    

Una seconda direttiva fondamentale per la configurazione della vpn e' sainfo che specifica invece i parametri per la fase 2 della negoziazione IKE. Anche in questo caso, come per la direttiva remote, e' possibile specificare il valore anonymous opure essere piu' specifici indicando gli indirizzi coinvolti.    
In particolare sono stati indicati i due encryption domain locale (172.16.108.88/32) e remoto (10.0.0.0/8).      
  
sainfo address 172.16.108.88/32 any address 10.0.0.0/8 any    
        {            
        encryption_algorithm 3des;    
        authentication_algorithm hmac_md5;    
        compression_algorithm deflate;    
        }    
    
Come per la parte di configurazione relativa alla fase uno, anche per la fase due sono stati specificati gli stessi algoritmi di cifratura ed autenticazione utilizzati per la fase due dal terminatore vpn.    

Ricapitolando, il file di configurazione /etc/racoon.conf e' il seguente:    
  
path certificate "/etc/racoon";    

listen {    
       isakmp 192.168.1.101 [500];    
       isakmp_natt 192.168.1.101 [4500];    
        }    

remote 217.39.121.37      
        {    
        exchange_mode main;    
        nat_traversal on;    
        my_identifier fqdn "stargazer.homelinux.org";    
        certificate_type plain_rsa "/etc/racoon/privkey.txt";    
        peers_certfile plain_rsa "/etc/racoon/peers.pub";    
        proposal      
                {    
                encryption_algorithm 3des;    
                hash_algorithm md5;    
                authentication_method rsasig;    
                dh_group 5;    
                }    
        }    

sainfo address 172.16.108.88/32 any address 10.0.0.0/8 any    
        {            
        encryption_algorithm 3des;    
        authentication_algorithm hmac_md5;    
        compression_algorithm deflate;    
        }    
    
A questo punto racoon puo' essere avviato con il comando /etc/init.d/racoon start oppure, in caso sia necessario fare un po' di debug con racon -F -f /etc/racoon.conf -dddd.      
L'opzione -f indica il file di configurazione di racoon, -F permette di eseguire il software in foreground, mentre -d definisce il livello di debug. Argomenti -d multipli consentono di incrementare il livello di debug.    
Trattandosi del primo avvio e' preferibile lanciare racoon in foreground poiche' e' molto probabile che si sia commesso qualche errore nei file di configurazione, ed in questo modo sara' possibile identificarlo con maggiore facilita'.    

Una volta avviato racoon, e' necessario caricare le policies relative alla vpn tramite il comando setkey.    
setkey legge i suoi comandi da un file di testo quando invocato con una linea di comando del tipo setkey -f file.conf.In particolare, nella configurazione proposta, le security association sono state definite nel file /etc/setkey.conf:    
  
#!/usr/sbin/setkey -f    
#    
# Flush SAD and SPD    
flush;    
spdflush;    
# Create policies for racoon    

spdadd 172.16.108.88/32 10.0.0.0/8 any -P out ipsec    
           esp/tunnel/192.168.1.101-217.39.121.37/require;    
spdadd 10.0.0.0/8 172.16.108.88/32 any -P in ipsec    
           esp/tunnel/217.39.121.37-192.168.1.101/require;    
    
Per semplificare il caricamento delle policy e' stata inserita la linea #!/usr/sbin/setkey -f in testa al file /etc/racoon/setkey.conf ed assegnato il permesso di esecuzione chmod u+x /etc/racoon/setkey.conf. In questo modo e' possibile effettuare il caricamento delle policy semplicemente dando il comando /etc/racoon/setkey.conf.    
Una volta caricate le policies dovrebbe essere sufficiente pingare un indirizzo IP dell'encryption domain remoto (ad esempio il 10.26.182.2) perche' venga instaurato il tunnel ipsec. Se tutto e' stato configurato correttamente la rete collegata al terminatore vpn remoto dovrebbe ora essere raggiungibile.    
In realta' e' necessaria ancora un'ultima operazione, dovuta al fatto che nella configurazione della vpn l'encryption domain locale corrisponde all'indirizzo IP 172.16.108.88 mentre l'indirizzo della mia macchina e' 192.168.1.101.      
Poiche' e' necessario che i pacchetti inviati dalla macchina abbiano un indirizzo IP sorgente corrispondente all'encryption domain locale deve essere creata una regola tramite iptables per effettuare un source nat dei pacchetti diretti alla rete 10.0.0.0/8 in modo che essi possano apparire come provenienti dal 172.16.108.88:    
  
iptables -t nat -A POSTROUTING -d 10.0.0.0/8 -j SNAT --to-source 172.16.108.88    
    
Una volta testato il tutto e verificato che funzioni correttamente si puo' utilizzare uno shellscript come il seguente che provveda ad avviare racoon, caricare le policies ed effettuare il source nat dei pacchetti:    
  
#!/bin/bash    
/etc/init.d/racoon start    
iptables -t nat -F    
iptables -t nat -A POSTROUTING -d 10.0.0.0/8 -j SNAT --to-source 172.16.108.88    
/etc/racoon/setkey.conf    

Privacy Policy