rete privata virtuale (openvpn)

Installa il server openvpn con le seguenti caratteristiche:

 * nostri script di costruzione automatica configurazioni partendo da
 un file lineare di definizioni
 * definizioni standardizzate delle connessioni
 * logs su files separati in /var/log/openvpn
 * job di rotazione periodica dei logs (script di logrotate)

== configurazione ==
=== configurazione, config (master file) ===
Nella directory /etc/openvpn devono esistere due files
il primo di nome '''config''', con i parametri principali
in comune con tutte le vpn, il secondo di nome '''remotes'''
con l'elenco delle singole vpn e relativi parametri.

Il file '''config''', detto anche ''master file'', ha un
contenuto simile a questo:
{{{
BASEPORT="20000"
MYNODE="201"
NETBASE="10.14"
#CIPHER="none"
COMP="yes"
}}}

 * BASEPORT: numero di partenza (base) utilizzato per assegnare, ad
 ogni singola vpn in ascolto (listen) un numero univoco, ottenuto
 aggiungendo a BASEPORT il numero dell'interfaccia tun della vpn

 * MYNODE: numero di questo nodo nel network di vpn, praticamente
 il numero della vpn, deve essere univoco all'interno del network
 delle vpn gestite con questo sistema; viene usato per definire
 in modo omonimo l'interfaccia tunnel (esempio, mynode=1 -> tun1)

 * NETBASE: base (primi due bytes) del network usato da questo nodo
 per la definizione delle connessioni p2p nelle tunnel; nell'esempio
 riportato sopra, ciascuna interfaccia tun di ogni vpn avra` come
 indirizzo della p2p da questo lato 10.14.201.XX (dove XX e` il numero
 del nodo remoto); in modo speculare, sul nodo remoto l'indirizzo
 di questa vpn sara` 10.14.XX.201

 * CIPHER: algoritmo usato per la cifratura delle vpn, vedere il
 man di openvpn per dettagli, il default e` BF-CBC, usare '''none'''
 per disabilitarlo (non consigliato, come si vede nell'esempio la
 definizione e` commentata)

 * COMP: compressione di default (lzo), accetta "yes" o "no", se
 impostata a "no" si puo` attivare sulla singola vpn passando tra
 i parametri '''comp'''

=== configurazione, remotes ===

Il file '''remotes''' contiene l'elenco delle vpn da gestire, una
per ogni riga. Il formato delle righe e` posizionale, questo e` un
esempio di riga con relativo nome del parametro nel commento:
{{{
#NN nome     base  remote  key                 parms
#-- -------- ----- ------- ------------------- ------------------------
210 example  10.64 -       klabs-example.key   route,10.60.31.0/24 log
}}}

 * NN: numero della vpn, nel caso di interfaccia tunnel (il default)
 diventa anche il numero dell'interfaccia stessa, deve essere univoco
 e deve corrispondere al parametro MYNODE sulla macchina remota

 * nome: il nome della connessione, a piacere, univoco, da questo
 viene generato il file di configurazione di openvpn '''nome.conf''',
 nome che viene usato dagli script di openvpn per identificare la
 vpn stessa, ad esempio nelle operazioni di start stop (invoke-rc.d
 openvpn start nome1 nome2 ...)

 * base: il network base utilizzato sulla macchina remota per
 costruire l'indirizzo dell'endpoint p2p; in un network privato ed
 omogeneo questo numero e` identico a quello indicato da NETBASE
 nel file ''config'', ma puo` essere differente se ci si sta
 connettendo ad una macchina di un network esterno a quello aziendale;
 in ogni caso deve corrispondere al parametro MYNODE come definito
 sulla macchina remota

 * remote: nel caso sia definito, il nome o l'indirizzo della macchina
 al quale deve connettersi questa vpn, in questo caso la vpn e` di tipo
 client (si connette ad un ''server'' remoto); se invece non e` definito
 (utilizzare il carattere "-" per indicare che il parametro e` vuoto)
 allora questa vpn si comporta da server, ovvero aspetta una connessione
 dal nodo remoto; ovviamente in una vpn si dovra` avere obbligatoriamente
 un nodo client ed uno server; sulla stessa macchina vpn di entrambi i
 tipi possono coesistere senza problemi

 * key: il nome del file contentente la chiave di criptazione della vpn,
 generata con il comando
 {{{
 openvpn --genkey --secret nomefile.key
 }}}
 questo file deve essere presente in copia su entrambe le macchine dove
 e` attiva la vpn, e dovrebbe essere differente per ciascuna vpn

 * parms: parametri aggiuntivi, per definire alcuni aspetti della vpn
 e del comportamento una volta attivata; ogni parametro e` separato dagli
 altri da uno spazio, e ciascuno di loro puo` avere argomenti, che sono
 separati tra loro e dal parametro vero e proprio dalla virgola:

  * route,ROUTE: aggiunge a questa vpn il routing indicato; ROUTE deve
  essere descritto in notazione CIDR (esempi validi: 10.10.1.0/24,
  10.10.1.0/255.255.255.0)

  * log: indica che openvpn scrivera` un logfile sotto /var/log/openvpn
  con il nome della vpn seguito da .log; normalmene questo parametro e`
  sempre presente, a meno che non vi sia necessita` di lanciare il daemon
  openvpn a mano, ad esempio per questioni di debug, ed avre l'output su
  standard error

  * up,FILE down,FILE ipchange,FILE: ciascuno di questi tre parametri
  definisce FILE come nome dello script da eseguire quando l'interfaccia
  entra, rispettivamente, nello stato up, down o di cambiamento dell'indirizzo
  (nel caso di vpn con ip dinamici)

  * cipher,NOME: forza su questa vpn l'algoritmo NOME per la cifratura

  * udp: forza la vpn ad utilizzare udp, se non indicati il default e` tcp

  * tap: forza la vpn ad utilizzare un'interfaccia ''tap'' invede del default
  che e` ''tun''

  * ipv6: la vpn lavora su indirizzi ipv6 invece che ipv4 (vedi dopo); implica
  automaticamente l'attivazione dei parametri ''udp'' e ''tap''

  * freenet6: la vpn utilizza indirizzi ipv6 ottenuti tramite servizio Freenet6,
  implica automaticamente l'attivazione del perametro ''ipv6'' e conseguenti


== configurazione ipv6 ==

Le vpn che utilizzano ipv6 hanno alcune limitazioni, che infatti sono
gestite attivando automaticamente una serie di parametri:

 * possono usare solo interfacce tap
 * possono usare solo protocollo udp (udp6)

Inoltre le device tap non sono tunnel point-to-point come le ''tun'', ma
bridge, quindi sul lato server, a parita` di indirizzo locale, tutte le vpn
client che si connettono a questo indirizzo utilizzeranno la stessa vpn, e
di conseguenza, la stessa chiave di autenticazione e cifratura.

Per questo motivo i parametri sulla riga di definizione sono gli stessi, ma
alcuni sono ignorati perche` non pertinenti; questo e` un esempio della
definizione lato server:

{{{
#NN nome     base  remote  key             parms
  - i6test   -	   -       klabs-test.key  freenet6 log
}}}

Il numero e` ignorato, il nome rimane, non c'e` il base address, in
questo caso non c'e` remote perche` e` il server, rimane il nome del
keyfile, e tra i parametri e` indicato ''freenet6''

Questo e` l'esempio della corrispondente definizione sul lato client:

{{{
#NN nome     base  remote  key             parms
  - i6test   -	   klabs   klabs-test.key  freenet6 log
}}}
essenzialmente identico, tranne per parametro remote, che e` il nome
dns della macchina server; nel caso di freenet6 il nome viene espanso
automaticamente aggiungendo il dominio ''broker.freenet6.net''.

Se si utilizza ipv6 (generico, invece che freenet6), allora il nome
dev'essere completo di eventuale dominio se serve, e deve risolvere
obbligatoriamente con un indirizzo ipv6; e` sempre possibile usare
direttamente un indirizzo ipv6 come nome del server remoto.

== aggiornamento delle configurazioni ==

Una volta impostati correttamente i dati nei file files ''config''
e ''remotes'', lanciare il comando ''make'' per ricreare i files di
configurazione, o in alternativa lanciare manualmente lo script di
generazione:
{{{
./makeconf.sh
}}}

e poi far ripartire le vpn:
{{{
invoke-rc.d openvpn restart
}}}

Lo script cancella e ricrea i files .conf relativi alle vpn indicate
nel file ''remotes''. E` possibile avere config files creati a mano,
a patto ovviamente che questi non vadano in conflitto, come nome o
definizioni, con quelli creati da makeconf.sh.

Nel caso abbiate la pensata di creare un file manualmente copiando
e modificando uno di quelli creati da makeconf.sh, ricordatevi di
cancellare le righe di commento con la stringa AUTO-GENERATED-FILE,
in caso contrario al primo lancio di makeconf.sh anche la vostra
copia verra` cancellata.


== diagnostica ==

Openvpn scrive i logfiles sotto la directory /var/log/openvpn.

E` possibile lanciare manualmente openvpn, indicando un livello
di verbosity maggiore dello standard, per tracciare eventuali
problemi; in questo caso si puo` utilizzare lo script ''opvpn''
presente nella directory /etc/openvpn, quando la vpn e` ferma,
ovviamente, ad esempio:
{{{
invoke-rc.d openvpn stop NOME
./opvpn NOME
}}}
dove nome e` il nome di una vpn (e corrisponde ad un file NOME.conf).

Lo script opvpn rimuove temporaneamente il parametro ''log'' dal
conf file, e lancia openvpn senza attivare la modalita` daemon,
quindi l'output viene emesso su standard error e per terminare
la vpn occorre premere Ctrl-C (o il tasto di interrupt se definito
diversamente da Ctrl-C).

Il comando
{{{
netstat -taunp | grep openvpn
}}}
lanciato da utente ''root'' permette di vedere le connessioni
vpn attive o in ascolto.

Le vpn sono configurate per tentare una connessione ogni 30 secondi,
nel caso questa fallisca ad ogni tentativo, controllate che la
porta di destinazione sia aperta sul firewall che protegge il server.

